很多时候查询/修改会根据不同数据执行不同的sql语句,一般情况下,我们需要对sql进行拼装。在MyBatis中可以通过动态SQL实现,就避免了拼装SQL
if语句:满足条件,则执行语句
choose when 条件一,when 条件二......otherwise相当于if()else if()...else(),如果when的条件不满足,则会执行otherwise代码块中的SQL语句。
值得注意的是下面的例子中有两个id为selectIf的查询,两个传递的参数不同,一个是基础数据类型,一个是类对象。传参为基础数据类型,那么在判断、#后面传递参数的时候使用_parameter;传参为类对象,则使用类中对应的属性
以上代码,每次使用条件时都添加了1=1,这样其实是不正确的,但我们需要条件,所以where和set就出来了。where用于删除没必要的and(在执行第一个条件时,是不需要and的),set用于update,在修改字段值时,没个字段后面都有一个“,”但是最后一个后面不应该有“,”而set便用于去除最后一个逗号
trim即格式化SQL代码,trim有四个属性,这四个属性都配套使用
- prefix:前缀增加
- suffix:后缀增加
- prefixOverrides:自动判断前置
- suffixOverrides:自动判断后置
update student name=#{name}, zhuangtai=#{zhuangtai},
foreach
foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息
基础数据类型的list:where标记之后输出的sql语句WHERE id in ( ? , ? )
@Test ListselectList = new ArrayList<>();selectList.add(1);selectList.add(2);List jikeUsers = sqlSession.selectList("selectForeach",selectList);for(JikeUser jikeUser : jikeUsers) System.out.println(jikeUser.getUserName());
类对象的list:where标记之后输出的sql语句WHERE (username like ? and password = ?) or (username like ? and password = ?)
@Test ListselectList = new ArrayList<>();selectList.add(new JikeUser("jike00100", "666666"));selectList.add(new JikeUser("author001", "123456"));List jikeUsers = sqlSession.selectList("selectForeach1",selectList);for(JikeUser jikeUser : jikeUsers) System.out.println(jikeUser.getUserName());
数组:where标记之后输出的sql语句WHERE id in ( ? , ? )
@Test int[] selectList = {1,2};ListjikeUsers = sqlSession.selectList("selectForeach",selectList);for(JikeUser jikeUser : jikeUsers) { System.out.println(jikeUser.getUserName());
HashMap:where标记之后输出的sql语句WHERE userName like "%"?"%" and id in ( ? , ? )
@Test Listids = new ArrayList<>();ids.add(1);ids.add(2);HashMap hashMap = new HashMap<>();hashMap.put("ids", ids);hashMap.put("name", "jike00100");List jikeUsers = sqlSession.selectList("selectForeach2",hashMap);for(JikeUser jikeUser : jikeUsers)System.out.println(jikeUser.getUserName());
由以上例子可以得出foreach中collection的参数一定是集合或数组等