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

idresult 都将一个列的值映射到一个简单数据类型(字符串,整型,双精度浮点数,日期等)的属性或字段。
id 表示的结果将是对象的标识属性,这会在比较对象实例时用到。 这样可以提高整体的性能,尤其是缓存和嵌套结果映射(也就是联合映射)的时候。

属性 作用
property POJO中映射到列结果的字段或者属性
column SQL中的列名,或者是列的别名。resultSet.getString(columnName)
javaType 配置的Java的类
jdbcType 配置的数据库的类型
typeHandler 类型处理器实现类的完全限定名,或者是类型别名

sql

用来定义可重用的 SQL 代码段,可以包含在其他语句中,使用<include refid="sql_id" />引用 sql 标签。

#{} & ${}

  • #{}:预编译,将传入的数据都当成一个字符串,会对自动传入的数据加两个单引号,能够很大程度防止sql注入。
  • ${}:拼接,传入的数据直接显示生成在sql中,无法防止sql注入。
    表名、选取的列是动态的,order byin操作, 可以考虑使用 ${}。但是为了安全,只能代码内部使用。

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 (仅对 insertupdate 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段,没有自增功能的就要使用selectKey标签了) 默认值:false
keyProperty (仅对 insertupdate 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
keyColumn (仅对 insertupdate 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 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
posted @ 2020-12-17 12:31  qianbuhan  阅读(184)  评论(0)    收藏  举报