#基础标签
<!--基础标签-->
<delete id="" parameterType="" parameterMap="" databaseId="" statementType="" timeout="" flushCache="" lang="" ></delete>
<insert id="" parameterType="" parameterMap="" databaseId="" statementType="" timeout="" flushCache="" lang="" keyColumn="" keyProperty="" useGeneratedKeys=""></insert>
<update id="" parameterType="" parameterMap="" databaseId="" statementType="" timeout="" flushCache="" lang="" keyColumn="" keyProperty="" useGeneratedKeys=""></update>
<select id="" parameterType="" parameterMap="" databaseId="" statementType="" timeout="" flushCache="" lang="" resultType="" resultMap="" resultSetType="" resultSets="" resultOrdered="" useCache="" fetchSize=""></select>
#公共标签属性
- id:对应Mapper接口中的方法名。
- parameterType:传给此语句的参数类型(全路径名或别名):例如基本数据类型、集合、或对象等。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。一般来说基本的参数类型在xml中的sql编写不需要额外的指定ParameterType,当然也可以根据实际需要指定。通常有两种场景会经常看到 ParameterType 比如传参为集合Map、Javabean对象。前面的几个case中,也可以都不指定
parameterType。
- parameterMap(属性名-字段名/类型 不一致): 可以用于指定实体类字段属性与数据库字段属性的映射关系(在),通常当我们希望针对某些where条件做一些TypeHandler(类型转换)时使用。比如、对象属性为date,数据库字段为String类型。就可以在TypeHandler调用自定义的类型转换方法。可以和result Map搭配使用
<parameterMap id="StudentParameterMap" type="Student">
<parameter property="studentId" typeHandler="" resultMap="StudentResultMap" javaType="" jdbcType="" mode="" scale="" ></parameter>
<parameter property="studentName" typeHandler="" resultMap="StudentResultMap" javaType="" jdbcType="" mode="" scale="" ></parameter>
<parameter property="studentAge" typeHandler="" resultMap="StudentResultMap" javaType="" jdbcType="" mode="" scale="" ></parameter>
</parameterMap>
<resultMap id="StudentResultMap" type="Student">
<id column="id" property="studentId" javaType="" typeHandler="" jdbcType=""></id>
<result column="name" property="studentName" javaType="" typeHandler="" jdbcType=""></result>
<result column="age" property="studentAge" javaType="" typeHandler="" jdbcType=""></result>
</resultMap>
a. id:调用别名。 b. type:参数类型。 c. parameter:参数中的属性。 c1. property: Java 属性名 c2. javaType: 参数的Java类型 c3. jdbcType: 参数的JDBC类型 c4. typeHandler: 类型处理器 c5. resultMap: 返回结果映射 c6. modle: 用于存储过程,可以指定参数模式是输入(IN)、输出(OUT)还是既可输入又可输出(INOUT)。 c7. scale: 如果参数是一个数字类型,这可以用来定义小数点后应保留的位数。 databaseId: 多数据库切换使用,如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。 statementType: STATEMENT(非预编译)/PREPARED(预编译) /CALLABLE 。 设置 MyBatis 标记操作SQL的对象, 默认值:PREPARED。动态传参时会配置。 timeout: 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 flushCache: true/false; 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。 lang: 。
#特殊标签属性
1. insert、update标签特殊属性
1.1. keyColumn:(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
1.2. keyProperty:(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
1.3. useGeneratedKeys:(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server这样的关系数据库管理系统的自动递增字段, oracle使用序列是不支持的,通过selectKey可以返回主键),默认值:false。
2. select 标签特殊属性
2.1. resultType:返回数据类型对应实体类。- 返回单个表单对象 的类型 2.2. resultMap: 外部 resultMap 的命名引用。结果集的映射 - 返回对象集合、嵌套多表对象。 2.3. resultSets: 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。 2.4. resultSetType:FORWARD_ONLY(只允许结果集的游标向下移动)/SCROLL_SENSITIVE(结果集游标可以上下移动,返回的结果集是敏感的)/SCROLL_INSENSITIVE(结果集游标可以上下移动,返回的结果集是不敏感的) ,默认值为 unset (依赖驱动)。大量数据加载时设置游标允许的移动动作。 2.5. resultOrdered:这个设置仅针对嵌套结果 select 语句适用:如果为true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至导致内存不够用。默认值:false。 2.6. useCache:true/false; 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true 2.7. fetchSize:这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)。
#动态SQL
MyBatis 的动态SQL是一种强大的特性,允许你在XML映射文件中根据条件构建复杂的SQL语句。这里有一些常用的动态SQL标签和它们的作用.
1. <if>
<if>
:这个标签允许你根据某个条件的结果来包含它的内容。如果<if>
标签中的条件为true
,则其包含的SQL片段会被包括在最终的SQL语句中。
<if test="condition">
<!-- SQL to include if condition is true -->
</if>
2.<choose>
, <when>
, <otherwise>
<choose>
, <when>
, <otherwise>
:这组标签的行为类似于Java中的switch
语句。<choose>
包含一系列的<when>
测试条件,以及一个默认的<otherwise>
,用于当所有<when>
测试条件都不通过时。
<choose>
<when test="condition1">
<!-- SQL to include if condition1 is true -->
</when>
<when test="condition2">
<!-- SQL to include if condition2 is true -->
</when>
<otherwise>
<!-- SQL to include if no conditions are true -->
</otherwise>
</choose>
3. <where>
<where>
:这个标签在它包含的子标签生成的SQL片段前自动加上WHERE
关键字,并且能够正确地处理逻辑“AND”或“OR”连接词的位置,例如去掉多余的“AND”。
<where>
<if test="condition">
column_name = #{value}
</if>
</where>
4. <set>
<set>
:在生成UPDATE
语句时,<set>
标签用于包含更新列表,并且能够适当地去除多余的逗号。
<update>
UPDATE table_name
<set>
<if test="condition1">
column1 = #{value1},
</if>
<if test="condition2">
column2 = #{value2},
</if>
</set>
WHERE id = #{id}
</update>
5. <trim>
<trim>
:<trim>
标签用于自定义字符串修剪行为,你可以指定什么前缀(prefix
)或后缀(suffix
)添加到生成的内容,或者当内部条件返回非空内容时去除什么前缀(prefixOverrides
)或后缀(suffixOverrides
)。
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="condition1">
AND column1 = #{value1}
</if>
<if test="condition2">
OR column2 = #{value2}
</if>
</trim>
6. <foreach>
<foreach>
:这个标签用于迭代一个集合并且能够很容易地实现例如IN查询。常用于批量处理。
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT * FROM POST P
WHERE P.ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>