Mybatis使用mapper.xml编写sql语句时常用的标签及释义:
1><resultMap>:用来描述如何从数据库结果集中加载对象,一般理解,就是将数据库中的值映射到java中的某一个类里,如此一来进行增删改查的标签可以通过配置resultMap属性将从数据库中获取的数据配置到Java集合中进行封装,resultMap的常用属性有两种:
id:用于指定<resultMap>的id,当其他标签配置resultMap属性时,会让该属性等于此id;
type:用于指明将查询结果封装到哪里,可以是一些基本类型,也可以是一个dto类,填写完整的类路径即可
<resultMap>下常用的标签有两个,<id>和<result>,其说明如下:
<id>:用于标示对象的唯一属性,比如表示主键,其中的属性说明如下(<id>和<result>的属性类型是一致的)
column:用于指定数据库中的字段名或者其别名(as);
property:指定javaBean中的属性名;
jdbcType:数据库中该字段的数据类型。
<result>:用于标示非主键的映射规则,属性内容参考<id>
<!--resultMap示例-->
<resultMap id="BaseResultMap" type="com.test.person">
<id column="person_id" jdbcType="INTEGER" property="personId"/>
<result column="person_name" jdbcType="VARCHAR" property="personName"/>
<result column="person_sex" jdbcType="VARCHAR" property="personSex"/>
</resultMap>
2><sql>:使用sql标签的主要意义在于将编写在增删改查中相同的sql语句抽出进行整理,通常只有一个id属性,用于对相同sql语句进行标记,在调用时通常会在增删改查标签语句中加入<include>标签,<include>标签中的refid属性指向sql标签的id值,sql标签内部与普通的增删改查标签一致,都可以使用<where>、<foreach>、<if>、<trim>、<choose>、<when>等标签,此类标签将在稍后进行说明。
<!--配置sql标签-->
<sql id="Base_Person_List">
person_id,person_name,person_sex
</sql>
<!--使用案例-->
<select id="selectExample" parameterType="com.test.person" resultMap="BaseResultMap">
select
<include refid="Base_Person_List"/>
from tb_person
3><select>、<insert>、<delete>、<update>标签在此不再进行赘述。
4><where>、<foreach>、<if>、<trim>、<choose>、<when>(重点):动态sql语句实现的基础,用这些标签可以使得sql语句并不仅限于固定的长度,大大扩充了Mybatis的使用场景。
(1)<where>:通常标签定义体内部都会有<if>标签,类似于sql语句中where的用法,其优点在于如果where后面没有任何条件时(通常是没有满足任何<if>标签中的条件的情况下),<where>标签会在进行sql语句拼接时省略where关键字;
(2)<foreach>:通常用于动态生成sql语句的查询条件,其主要属性及说明如下:
item:集合中元素迭代时的别名,该参数为必选;
index:在list和数组中,index是元素序号,在map中,index是元素的key,该参数可选;
separator:元素间的分隔符,例如"or","and"等;
collection:要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = "ids".如果User有属性Ids ids ;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id"
open:foreach代码开始的符号,一般是"("和close=")"连用,通常用在sql语句的in()、values()时。
close:foreach代码结束的符号,一般是")"和open="("连用,通常用在sql语句的in()、values()时。
(3)<if>:有一个属性test,test属性值是一个符合OGNL要求的表达式,表达式的结果可以是true或者false,除此之外所有的非0值都为true,只有0为false,为true时<if>标签内的sql语句将被拼接,否则省略。
(4)<trim>:一般用于去除sql语句中多余的and关键字、逗号,或者给sql语句前拼接"where"、"set"以及"values("等前缀,或者添加")"等后缀,可用于选择性插入、更新、删除或者条件查询等操作,属性说明如下:
prefix:给sql语句拼接的前缀。
suffix:给sql语句拼接的后缀。
prefixOverrides:去除sql语句前面的关键字或字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签会去除该"AND"。
suffixOverrides:去除sql语句后面的关键字或字符,该关键字或者字符由suffixOverrides属性指定。
(5)<choose>:通常和<when>标签或<otherwise>标签联用,有时候并不想应用所有的条件,而只想从多个选项中选择一个,如果使用if标签,只要test中的表达式结果为true,就会执行if标签中的条件。<choose>标签是按顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则choose结束,choose中所有when的条件都不满足时,则执行otherwise中的sql。