mybatis 配置
mybatis 配置
ruoxijun配置文件,日志,分页
核心配置文件解析与优化:
详情请看:官方配置文档
注意官方规定
mybatis-config.xml
文件中configuration
标签中的配置标签必须遵循如下顺序:
properties
→settings
→typeAliases
→typeHandlers
→objectFactory
→objectWrapperFactory
→reflectorFactory
→plugins
→environments
→databaseIdProvider
→mappers
1. 环境配置(environments):
从我们熟悉的 environments
标签入手,首先看一下官方提供的环境配置的模板:
1 | <environments default="development"> |
环境与配置:
environments
内配置环境可存在多个环境,一个environment
就是一个环境。environments
中的 default 值应为某个environment
环境的 id 值,它表示默认使用那一个环境。此外官方还提到:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
如果你连接多个数据库,就需要创建多个 SqlSessionFactory 实例。mybatis提供了以下4种方法创建SqlSessionFactory 实例:
1
2
3
4
5
6// 以下两种使用`environments`默认的环境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
// 以下两种可利用参2根据传入`environment`的id来确认使用某个环境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
事务管理:
transactionManager
有两种类型事务管理器即 type 的值有 JDBC 和 MANAGED 两个:- JDBC:直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED:几乎不用。mybatis自身不会去实现事务管理,让程序的容器来实现事务的管理。
- 官方提到使用 Spring + MyBatis,没有必要配置事务管理器可写成:
<transactionManager type="JDBC"/>
数据源:
dataSource
使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源:dataSource
属性 type 的值有3种其中默认 POOLED :利用“池”将 JDBC 连接对象组织起来,避免创建新的连接实例花费时间。 一般常用此属性,能使并发 Web 应用快速响应请求。property
:中name属性常配置的有4个:1.driver
JDBC 驱动的 Java 类全限定名,2.url
数据库的 JDBC URL 地址,3.username
登录数据库的用户名,4.password
登录数据库的密码。需要在 value 属性中赋予响应的值。
2. 属性(properties):
利用典型的 Java 属性文件(properties后缀)动态配置属性。在 resources
文件夹下新建文件 db.properties (文件名可自定义),文件中 = 号前为 key 后为 value:
1 | driver=com.mysql.cj.jdbc.Driver |
在 mybatis-config.xml 文件的configuration
标签中利用properties
标签引入属性文件:
1 | <properties resource="db.properties" /> |
此时就可以利用属性文件动态的替换属性值了,在需要引用的地方利用 ${key}
的方式动态替换。如官方提供的环境配置模板中数据库连接配置处正是使用了此种方式:
1 | <dataSource type="POOLED"> |
properties
除引入属性文件以外,还能在其内部利用property
标签定义键值对。
1 | <properties resource="db.properties"> |
当properties
中和属性文件内都定义了key相同的键值对时会发生什么,我们看一段官方的文档内容:
- 首先读取在 properties 元素体内指定的属性。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
由此可知标签内的键值对先被读取,再读取属性文件内的值。所以属性文件内的值会覆盖标签的定义值。
3.类型别名(typeAliases):
1 | <select id="getUsersList" resultType="io.github.ruoxijun.pojo.UserPojo"> |
如上在Mapper.xml中设置select的返回值类型时使用了resultType="io.github.ruoxijun.pojo.UserPojo"
完整路径类名的方式声明类型,项目中不止一个地方会用到这个全名。书写全名是比较繁琐的因此给它取别名是最好的选择。
- Mybatis-config.xml中
typeAlias
配置单个类型别名:
1 | <!-- typeAliases别名组标签 --> |
之后在需要使用此类型名的地方引用此别名即可,如上例可替换为:
1 | <select id="getUsersList" resultType="userPojo"> |
- Mybatis-config.xml中
package
配置包中所有类的类型别名:
1 | <package name="io.github.ruoxijun.pojo" /><!-- typeAliases标签内 --> |
此配置此包内的所有类都会自动取别名,且别名为忽视大小写的类名。官方推荐引用时采用类名首字母小写的方式引用。
- 使用注解取别名:
1 | // 为此类取别名为 user |
此三种方式可随意使用不冲突,同时使用时取的所有别名都可生效都可引用。
4. 映射器(mappers):
之前我们在mybatis-config.xml
的mapper中利用resource属性注册的Mapper.xml就是映射器。这只是注册映射器的方法之一:
1 | <mappers> |
- 使用映射器接口实现类的完全限定类名
1 | <mappers> |
注意:此方式要求Mapper接口和Mapper.xml的文件名必须同名且在同一个包下。
- 将包内的映射器接口实现全部注册为映射器
1 | <mappers> |
注意:此方式要求Mapper接口和Mapper.xml的文件名必须同名且在同一个包下。
resultMap 结果集映射:
之前我们写数据库表的对应字段类时要求,类中成员变量名与字段名要相同。这时我将第3个成员变量age
改为a
。运行查询表所有信息后a为的值全为0也就是没有赋值,可知Mybatis是根据字段名是否匹配来做操作的。
1.因此对于查表可以利用SQL查询语句给 字段取别名 方式来解决字段名不同的问题:
1 | <select id="getUserList" resultType="userPojo" > |
但这不是最好的方法,Mybatis有更好的方案来解决此类问题。
2. 在Mapper.xml中(mapper标签内)配置resultMap结果映射:
1 | <!-- id:此结果映射集的id |
使用时不能在使用resultType属性,该为resultMap属性值为自定义属性结果集的id:
1 | <select id="getUserList" resultMap="userMap" > |
没有自行配置resultMap之前Mybatis自动创建了一个默认的字段名与映射名相同的resultMap。这也是为什么之前我要求类的成员变量名与表的字段名对应的原因。、
日志:
settings 设置:
学习日志前先了解一下 Mybatis 核心配置文件中的 settings 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
settings 每一项 setting 标签就是一项设置,通过指定属性name
和value
的值来完成一项设置。其中包括日志的设置:
1 | <!-- MyBatis 中的调整设置 --> |
控制台日志(STDOUT_LOGGING):
上方对setting的设置指定使用了控制台日志,运行以后大致会输出以下日志内容:
1 | // 打开 JDBC 的连接 |
LOG4J 日志:
文件配置实现日志:
同在 settings 中配置使用 LOG4J:
<setting name="logImpl" value="LOG4J"/>
光设置还不能使用我们还需要导入LOG4J依赖,在pom.xml中导入log4j的包:
1
2
3
4
5
6<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>在properties中新建配置文件log4j.properties:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/runTime.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG现在就已经实现对Mybatis的日志打印了。
代码中简单使用LOG4J日志:
1 | // 获取日志对象(建议设置为类对象)需要当前类的class对象作为参数 |
查询数据分页:
1. SQL语句 limit 实现分页:
分页查询数据最简单最实用的方法就是在Mapper.xml中书写SQL语句时使用 limit 实现分页查询。
Mapper接口中定义分页查询方法:
1 | List<UserPojo> getUserLimit(Map<String,Object> map); |
Mapper.xml中书写SQL语句:
1 | <select id="getUserLimit" resultMap="userMap" parameterType="map"> |
使用(此处省略获取mapper实例等步骤):
1 | Map<String,Object> map = new HashMap<>(); |
2. 使用 RowBounds 对象方式(了解):
RowBounds只是逻辑上的分页,它是将SQL已经查询到的数据进行分页。
1 | // 构造函数参数与limit类似:参1表示数据开始位置角标,参2表示当前页的数据个数 |
3. MyBatis 分页插件 PageHelper :
- 添加依赖:
1 | <dependency> |
- mybatis配置文件中配置插件:
1 | <plugins> |
- 使用:
1 | // 参1:当前第几页,参2:每页的数据量(数据条数) |