Mybatis配置优化
1.核心配置文件结构
核心配置文件:mybatis-config.xml 官方建议起这个名字,但我们可以随意起名
-
configuration(配置)
-
properties(属性)
-
settings(设置)
-
typeAliases(类型别名)
-
typeHandlers(类型处理器)
-
objectFactory(对象工厂)
-
[plugins(插件)
-
environments(环境配置)
-
environment(环境变量)
-
transactionManager(事务管理器)
-
dataSource(数据源)
-
-
-
databaseIdProvider(数据库厂商标识)
-
mappers(映射器)
-
注意:配置文件时,标签的顺序不能改变,只能按照这个顺序进行配置
2.属性优化 (properties)
官方:这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
这句话的意思是:我们可以将一些参数(driver、url、username、password)放在properties配置文件中或者放在properties 的子标签中,从而不用在environment 中写死
-
配置文件
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf-8&useSSL=false username=root password=123456
<properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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>
-
子标签
<properties resource="db.properties"> <property name="username" value="root"/> <property name="password" value="123456"/> </properties>
问题:如果两种方式的参数重复了,怎么办,就像上面的例子,properties文件和子标签中都有username和password
这种情况存在优先级问题,配置文件优先级 > 子标签
3.environments 环境配置
官方:MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
-
在environments 标签中 可以有多个 environment 标签
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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> <environment id="test"> <transactionManager type="JDBC"/> <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>
通过 default属性来切换环境,default的值就是environment 的 id属性
-
environment 标签的 transactionManager 事务管理器
事务管理器有两种类型:JDBC 和 MANAGED
-
JDBC 这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域。
-
MANAGED 几乎没做什么,知道即可
-
-
environment 标签的 数据源(dataSource)
数据源有三种类型:
-
UNPOOLED 这个数据源的实现会每次请求时打开和关闭连接。没有连接池
-
POOLED 加入连接池,实现不用每次打开关闭连接
-
JNDI 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用
-
4.类型别名 (typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
之前我们在sql的xml文件中,resultType 要把完整的包名+类名写出来,十分冗余
<select id="getUsers" resultType="com.wang.pojo.User">
select * from jdbcstudy.users;
</select>
<insert id="insertUser" parameterType="com.wang.pojo.User">
insert into jdbcstudy.users(id,`NAME`,`PASSWORD`,email,birthday) values(#{id},#{name},#{password},#{email},#{date})
</insert>
我们可以使用typeAliases 标签来给这个类起别名,降低复杂度
有两种方式:
-
直接命名
<typeAliases> <typeAlias type="com.wang.pojo.User" alias="User"/> </typeAliases>
在sql的xml中,可以直接使用User
<select id="getUsers" resultType="User"> select * from jdbcstudy.users; </select> <insert id="insertUser" parameterType="User"> insert into jdbcstudy.users(id,`NAME`,`PASSWORD`,email,birthday) values(#{id},#{name},#{password},#{email},#{date}) </insert>
-
指定包名,在没有注解的情况下,会使用类的首字母小写作为它的别名。
<typeAliases> <package name="com.wang.pojo"/> </typeAliases>
在pojo 包下的所有实体类,都可以使用其首字母小写的类名作为别名
<select id="getUsers" resultType="user"> select * from jdbcstudy.users; </select>
当然,也可以为实体类添加注解,自定义别名
@Alias("hello") public class User {...}
<select id="getUsers" resultType="hello"> select * from jdbcstudy.users; </select>
在java的基本类型的别名中,八大基本类型的别名是 _ int 、_flout....
如果直接写int的话,代表的是包装类
5.设置 (settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
比较重要的是
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 |
true | false | false |
mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 | true | false | False |
6.映射器(mappers)
用来绑定 Mapper配置文件
方式一:使用相对于类路径的资源引用
<mappers>
<mapper resource="com/wang/Dao/UserDao.xml"/>
</mappers>
方式二:使用映射器接口实现类的类名
<mappers>
<mapper class="com.wang.Dao.UserDao"/>
</mappers>
注意点:
-
接口和它的mapper配置文件必须同名
-
接口和它的mapper配置文件必须在一个包下
方式三:通过扫描包,绑定mapper配置文件
<mappers>
<package name="com.wang.Dao"/>
</mappers>
注意点:
-
接口和它的mapper配置文件必须同名
-
接口和它的mapper配置文件必须在一个包下