<select>、<insert>、<update>、<delete>
<trim>:trim标签主要就是标记的作用,可以去掉if条件不满足时多余的and或者or或者,等等,和set标签或者where标签相通。
trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码:
1、
select * from user
<trim prefix="WHERE" prefixoverride="AND |OR">
<if test="name != null and name.length()>0"> AND name=#{name}</if>
<if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
</trim>
假如说name和gender的值都不为null的话打印的SQL为:select * from user where name = 'xx' and gender = 'xx'
在红色标记的地方是不存在第一个and的,上面两个属性的意思如下:
prefix:前缀
prefixoverride:去掉第一个and或者是or
2、
update user
<trim prefix="set" suffixoverride="," suffix=" where id = #{id} ">
<if test="name != null and name.length()>0"> name=#{name} , </if>
<if test="gender != null and gender.length()>0"> gender=#{gender} , </if>
</trim>
假如说name和gender的值都不为null的话打印的SQL为:update user set name='xx' , gender='xx' where id='x'
在红色标记的地方不存在逗号,而且自动加了一个set前缀和where后缀,上面三个属性的意义如下,其中prefix意义如上:
suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)
suffix:后缀
<where>:where是sql语句中的关键字,把他作为标签是防止sql语句中where之后的判断语句不成立,多出where关键字,使得sql语句出错。
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
<set>:使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾(if语句中)的任何不相关的逗号。
<update id="updateByPrimaryKeySelective" parameterType="RecruitmentConfBanner">
UPDATE conf_banner t
<set>
<if test="bannerName != null">
t.banner_name = #{bannerName},
</if>
<if test="bannerUrl != null">
t.banner_url = #{bannerUrl},
</if>
<if test="bannerLogo != null">
t.banner_logo = #{bannerLogo},
</if>
<if test="bannerDescription != null">
t.banner_description = #{bannerDescription},
</if>
<if test="sort != null">
t.sort = #{sort},
</if>
<if test="isEnabled != null">
t.is_enabled = #{isEnabled},
</if>
</set>
where t.banner_id = #{bannerId}
</update>
mybatis接受的参数分为:(1)基本类型(2)对象(3)List(4)数组(5)Map
无论传哪种参数给mybatis,他都会将参数放在一个Map中:
如果传入基本类型:变量名作为key,变量值作为value 此时生成的map只有一个元素。
如果传入对象: 对象的属性名作为key,属性值作为value,
如果传入List: "list"作为key,这个List是value (这类参数可以迭代,利用<foreach>标签实现循环)
如果传入数组: "array"作为key,数组作为value(同上)
如果传入Map: 键值不变。
<foreach>:标签有循环的功能,可以用来生成有规律的SQL语句,主要属性有:
item:表示集合每一个元素进行迭代时的别名
index:表示在迭代过程中,每次迭代到的位置
open:表示该语句已什么开始
separator:表示每次迭代之间以什么符号作为分隔
close:表示该语句已什么结束
collection:需要迭代的变量
<update id="pubS" parameterType="Map">
UPDATE BMC_SUBPLATE
SET PLSTATUS = '02'
WHERE
<foreach collection="ids" item="plid" open="" close="" separator="OR">
PLID = #{plid}
</foreach>
</update>
collection的值其实就是mybatis把参数转化成Map以后,这个Map的key,但是这个key对应的value必须是一个集合, 可以是数组,也可以是List
生成的动态sql:
Executing: UPDATE BMC_SUBPLATE SET PLSTATUS = '02' WHERE PLID = ? OR PLID = ?
Parameters: 20121116144947537692(String), 20121116141301414855(String)
<if>:查询标签
<choose>:查询标签,choose(when,otherwise)相当于java中的switch/case
if和choose酌情使用
<bind>:可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>
下面是映射xml文件中的其他一些标签的用法:
<parameterMap>
<include>:标签引入sql片段,通过<sql>的id值,引用一些可以重复使用的代码段。
<resultMap>:将sql标签执行的结果返回,逐一定义列名和对象属性名之间的映射关系。
<selectKey>:在不支持自增的主键而生成的策略标签。
SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。
不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。
selectKey Attributes
属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性。
resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
statementType 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。
SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
像Oracle这样取序列的情况,需要设置为before,否则会报错。
下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了
<insert id="insert" parameterType="map">
insert into table1 (name) values (#{name})
<selectKey resultType="java.lang.Integer" keyProperty="id">
CALL IDENTITY()
</selectKey>
</insert>
上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。
@Insert("insert into table2 (name) values(#{name})")
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)
int insertTable2(Name name);