什么是SQL:
动态SQL指的是根据不同的查询条件,生成不同的sql语句。
- < if >
- < where>
- < foreach>
- < choose >(when otherwise)
if 语句
语法:
< if test=“判断Java对象的属性值”>
部分sql语句
< /if>
test="判断条件"条件为真就加上sql语句
如果我们需要根据姓名和学号来查询学生,如果姓名为空,那么就根据学号来查询,学号为空,就是用姓名来查询
<select id="selectIf" resultType="cn.com.Ycy.mybatis.domain.user">
select * from student
where
<if test="username !=null and username !=''">
username=#{username}
</if>
<if test=" id!= null">
and id = #{id}
</if>
</select>
当我们的id为空时,username不为空就会按照id来查询:select * from student where username=#{username}
但是我们username为空时,就会出现语法错误,这个就需要我们使用where语句,不使用也是可以的,在每一个if加上and
<select id="selectIf" resultType="cn.com.Ycy.mybatis.domain.user">
select * from student
where 1>0
<if test="username !=null and username !=''">
and username=#{username}
</if>
<if test=" id!= null">
and id = #{id}
</if>
</select>
where 语句
用来包含多个< if > 当多个if有一个成立,会自动增加一个where关键字
<select id="selectWhere" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user
<where>
<if test="username !=null and username != ''">
username=#{username}
</if>
<if test="id > 20">
or id > #{id}
</if>
</where>
</select>
如果标签中返回的内容是以and 或者 or 开头,会自动去除的
Set 语句
set是我们在更新表的时候使用的元素,通过set元素,我们可以逐字段的修改一条数据。
<update id="update">
UPDATE student
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="password!=null">
password=#{password}
</if>
</set>
WHERE id=#{id}
</update>
在set元素中,如果遇到了逗号,系统会自动将之去除
foreach 语句
循环java中的数组、List集合的,主要在sql的in语句中,可以批量处理数据的插入
语法:
<foreach collection="list" item="mylist" open="(" close=")" separator=",">
#{mylist}
</foreach>
collection:表示接口的方法参数的类型,如果是数组就是用array,如果是list集合就使用list
item:自定义的,表示数组和集合成员的变量
open:循环开始的字符
close:循环结束时的字符
separator:集合成员之间的分隔符
接口中
List<user>selectForeach(List<Integer>list);
mapper中:
<select id="selectForeach" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id in
<foreach collection="list" item="mylist" open="(" close=")" separator=",">
#{mylist}
</foreach>
</select>
Java测试
@Test
public void testForeach1(){
userDao users = mybatisUtils.getSqlSession().getMapper(userDao.class);
List<Integer>list = new ArrayList<>();
list.add(29);
list.add(30);
list.add(31);
list.add(32);
List<user> u = users.selectForeach(list);
for(user user: u){
System.out.println(user);
}
}
用例2:
List<user>selectForeach2(List<user>list);
<select id="selectForeach2" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id in
<foreach collection="list" item="mylist" open="(" close=")" separator=",">
#{mylist.id}
</foreach>
</select>
@Test
public void testForeach2(){
userDao users = mybatisUtils.getSqlSession().getMapper(userDao.class);
List<user>list = new ArrayList<>();
user user1 = new user();
user1.setId(30);
list.add(user1);
user1 = new user();
user1.setId(29);
list.add(user1);
List<user> u = users.selectForeach2(list);
for(user user: u){
System.out.println(user);
}
}
mybatis中一次性插入多条记录的
<insert id="addUser" parameterType="java.util.Arraylist">
insert into user(name,sex) values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.name},#{item.sex})
</foreach>
</insert>