Mybatis mapper xml 配置文件
标签
| 名称 | 作用 |
|---|---|
mapper |
namespace属性给定命名空间,就是 Mapper 接口的全类名 |
cache |
给定命名空间的缓存配置 |
cache-ref |
其他命名空间缓存配置的引用 |
resultMap |
结果集的映射关系 |
sql |
可被其他语句引用的可重用语句块 |
insert |
插入语句 |
delete |
删除语句 |
update |
更新语句 |
select |
查询语句 |
selectKey |
自定义取 key 值(id 值) |
resultMap
| 属性 | 作用 |
|---|---|
id |
当前命名空间中的一个唯一标识,用于标识一个result map |
type |
类的完全限定名, 或别名 |
autoMapping |
开启或者关闭自动映射 |
子标签:
| 标签 | 作用 | 备注 |
|---|---|---|
constructor |
用于在实例化类时,注入结果到构造方法中 | idArg:ID 参数arg:将被注入到构造方法的参数 |
id |
ID 结果,对象的标识属性 | 可以提高整体的性能,尤其是缓存和嵌套结果映射(也就是联合映射)的时候 |
result |
注入到 JavaBean 的结果 | |
association |
一个复杂类型的关联,许多结果将包装成这种类型 | 嵌套结果映射:关联可以指定为一个 resultMap 元素,或者引用一个 |
collection |
一个复杂类型的集合 | 嵌套结果映射:关联可以指定为一个 resultMap 元素,或者引用一个 |
discriminator |
使用结果值来决定使用哪个 resultMap | case:基于某些值的结果映射 嵌套结果映射:一个 case 也是一个映射它本身的结果,因此可以包含很多相同的元素,或者它可以参照一个外部的 resultMap |
constructor
一个pojo没有无参构造方法,就需要使用constructor。可以添加 @Param 注解来通过名称来引用构造方法参数,指定参数名称的前提下,可以以任意顺序编写 arg 元素。
<constructor>
<idArg column="id" javaType="int" />
<arg column="user_name" javaType="String" />
</constructor>
id & result
id 和 result 都将一个列的值映射到一个简单数据类型(字符串,整型,双精度浮点数,日期等)的属性或字段。
id 表示的结果将是对象的标识属性,这会在比较对象实例时用到。 这样可以提高整体的性能,尤其是缓存和嵌套结果映射(也就是联合映射)的时候。
| 属性 | 作用 |
|---|---|
property |
POJO中映射到列结果的字段或者属性 |
column |
SQL中的列名,或者是列的别名。resultSet.getString(columnName) |
javaType |
配置的Java的类 |
jdbcType |
配置的数据库的类型 |
typeHandler |
类型处理器实现类的完全限定名,或者是类型别名 |
sql
用来定义可重用的 SQL 代码段,可以包含在其他语句中,使用<include refid="sql_id" />引用 sql 标签。
#{} & ${}
#{}:预编译,将传入的数据都当成一个字符串,会对自动传入的数据加两个单引号,能够很大程度防止sql注入。${}:拼接,传入的数据直接显示生成在sql中,无法防止sql注入。
表名、选取的列是动态的,order by和in操作, 可以考虑使用${}。但是为了安全,只能代码内部使用。
insert & delete & update
| 属性 | 作用 | 备注 |
|---|---|---|
id |
命名空间中的唯一标识 | Mapper 接口的方法名 |
parameterType |
传入参数的类型;可以给出类全名,也可以给出类别名,使用别名必须是MyBatis内部定义或自定义的 | 基本数据类型:int , String , long , data 复杂数据类型:类 和 Map |
flushCache |
将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空(对应插入、更新和删除语句) | 默认值:true |
timeout |
设置超时时间,超时几秒后抛出异常 | 默认值由对应的数据库厂商提供 |
statementType |
STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement | 默认值:PREPARED |
useGeneratedKeys |
(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段,没有自增功能的就要使用selectKey标签了) |
默认值:false |
keyProperty |
(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表 |
|
keyColumn |
(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表 |
|
databaseId |
如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句。如果带或者不带的语句都有,则不带的会被忽略 |
select
| 属性 | 作用 | 备注 |
|---|---|---|
id |
命名空间中的唯一标识 | Mapper 接口的方法名 |
parameterType |
传入参数的类型;可以给出类全名,也可以给出类别名,使用别名必须是MyBatis内部定义或自定义的 | 基本数据类型:int , String , long , data 复杂数据类型:类 和 Map |
resultType |
从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。或者定义为int,double,float等参数…… | 不能和resultMap同时使用 |
resultMap |
外部 resultMap 的命名引用,自定义映射规则 |
不能和 resultType 同时使用 |
flushCache |
它的作用是在调用SQL后,是否要求MyBatis清空之前查询的本地缓存和二级缓存 | 默认 false |
useCache |
启动二级缓存开关,是否要求MyBatis将此次结果缓存 | 默认 true |
timeout |
设置超时时间,超时几秒后抛出异常 | 默认值由对应的数据库厂商提供 |
fetchSize |
获取记录的总条数设定 | 默认值由对应的数据库厂商提供 |
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
select id, user_name from t_user where id = #{id,jdbcType=INTEGER}
</select>
自动映射——resultType
- sql 列名必须和 JavaBean 的属性一致
autoMappingBehavior默认值是PARTIAL,谨慎使用FULL- 列名使用下划线分割是规范,Java是驼峰命名法。可以把
mapUnderscoreToCamelCase设置为true
阿里开发手册不建议使用resultType,就算属性名完全对应,也要使用resultMap。都是为了解耦。
传入参数
- 禁止使用 Map 传参(使用
parameterType指定,parameterType="map") - 使用注解(
@Param("param"))传参,最多传5个。大于5个参数使用 JavaBean 传参(使用parameterType指定,parameterType="org.example.mybatis.entity.UserBean")。
selectKey
一般是在数据库不支持自增字段的时候使用(useGeneratedKeys)。比如 Oracle 数据库。
| 属性 | 作用 | 备注 |
|---|---|---|
keyProperty |
selectKey 语句结果应该被设置的目标属性 |
如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表 |
keyColumn |
匹配属性的返回结果集中的列名称 | 如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表 |
resultType |
结果的类型。MyBatis 通常可以推算出来。MyBatis 允许任何简单类型用作主键的类型,包括字符串 | 如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map |
order |
这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 |
|
statementType |
STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表Statement,PreparedStatement 和 CallableStatement 类型 |
MySQL:order="AFTER",因为插入后才能拿到 id
<selectKey keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
Oracle:order="Before",因为插入前需要拿到 id
<selectKey keyProperty="id" order="Before" resultType="int">
select SEQ_ID.nextval from dual
</selectKey>
注解配置方式
注解方式就是将SQL语句直接写在接口上,对于需求比较简单的系统,效率较高。
缺点在于,每次修改sql语句都要编译代码,可维护性太差。对于复杂的sql语句可编辑性和可读性都差,一般不建议使用这种配置方式。
@Select@Results@Insert@Update@Delete@Options

浙公网安备 33010602011771号