MyBatis笔记:xml配置文件
xml配置文件指的是MyBatis的核心配置文件,包括数据库连接信息、mapper映射器、别名配置等,本文只是简单记了一点学习笔记,想要了解更多,可以参考MyBatis中文文档 https://mybatis.org/mybatis-3/zh/configuration.html
基本使用
可以根据官网介绍新建一个基础的xml文件,然后根据自己的需要配置指定项即可,文件名可以自定义,文件位置也可以自己指定,只需要在 SqlSessionFactoryBuilder
的 build
中传入进行使用即可。
// mybatis_config.xml就是我自定义的配置文件,并放在src/main/resources目录下,
// 因为是在maven项目中,所以maven会自动到src/main/resources下寻找对应的文件
String resource = "mybatis_config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
注: mybatis中的配置项是有先后顺序的,不能随意配置,配置的先后顺序为 properties > settings > typeAliases > typeHandlers > objectFactory > objectWrapperFactory > reflectorFactory > plugins > environments > databaseIdProvider > mappers
,如果没有该配置项,则可以跳过。在IDEA中如果配置错了顺序,它会提示你正确的顺序的。
引用properties文件
可以将一些配置项(如数据库连接信息)单独配置在properties文件中,然后在xml配置文件中使用 properties
标签将properties文件的内容引入到xml配置文件中,properties文件中的配置项以 ${config_name}
的方式进行引用。 properties
标签下也可以定义 property
子标签,用于单独配置属性。
例如:在 src/main/resources
下新建一个db.properties文件配置数据库连接信息。
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
password=123456
然后在mybatis配置文件中进行引用。
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="db.properties">
<!-- 单独配置属性 -->
<property name="username" value="root"/>
</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>
</configuration>
日志插件配置
在配置项 settings > setting
中进行配置即可,name属性指定为logImpl(固定值),value属性值可以指定自己想要的日志插件,根据官方文档介绍,可以选择这几种 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
。例如配置日志插件为 STDOUT_LOGGING
:
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
配置和使用LOG4J
第一步:需要在MyBatis配置文件中的settings配置当前使用的日志插件为log4j。
<configuration>
<settings>
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
第二步:log4j是需要额外导入的,需要在pom.xml配置对应的依赖。
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
第三步:在resources目录(或CLASSPATH)下新建一个log4j.properties文件(文件名是固定的),这个文件是为了配置怎么使用log4j的。以下是简单配置示例,可以到网上搜索更多配置项:
# 日志输出的级别为DEBUG,将日志内容输出到console和file,console和file需要再下面继续进行配置
log4j.rootLogger=DEBUG,console,file
# console相关配置
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
# file相关配置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = ./log/mb.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
第四步:在java文件中使用log4j打印日志。
package com.mb.dao;
import org.apache.log4j.Logger;
import org.junit.Test;
public class UserDaoTest {
// 传入当前类的class,得到一个Logger对象
static Logger logger = Logger.getLogger(UserDaoTest.class);
@Test
public void testLog4j() {
logger.debug("This is debug log.");
logger.info("This is info log.");
logger.warn("This is warn log.");
logger.error("This is error log.");
}
}
为实体类配置别名
在mapper.xml映射文件中引用实体类时,每次都需要输入实体类的完整路径,如果使用到地方比较多的话,可以为对应实体类的路径配置别名。可以在mybatis配置文件中使用 typeAliases
标签为实体类配置别名,配置方式有两种,一种是直接在mybatis配置文件中指定别名,另一种是在mybatis配置文件中指定包名,指定包名后,mybatis可以直接在包中寻找对应的实体类。
直接指定别名
配置别名后直接在对应mapper.xml映射文件中使用别名即可。
mybatis配置文件
<configuration>
<properties resource="db.properties"/>
<typeAliases>
<!-- 直接为某个具体的实体类指定别名 -->
<typeAlias type="com.mb.pojo.User" alias="User"/>
</typeAliases>
<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>
<mappers>
<!-- 配置对应的mapper.xml映射文件 -->
<mapper resource="com/mb/dao/UserMapper.xml" />
</mappers>
</configuration>
UserMapper.xml文件
<mapper namespace="com.mb.dao.UserMapper">
<!-- resultType的值使用的就是配置后的别名 -->
<select id="getUserList" resultType="User">
select * from mybatis.user;
</select>
</mapper>
指定包路径
指定了包路径后,mybatis可以直接扫描该包下的所有实体类,然后自动为该类指定别名为类的首字母小写形式。如果不想使用它默认的别名方式,可以在实体类上使用注解进行自定义。
mybatis配置文件
<configuration>
<properties resource="db.properties"/>
<typeAliases>
<!-- 指定包路径,默认别名为类的首字母小写形式 -->
<package name="com.mb.pojo"/>
</typeAliases>
<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>
<mappers>
<!-- 配置对应的mapper.xml映射文件 -->
<mapper resource="com/mb/dao/UserMapper.xml" />
</mappers>
</configuration>
mapper.xml文件
<mapper namespace="com.mb.dao.UserMapper">
<!-- resultType的值使用的就是类名首字母小写形式的别名 -->
<select id="getUserList" resultType="user">
select * from mybatis.user;
</select>
</mapper>
通过在实体类上使用注解自定义别名
package com.mb.pojo;
import org.apache.ibatis.type.Alias;
// 通过注解的方式配置别名
@Alias("common_user")
// 实体类
public class User {}
默认别名
除了自定义别名之外,mybatis还有一些默认的别名可以直接使用,具体见 https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases
别名 | 映射的类型 |
---|---|
_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 |
映射器mappers
映射器即 mappers
配置项,作用就是将mapper.xml映射文件和操作实体类的接口对应起来,让接口中的方法时可以与mapper.xml映射文件中的SQL关联起来,配置方式有三种:配置xml文件路径、配置接口路径和配置包路径。
配置xml文件路径
这种方式需要直接配置xml的文件路径,定义xml时也可以不用放在src/main/java下,可以在src/main/resources新建一个相同的“包”路径即可,maven编译时会自动将相同目录的文件放到一起的。
注:自己练习的时候发现IDEA中需要将左边栏上的 compact Middle Packages
自动合并中间目录的选项去掉才行,否则在最后编译的target/classes下的目录会对不上,会将合并的目录当成一个目录来创建。
<configuration>
<mappers>
<!-- 路径分隔符为斜杠 -->
<mapper resource="com/mb/dao/UserMapper.xml" />
</mappers>
</configuration>
配置接口路径
配置接口路径的方式需要注意:mapper.xml需要和接口同名,且在同一包下。
<configuration>
<mappers>
<mapper class="com.mb.dao.UserMapper"/>
</mappers>
</configuration>
配置包路径
配置包路径和配置接口路径一样:mapper.xml需要和接口同名,且在同一包下。
<configuration>
<mappers>
<package name="com.mb.dao"/>
</mappers>
</configuration>