目录
动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。
在 xml 里面写判断条件。
动态SQL 在数据库里的体现就是,phtot 这个字段在数据输入的时候,在没有默认值情况下,可以为空。


在 SQL 中,空和 NULL 是两个不同的概念。空什么也没有显示,而 NULL 显示了 NULL。

- /**
- * 动态 sql
- * if 标签
- * @param userInfo
- * @return
- */
- int add2(UserInfo userInfo);
-
"add2"> - insert into userinfo(username,password
- <if test="photo != null">
- ,photo
- if>
- )values(#{username},#{password}
- <if test="photo != null">
- ,#{photo}
- if>
- )
-
- @Test
- void add2() {
- UserInfo userInfo = new UserInfo();
- userInfo.setUsername("猪八戒");
- userInfo.setPassword("569875");
- userInfo.setPhoto("lion.png");
- int result = userMapper.add2(userInfo);
- System.out.println(result);
- }

- @Test
- void add2() {
- UserInfo userInfo = new UserInfo();
- userInfo.setUsername("如来佛祖");
- userInfo.setPassword("99999");
-
- int result = userMapper.add2(userInfo);
- System.out.println(result);
- }


多个字段可以为空的情况下,只要有一个字段不为空,就需要用到添加操作。动态拼接。
- /**
- * trim 标签
- * @param userInfo
- * @return
- */
- int add3(UserInfo userInfo);
-
"add3"> - insert into userinfo
-
"(" suffix=")" suffixOverrides=","> - <if test="username!=null">
- username,
- if>
- <if test="password!=null">
- password,
- if>
- <if test="photo!=null">
- photo
- if>
-
- values
-
"(" suffix=")" suffixOverrides=","> - <if test="username!=null">
- #{username},
- if>
- <if test="password!=null">
- #{password},
- if>
- <if test="photo!=null">
- #{photo}
- if>
-
-
- @Test
- void add3() {
- UserInfo userInfo = new UserInfo();
- userInfo.setUsername("观音菩萨");
- userInfo.setPassword("3785");
-
- int result = userMapper.add3(userInfo);
- System.out.println(result);
- }
- @Test
- void add3() {
- UserInfo userInfo = new UserInfo();
- userInfo.setUsername("卓耿");
- userInfo.setPassword("sfgoz");
- userInfo.setPhoto("dragon.jpn");
-
- int result = userMapper.add3(userInfo);
- System.out.println(result);
- }

根据传入参数,来决定 SQL 语句是否有 where 关键字。动态生成 where 语句。
对于 int 类型,不传的话,默认为 0 ,而不是 null。
where 标签除了动态生成 where 语句外,还可以自动的去掉语句前面的 and。所以 and 只能放在语句的前面,放在最后面会报错!
- /**
- * where 标签
- * @param userInfo
- * @return
- */
- List
getListByWhere(UserInfo userInfo);
-
- select * from userinfo
-
- <if test="id>0">
- id=#{id}
- if>
- <if test="username!=null">
- and username=#{username}
- if>
- <if test="password!=null">
- and password=#{password}
- if>
- <if test="photo!=null">
- and photo=#{photo}
- if>
-
-
- @Test
- void getListByWhere() {
- UserInfo userInfo = new UserInfo();
- userInfo.setId(1);
- List
list = userMapper.getListByWhere(userInfo); - System.out.println(list);
- }

- @Test
- void getListByWhere() {
- UserInfo userInfo = new UserInfo();
- userInfo.setUsername("白骨精");
- List
list = userMapper.getListByWhere(userInfo); - System.out.println(list);
- }

也可以使用 trim 标签完成上述 where 标签的功能,代码如下:
-
- select * from userinfo
-
"where" prefixOverrides="pre"> - <if test="id>0">
- id=#{id}
- if>
- <if test="username!=null">
- and username=#{username}
- if>
- <if test="password!=null">
- and password=#{password}
- if>
- <if test="photo!=null">
- and photo=#{photo}
- if>
-
-
用于修改。
- /**
- * set 标签
- * @param userInfo
- * @return
- */
- int update2(UserInfo userInfo);
-
"update2"> - update userinfo
-
- <if test="username!=null">
- username=#{username},
- if>
- <if test="password!=null">
- password=#{password},
- if>
- <if test="photo!=null">
- photo=#{photo}
- if>
-
- where id=#{id}
-
- @Test
- void update2() {
- UserInfo userInfo = new UserInfo();
- userInfo.setUsername("小玫瑰");
- userInfo.setId(6);
- userInfo.setPassword("palsov");
- userInfo.setPhoto("rose.jpg");
- int result = userMapper.update2(userInfo);
- System.out.println(result);
- }

- @Test
- void update2() {
- UserInfo userInfo = new UserInfo();
- userInfo.setUsername("卡莉熙");
- userInfo.setId(4);
- userInfo.setPassword("msjf");
-
- int result = userMapper.update2(userInfo);
- System.out.println(result);
- }

可以看出,set 标签会自动去除末尾的逗号!
多条 sql 数据删除的时候。批量删除。
- /**
- * foreach 标签
- * @param ids
- * @return
- */
- int delByIds(List
ids) ;
-
"delByIds"> - delete from userinfo
- where id in
-
"ids" open="(" close=")" item="id" separator=","> - #{id}
-
-
- @Test
- void delByIds() {
- List
list = new ArrayList(){{ - add(1);
- add(2);
- add(3);
- }};
-
- int ret = userMapper.delByIds(list);
- System.out.println(ret);
- }

