Mybatis配置文件详解
在mabatis中有两个配置文件,一个是全局配置文件,它是指导Mybatis如何运行的(官方的名称是applicationContext.xml),另外一个配置文件时dao接口的实现文件(xxxmapper.xml),它是指导哪个接口中的哪个方法是如何运行的.
一、全局配置文件(mybatis-conf.xml)
1、properties配置:mybatis用来加载外部properties配置文件用的,mybatis与spring整合之后会采用spring的方式来加载配置文件,具体用法如下:
01、jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root
02、全局配置文件引入jdbc.properties配置文件
<configuration>
// 加载类路径下的jdbc.properties配置文件
<properties resource="jdbc.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
// jdbc.properties中的属性
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
2、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"/>
// 开启驼峰命名规则,默认值是false,当设置为true时,可以将数据库中 USER_NAME 的列名与实体类中的 userName 进行映射
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
3、typeAliases:类型别名
<typeAliases>
// 如果不注明alias的值,那么别名默认使用的就是类名,并且对大小写不敏感,Atuhor和author均可以
<typeAlias type="domain.blog.Author"/>
// 别名设置为Blog,那么在xxxMapper.xml中使用Blog等同于domain.blog.Blog
<typeAlias alias="Blog" type="domain.blog.Blog"/>
// com.mybatis.entity下面所有的类都支持类型别名,由于没有指明alias属性,所以User、user都可以
<package name="com.mybatis.entity"></package>
</typeAliases>
虽然支配各种方式来配置类型别名,但是还是建议在xxxMapper.xml中配置完整类名
<mapper namespace="com.mybatis.dao.UserMapper">
// 但是还是建议配置完整的包类路径,这样可以很好的识别映射的实体类
<select id="queryUserById" resultType="com.mybatis.entity.User">
select id,user_name as userName,age from user where id = #{id}
</select>
</mapper>
4、Mappers映射器
mappers标签中有两个标签
1、mapper标签里面有三个取值
01、url:用来加载物理磁盘上或者网络上的配置文件
02、resource:用来加载类路径下的配置文件
03、class:基本不用
如果使用mapper一次只能加载一个mapper.xml文件,如果有大量的mapper.xml文件需要被加载就要写很多的mapper标签,针对这种情况我们使用package标签
2、package标签扫描包的形式批量引入xxxMapper.xml映射文件
用来加载某一个包下面的配置文件,但是需要将配置文件和接口放在同一个地方,并且接口的名字和xml的名字相同(原理是通过接口的名字,找到相同名字同一路径下的xml文件,然后加载xml文件)
但是实际情况下我们习惯把xxxMapper接口放置在 src/main/java下,而习惯把xxxMapper.xml配置文件放置在 src/main/resources,如何实现使xxxMapper接口和xxxMapper.xml编译之后能放置在一起呢?
具体步骤如下:(我这里是Maven工程)
1、项目的pom.xml中加上如下配置(当然其它方式还有很多)
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
2、在 src/main/resources下建立和xxxMapper文件一样的包结构(com.mybatis.dao,记住文件夹要一个一个的建),如左图,建立完以后,编译项目,如果编译之后发现xxxMapper接口和xxxMapper.xml都在同一目录下,那么就OK了
二、映射配置文件(xxxMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dao.EmployeeMapper">
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="employeeId">
INSERT INTO employee VALUES (null,#{employeeName},#{employeePassword},#{employeeAge},#{departmentId})
</insert>
<select id="queryEmployeeByEmployeeId" resultType="com.mybatis.entity.Employee">
SELECT EMPLOYEE_ID,EMPLOYEE_NAME,EMPLOYEE_PASSWORD,EMPLOYEE_AGE,DEPARTMENT_ID FROM employee
WHERE EMPLOYEE_ID=#{employeeId}
</select>
</mapper>
整个mapper.xml文件中只有一个标签mapper,下面这些就是mapper标签中的子标签
namespace:告诉mybatis这个配置文件是要实现哪一个接口
cache:和缓存有关
cache-ref:和缓存有关
parameterMap:参数map:废弃了,原本是来做复杂参数映射;
resultMap:结果映射:自定义结果集的封装规则;
sql:抽取可重用的sql;
insert:添加
delete:删除
update:修改
select:查询