目录
一、动态SQL_
介绍:
标签内的 Sql 片段在满足条件后才会添加,用法为: 。 可以代替 sql 中的 where 1=1 和第一个 and ,更符合程序员的开发习惯 1.持久层接口查询方法
//测试MyBatis动态sql语句标签如:、where、set、when、choose、otherwise、foreach public interface UserMapper2 { // 1.查询满足条件的所有数据,测试动态SQL的标签 // 用途:测试标签 ListfindByCondition(User user); }2.映射文件
<select id="findByCondition" resultType="User" parameterType="string"> select * from user <where> <if test="username != null and username.length() != 0"> username like #{username} if> <if test="sex != null and sex.length() != 0"> and sex = #{sex} if> <if test="address != null and address.length() != 0"> and address = #{address} if> where> select>3.测试方法
@Test public void testFindByCondition(){ User user = new User(); //第一次查询,user对象是一个null对象,所以传入到sql中没有条件,调用where 1=1 查询所有数据 Listusers1 = userMapper2.findByCondition(user); users1.forEach(System.out::println); user.setUsername("%尚学堂%"); //第二次查询,user对象有了”username=尚学堂“的值,传入username的条件并查询满足username=尚学堂的条件 Listusers2 = userMapper2.findByCondition(user); users2.forEach(System.out::println); user.setAddress("北京"); //第三次查询,user对象有了”username=尚学堂、address=北京“的值,传入username、address的条件并查询满足条件的数据 Listusers3 = userMapper2.findByCondition(user); users3.forEach(System.out::println); }(1)if 中的条件不能使用 &&/|| ,而应该使用 and/or2(2)if 中的条件可以直接通过属性名获取参数 POJO 的属性值,并且该值可以调用方法。3(3)where 后为什么要加 1=1 ?任意条件都可能拼接到Sql 中。如果有多个条件,从第二个条件开始前都需要加And 关键字。加上 1=1 这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And 关键字即可。5.知识点整理:
(1)MyBatis的标签使用“test”属性添加条件 (2)MyBatis的中,多个条件同时满足需要用“and”连接,不能用&& (3)MyBatis映射文件中,的作用是“代替sql中where 1=1 和第一个and”
二、动态SQL_
介绍:
标签用在update语句中。借助 ,可以只对有具体值的字段进行更新。 会自动添加set关键字,并去掉最后一个if语句中多余的逗号。 1.持久层接口更新方法
// 2.动态更新数据,按给定的id主键值进行动态修改数据,可以只更新一行数据中的其中一个字段值,测试动态SQL的标签 // 用途:测试标签 void updateUser(User user);2.映射文件
<update id="updateUser" parameterType="User"> update user <set> <if test="username != null and username.length() !=0"> username = #{username}, if> <if test="sex != null and sex.length() !=0"> sex = #{sex}, if> <if test="address != null and address.length() !=0"> address = #{address} if> set> <where> id = #{id} where> update>3.测试方法
@Test public void testUpdateUser(){ User user = new User(); user.setId(2); user.setUsername("我是程序员"); userMapper2.updateUser(user); // 增删改操作记得要手动提交事务 session.commit(); }4.知识点整理:
(1)MyBatis映射文件中,
的作用是“代替set关键字,并去掉最后一个if语句中多余的逗号”
三、动态SQL_
、 、 介绍:
这些标签表示多条件分支,类似 JAVA 中的 switch...case 。类似 switch ,类似 case , 类似 default ,用法如下: 1.持久层接口查询方法
// 3.查询满足条件的所有数据,测试动态SQL的标签 // 按给定的内容进行模糊查询(内容小于5)或精确查询(内容小于10),否则返回id=1的数据(内容大于10) // 用途:测试标签,一般三个连着使用,相当于java中的Switch-case-default ListfindByUsername(String username); 2.映射文件
<select id="findByUsername" parameterType="string" resultType="User"> select * from user <where> <choose> <when test="username.length() < 5"> <bind name="username" value="'%'+username+'%'"/> username like #{username} when> <when test="username.length() < 10"> username = #{username} when> <otherwise> id = 1 otherwise> choose> where> select>这段代码的含义为:用户名 <5 时使用模糊查询,用户名 >=5 并且<10时使用精确查询,否则查询 id 为 1 的用户3.测试方法
@Test public void testFindByUsername(){ // 精确查询username属性中含有北京的数据 Listuser = userMapper2.findByUsername("北京"); user.forEach(System.out::println); }4.知识点整理:
1.MyBatis 映射文件中,的作用为“表示多条件分支” 2. 在 MyBatis 映射文件中 ,需要被嵌套“ ”
四、动态SQL_
遍历Array数组进行批量删除 介绍:
类似JAVA中的for循环,可以遍历集合或数组。 有如下属性: collection :遍历的对象类型
open :表示该语句以什么开始,常用 “(”;
close : 表示以什么结束,常用 “)”。
separator :表示在每次进行迭代之间以什么符号作为分隔符,常用 “,”;
item :表示集合中每一个元素进行迭代时的别名,随便起的变量名,遍历 map 时表示键值对的值。
index :遍历 List 、数组时表示遍历的索引位置,遍历 map 时表示键值对的键。遍历数组:我们使用遍历数组进行批量删除。 1.持久层接口删除方法
// 4.批量删除指定id的一些数据,测试动态SQL的标签,遍历Array // 按给定的id值进行批量删除数据,传入一个数组,数组中包含要删掉的id值 // 系统的删除语句:delete from user where id in(12,13,14,16,17,18) // 用途:测试标签,遍历Array数组 void deleteBatch(int[] ids);2.映射文件
<delete id="deleteBatch" parameterType="int"> delete from user <where> <foreach collection="array" open="id IN(" close= ")" separator="," item="id"> #{id} foreach> where> delete>3.测试方法
@Test public void testDeleteBatch(){ int[] ids = {12,13,14,16,17,18}; userMapper2.deleteBatch(ids); session.commit(); }4.知识点整理:
1. MyBatis 的中,使用属性表示遍历的数据类型" item " 2. 在 MyBatis 映射文件中,遍历数组时需要将 collection 的值设为"array"
五、动态SQL_
遍历Collection集合进行批量插入 介绍:
遍历 List 和 Set 的方法是一样的,这里使用 遍历 List集合 进 行批量添加1.持久层接口插入方法
// 5.批量插入数据,测试动态SQL的标签,遍历Collection // 系统插入语句:insert into user(username,sex,address) values(),(),() // 批量新增方法,测试标签,遍历Collection集合 void insertBatch(Listuser) ;2.映射文件
<insert id="insertBatch" parameterType="User"> insert into user(username,sex,address) values <foreach collection="list" item="user" separator=","> (#{user.username},#{user.sex},#{user.adddress}) foreach> insert>3.测试方法
@Test public void testInsertBatch(){ User user1 = new User("程序员1","男","深圳"); User user2 = new User("程序员2","女","上海"); Listusers = new ArrayList(); users.add(user1); users.add(user2); // 批量插入 userMapper2.insertBatch(users); session.commit(); }4.知识点整理:
(1)在MyBatis中映射文件中,遍历List时
的item属性表示“遍历的每项元素” (2)在MyBatis的
标签中,使用属性遍历每项间的分隔符“separator”
六、动态SQL_
遍历Collection集合进行批量插入 介绍:
使用
标签 遍历Map进行多条件查询。1.持久层接口查询方法
// 6.多条件查询:批量查询方法,测试标签,遍历Map集合 /** * 多条件查询:批量查询方法,测试标签,遍历Map集合 * @param map 查询的条件键值对 键:属性名 值:出入要查询的属性名 * 系统的查询语句:select * from user where username = ? and sex = ? * @return * @Param:为参数起别名 */ ListfindUser(@Param("queryMap") Map map) ;2.映射文件
<select id="findUser" parameterType="map" resultType="User"> select * from user <where> <foreach collection="queryMap" separator="and" index="key" item="value"> ${key} = #{value} foreach> where> select>3.测试方法
@Test public void testFindUser(){ MapqueryMap = new HashMap(); queryMap.put("sex","男"); queryMap.put("address","北京"); Listusers = userMapper2.findUser(queryMap); users.forEach(System.out::println); }4.知识点整理:
(1)MyBatis 的中,遍历 Map 时 index 属性表示“键值对的键” (2) MyBatis 的中,遍历 Map 时 item 属性表示“键值对的值”