1.where/set与if
在使用Mybatis时,有时我们需要sql语句不要写死,即要求分支语句,于是就有了if标签
#没有if标签
<select id="接口名" ResultType="类型名">
select * from tablename where emp_id-#{arg0} and emp_salary=#{erg1};
</select>
可是我们想自己选择如果只通过emp_id进行查询,又不想重新写一个接口,那么可以这样
<select id="接口名" ResultType="类型名">
select * from tablename where
<if test="arg0 !=NULL">
emp_id=#{arg0}
</if>
<if test="arg1 != NULL">
and emp_salary=#{erg1};
</if>
</select>
好像大体上可以了,但是有些小问题,即sql语句中可能出现语句多或少部分单词的现象,比如多where或and等,因此where标签应运而生.
<select id="接口名" ResultType="类型名">
select * from tablename
<where>
<if test="arg0 !=NULL">
emp_id=#{arg0}
</if>
<if test="arg1 != NULL">
and emp_salary=#{erg1};
</if>
</where>
</select>
这里where标签的作用是当where中的if有至少一个满足条件时会自动添加where单词,并且会自动去除多余的and和or单词.
set标签,与where差不多,仅仅是set标签必须保证至少满足一个条件,其余一致不多赘述.
2.choose/when/otherwise
<select id="接口名" ResultType="类型名">
select * from tablename
where
<choose>
<when test="arg0 !=NULL">
emp_id=#{arg0}
</when>
<when test="arg1 != NULL">
and emp_salary=#{erg1};
</when>
<otherwise>
...
</otherwise>
<choose>
</select>
作用是在几个选项中只选一个,从上向下依次执行,当遇到符合条件的就执行当前语句并终止.
3.foreach
①批量查询与删除(传入参数为集合类型)
<select id="接口名" ResultType="类型名">
select * from tablename
where e_id in
<foreach collection="集合的映射到Java类后的名字" open="(" sepertator="," close=")" item="id">
#{id}
</foreach>
</select>
open是在遍历前加的字符串,seperator是在集合中的元素之间添加的分隔符,close是在遍历结束后添加的字符串,item是集合中元素的通用名,比如如果list中是Employee则list大致为
(emp.id ,emp.id…)
即( )是open与close " , "是seperator,item为emp,因为是对象,可以调用feild.
delete与select语法一致
②批量添加数据
#sql写法
<insert id="接口名" >
insert into table_name
values(1,"name1"),(2,"name2"),...
</insert>
#foreach写法
<insert id="接口名" >
insert into table_name
values
<foreach collection="集合名" seperator="," item="value">
(#{value.id},#{value.name})
</foreach>
</insert>
③批量更改数据
#sql写法
<update id="接口名" >
update table_name set emp_name=empName,emp_id=empId;
update table_name set emp_name=empName,emp_id=empId;
update table_name set emp_name=empName,emp_id=empId;
...
</insert>
#foreach写法
<update id="接口名" >
<foreach collection="集合名" seperator="," item=emp">
update table_name set emp_name=#{emp.empName},emp_id=# {emp.empId);
</foreach>
</update>
实质上是把多条update语句合成了一句话,但是这样写需要配置Mybatis-config.xml,
在properties中的url项中数据库名后面加上一段话使其变成
…数据库名?allowMultiQueries=true" />
即允许多语句执行
4sql
<sql id="自定义名">
sql语句
</sql>
即sql标签就是将一段sql语句封装起来并取名,避免重复写
<include refid="上方id值" />
通过include标签使用封装的sql语句即可.