我们发现写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误。
那么怎么去解决这个问题呢?这就是本篇所讲的使用 mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。
我对动态SQL的理解就是根据不同条件下生成的SQL就叫动态SQL。
1. if以aaa表为例子
首先我们还是创建实体类,然后写一个AaaMapper接口
package Mapper; import Models.aaa; import java.util.List; import java.util.Map; public interface AaaMapper { List queryAaa(Map map); }
然后再去写AaaMapper.xml
select * from aaa where 1=1 and myname=#{myname} and myaddress=#{myaddress}
if就是这样使用,只要myname不为空的话,那么就会拼接SQL语句,这个时候的SQL语句就变成了select * from aaa where 1=1 and myname=#{myname},同理,下面的myaddress也是一样,如果myname为空,myaddress不为空,这个SQL语句也是可以执行成功的,当然两个都不为空,也是可以的
2. where上图我们写了一个where 1=1,这个是为了使上面的SQL不报错,因为如果写1=1,当第一个if不满足的时候,我们的SQL语句是select * from aaa where and myaddress=#{myaddress},这样肯定是不行的,所以还有一个where标签
select * from aaa where id=#{id} and myaddress=#{myaddress}
这样写,但是当id为空时,就会报错,为了解决这个问题,就有where标签
package Test; import Mapper.AaaMapper; import Models.aaa; import Utils.Util; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.HashMap; import java.util.List; public class MyTest { @Test public void Test01(){ SqlSession sqlSession = Util.getSqlSession(); AaaMapper mapper = sqlSession.getMapper(AaaMapper.class); HashMap map = new HashMap<>(); //map.put("id",); map.put("myaddress","四川"); List aaas = mapper.queryAaa01(map); for (aaa aaa : aaas) { System.out.println(aaa); } sqlSession.close(); } }
这样,哪怕第一个条件为空,也不会报错,官方的解释是
where 元素只会在子元素返回任何内容的情况下才插入 “WHERe” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
3. choosechoose这个标签有点像switch
select * from aaaid=#{id} and myname=#{myname} and sex=#{sex}
when就像case,otherwise就像default一样
测试类
SqlSession sqlSession = Util.getSqlSession(); AaaMapper mapper = sqlSession.getMapper(AaaMapper.class); HashMap map = new HashMap<>(); map.put("id",1008); //map.put("myname","赵谦"); map.put("sex","男"); List aaas = mapper.queryAaa01(map); for (aaa aaa : aaas) { System.out.println(aaa); } sqlSession.close(); }
这里我们输入1008,和男,但是id为1008的这个人的性别是女生,
但是还是输出了正确信息,所以如果前面的when条件成立的话,otherwise就没什么用
4. setset 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号
update aaa where id=#{id} myname=#{myname}, myaddress=#{myaddress},
两个if判读满不满足,都行只要输入id
public void Test02(){ SqlSession sqlSession = Util.getSqlSession(); AaaMapper mapper = sqlSession.getMapper(AaaMapper.class); HashMap map = new HashMap<>(); map.put("id",1001); map.put("myname","孔子"); map.put("myaddress","河北"); mapper.getquery(map); sqlSession.close(); }
未完待续
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)