4.配置解析
4.1 核心配置文件
-
mybatis-config.xml个元素的使用
-
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
4.2 环境配置environments
- MyBatis 可以配置成适应多种环境
- 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
- environments 元素定义了如何配置环境。
<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>
- 默认使用的环境 ID(比如:default=“development”)。
- 每个 environment 元素定义的环境 ID(比如:id=“development”)。
- 事务管理器的配置(比如:type=“JDBC”)。
- 数据源的配置(比如:type=“POOLED”)。
4.3 事务管理器(transactionManager)
- MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”)
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器(EJB)来管理事务的整个生命周期, 默认情况下它spring会关闭连接。然而一些容器并(EJB)不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:
4.4 数据源(dataSource)
- dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
- 有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”):
- 默认是使用了POOLED连接池。
- jndi是供EJB使用的
4.5 属性(properties)
- 可以通过properties属性来实现引用配置文件
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
- 这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】
- 编写配置文件db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username=root
password123456
-
在核心配置文件中引入。
-
引入时各属性存在顺序
The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)
- 引入方式1:优先使用外部配置方式
<!--引入外部配置文件-->
<properties resource="db.properties">
</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>
- 引入方式2:
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="123123"/>
</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>
4.6 类型别名(typeAliases)
-
类型别名可为 Java 类型设置一个缩写名字。
-
它仅用于 XML 配置,意在降低冗余的全限定类名书写。
-
方式一:可以给实体类起别名
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.zk.pojo.User" alias="user"/>
</typeAliases>
- 方式二:也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
<typeAliases>
<package name="com.zk.pojo"/>
</typeAliases>
- 每一个在包
domain.blog
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 - 若有注解,则别名为其注解值。见下面的例子:
@Alias("author")
public class Author {
...
}
在实体类少的时候用第一种
在实体类多的时候用第二种
第一种可以自定义别名,第二种需要通过注解的方式定义别名
优先级:类型别名 > 注解别名 > 包别名
- 常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
- 基本类型为_int,包装类型为int
4.7 设置(settings)
- 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
- 一个配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 false
useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 false
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库oracle列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 oracle数据库字段都会转大写可读性差,所以才加xxx_xxx False
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 未设置
4.8 其他配置
MyBatis Plus简化MyBatis
MyBatis Generator Core
Mybatis_PageHelper
4.9 映射器(mappers)
-
MapperRegistry:注册绑定mapper文件
-
方式1:使用相对于类路径的资源引用
<mappers>
<mapper resource="com/zk/dao/UserMapper.xml"/>
</mappers>
- 可以通配
<mapper resource="com/zk/dao/*.xml"/>
- 方式2:使用映射器接口实现类的完全限定类名,class类名
<mappers>
<mapper class="com.zk.dao.UserMapper"/>
</mappers>
- 方式2问题:
接口和他的mapper配置文件必须在同一个包下
接口和他的mapper配置文件必须同名
- 方式3:将包内的映射器接口实现全部注册为映射器。包扫描
<mappers>
<package name="com.zk.dao"/>
</mappers>
也存在方式2问题
接口和他的mapper配置文件必须在同一个包下
接口和他的mapper配置文件必须同名
4.10 作用域(Scope)和生命周期
-
不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题
-
SqlSessionFactoryBuilder:一旦创建了 SqlSessionFactory,就不再需要它了。
SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)
- SqlSessionFactory:可以视为数据库连接池,程序运行期间一直存在回收分配SqlSession
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次
因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
- SqlSession:数据库连接池连进去的一个请求,每个线程都应该有它自己的 SqlSession 实例。
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
SqlSession 放在一个和 HTTP 请求相似的作用域中,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。你应该把这个关闭操作放到 finally 块中
- 用完之后即刻关闭,否则资源被占用。
- 这里面的每个mapper视为一个具体的业务
本专栏下一篇:MyBatis元素resultMap介绍及使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123924.html