4、配置解析
1、核心配置文件
-
mybatis-config.xml 系统核心配置文件
-
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
-
能配置的内容如下:
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器) <!-- 注意元素节点的顺序!顺序不对会报错 -->
2、环境配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
-
配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
-
子元素节点:environment
-
-
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
-
数据源是必须配置的。
-
有三种内建的数据源类型
type="[UNPOOLED|POOLED|JNDI]")
-
unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
-
pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
-
jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
-
数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等…
-
详情:点击查看官方文档
-
这两种事务管理器类型都不需要设置任何属性。
-
具体的一套环境,通过设置id进行区别,id保证唯一!
-
子元素节点:transactionManager - [ 事务管理器 ]
<!-- 语法 --> <transactionManager type="[ JDBC | MANAGED ]"/>
-
子元素节点:数据源(dataSource)
-
3、属性(properties)
可以通过properties属性来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的java文件【db.properties】中配置,也可在properties元素的子元素来传递。
其中db.properties文件:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bigdata?userSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
在核心配置文件直接中引入:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bigdata?userSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
- 可以直接引入外部文件
- 可以在其中增加一些属性配置
- 如果两个文件有同一个字段,优先使用外部配置文件
4、类型别名(typeAliases)
- 类型别名可为 Java 类型设置一个缩写名字。
- 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
给实体类起别名:
<typeAliases>
<!--<package name="com.kuber.pojo"/>-->
<typeAlias type="com.kuber.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,mybatis会在包名下面搜索需要的Java Bean(扫描这个实体类的包,它的默认别名就是这个类名,首字母小写(其实大小写都可以,直接用类名就行)):
<!--类型别名-->
<typeAliases>
<package name="com.kuber.pojo"/>
</typeAliases>
在实体类比较少的时候,使用第一种方式;
如果实体类十分多,则可使用第二种,我这里以后全部用第二种。
第一种可以diy别名,第二种不可以,如果使用第二种非要改,则需要在实体类上增加注解(注意:是基于第二种方法使用的!并且需要把注解扫描打开,我暂时还是使用第二种吧)
@Alias("nihaoa")
public class User {
}
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。(官方表格)
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
5、设置(settings)
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 |
true | false | false |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
6、其他配置(先做了解)
-
类型处理器(typeHandlers)
-
对象工厂(objectFactory)
-
插件(plugins)
- MyBatis Generator Core
- MyBatis Plus
- 通用mapper
7、映射器(mappers)
MapperRegistry
-
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
-
但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。
-
在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。
-
你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括
file:///
形式的 URL),或类名和包名等
方式一:我暂时都使用这种
<!--每一个mapper.xml都需要在mybatis核心配置文件中进行注册,进行映射-->
<mappers>
<mapper resource="com/kuber/dao/UserMapper.xml"/>
</mappers>
方式二:使用class文件绑定注册
<mappers>
<mapper class="com.kuber.dao.UserMapper"/>
</mappers>
注意:
- 接口和他的mapper.xml配置文件必须同名
- 接口和他的mapper.xml配置文件必须在同一个包下
方式三:使用扫描包进行注入绑定
<mappers>
<package name="com.kuber.dao"/>
</mappers>
注意:
- 接口和他的mapper.xml配置文件必须同名
- 接口和他的mapper.xml配置文件必须在同一个
8、生命周期
生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
- 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
- 局部变量
SqlSessionFactory:
- 说白了就是可以想象为:数据库连接池
- SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
- 因此SqlSessionFactory的最佳作用域是应用作用域。
- 最简单的就是使用单例模式及或者静态单例模式。
SqlSession:
-
连接到连接池的一个请求
-
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
-
这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。
-
用完之后需要赶紧关闭,否则资源被占用