(一)properties(属性)
将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。
db.properties配置文件内容
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
SqlMapConfig.xml中配置
SqlMapConfig.xml中通过${参数名}
引用db.properties文件中配置的参数
(二)settings(全局配置参数)
主要的配置参数有如下这些,作用于整个 Mybatis :
在SqlMapConfig.xml中配置
(三)typeAliases(类型别名)
在 Mapper.xml 中需要定义很多的 Statement,如果在指定类型时输入类型全路径,不方便进行开发,可以针对 parameterType 或 resultType 指定的类型定义一些别名,在 SqlMapConfig.xml 中通过别名定义,方便开发。
其中 Mybatis 提供了一些默认别名的定义:
当然我们还可以自定义别名单个别名定义和批量定义
引用单个别名的定义
SELECT LAST_INSERT_ID()
INSERT INTO USER(USERNAME,SEX,BIRTHDAY,ADDRESS) VALUES(#{username},#{sex},#{birthday},#{address})
批量定义的别名的引用和单个定义的是一样的,建议使用批量别名定义各pojo的别名,提高开发效率。
(四)typeHandlers(类型处理器)
Mybatis 中通过 typeHandlers 完成 jdbc 类型和 java 类型的转换。通常情况下,Mybatis 提供的类型处理器满足日常需要,不需要自定义,如果需要定义,如下:
(五)objectFactory(对象工厂)
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
6. plugins(插件)
简单理解为拦截器,既然是拦截器说白了一般都是动态代理来实现对目标方法的拦截,在前后做一些操作。 在mybatis将这种东西,称之为plugin,配置在SqlMapConfig.xml 配置文件中,通过 plugins 标签配置。在Mybatis中,可以被拦截的目标主要是:
1. StatementHandler(SQL语句处理器);
2. ParameterHandler(参数处理器 );
3. ResultSetHandler(结果集处理器 );
4. Executor(执行器 );
(七) environments(环境集合属性对象)
MyBatis 可以配置多种环境。但每个数据库对应一个 SqlSessionFactory。
将这三个合一块就是:
(八)mappers(映射器)
Mappers 标签是用来加载映射文件的,可通过下列四种方式加载映射文件
(1)通过resource加载单个mapper
(2)通过使用完全限定路径
(3)通过mapper接口加载单个mapper
(4)批量加载mapper(推荐使用)
映射文件 Mapper.xml 是 Mybatis 的核心,映射文件中需要定义操作数据库的SQL语句,每个SQL就是一个statement。
三个的属性差不多,意思也一样。下面以insert为例。在实际使用过程中并不需要都进行配置,可根据自己的需要删除部分配置项。
id="addUser"
parameterType="user"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys="false"
timeout="20" >
SELECT LAST_INSERT_ID()
INSERT INTO USER(USERNAME,SEX,BIRTHDAY,ADDRESS) VALUES(#{username},#{sex},#{birthday},#{address})
在insert时,如果数据库的主键不能自增,可以使用下面的配置来实现相同的功能:
select SEQ_USER_ID.nextval as id from dual
INSERT INTO USER(ID,USERNAME,SEX,BIRTHDAY,ADDRESS) VALUES(#{id},#{username},#{sex},#{birthday},#{address})
在实际使用过程中并不需要都进行配置,可根据自己的需要删除部分配置项。
在实际使用过程中并不需要都进行配置,可根据自己的需要删除部分配置项。
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。步骤:
1、定义resultMap
2、使用resultMap作为statement的输出映射类型
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
resultType:实现简单,查询出来的列名不包含在POJO中需增加列名对应的属性才能完成映射。如果没有查询结果的特殊要求建议使用resultType。
resultMap:需单独定义resultMap,实现麻烦,但如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可实现延迟加载,而 resultType无法实现。
[1] Mybatis中Mapper映射文件详解 https://blog.csdn.net/majinggogogo/article/details/72123185