Mybatis (三) 动态sql

当我们使用传统JDBC方法去写复杂的SQL语句的时候,需要去进行大量的拼接。常常会因为一个小错误如少写了一个空格导致错误,而且还很难找出错误的原因,Mybatis的动态SQL功能正是为了解决这些问题,通过if,choose,when,otherwise,trim,where,set,foreach,sql,include,bind标签,组合成灵活的sql语句。动态SQL是Mybatis强大的特性之一,极大的简化了拼接SQL的操作,Mybatis采用功能强大基于OGNL表达式来简化操作。

    1. if 功能

简单的条件判断,利用 if 语句可以实现简单的条件选择、判断拼接和否定忽略。


        
        
        
        
        
        
            
        
    
 
    

使用 if 标签进行了动态SQL的拼接,需要注意的是 if 标签内的条件判断语句字段应该与javabean中定义的字段名一致,而不是数据库中真实的字段名。

    1. where功能

where标签语句的作用主要是简化SQL语句中 where 中的条件判断,where 元素的作用是在会写入 where 元素的地方输出一个 where,另外一个好处是不需要考虑 where 元素里面的条件输出是什么样子的,mybatis 会自动的帮我们处理,如果所有的条件都不满足那么 mybatis 就会查询出所有的记录,如果输出后是 and 开头的,mybatis 会把第一个 and 忽略,如果是 or 开头也会将其忽略。此外,在 where 元素中不需要考虑空格的问题,mybatis都会帮你自动的补充完善。


    1. choose功能

choose 标签的作用相当于java中的 switch 语句,通常都是与 when 和 otherwise 搭配使用,when 表示按照顺序来判断是否满足条件。当 when 有条件满足的时候就会跳出 choose,即所有的 when 和 otherwise 条件中只会有一个输出,当所有条件都不满足时,输出 otherwise 中的内容。

    
    

在 choose 标签中,条件会按 when 的顺序进行判断,当有一个值为真时,就会跳出 choose 返回内容。

    1. set功能
    
        update t_user
        
        
             t_username=#{username}
        
        
             ,t_password=#{password}
        
        
             ,t_sid=#{sid}
        
        
        where t_id=#{id}
    

在set标签中逗号是不能省略的,mybatis不会自动的把逗号补上造成SQL语句出错。

    1. trim标签时刻在自己包含的内容前加上某些前缀,也可以在其后加上后缀,与其对应的属性是 prefix 和 suffix ;可以把包含的内容的首部某些内容覆盖即忽略,也可以把尾部某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides。

使用 trim 标签在 and 或 or 前加入 where 前缀,重复的 and 或 or 将其覆盖不处理。如果在例子中三个 if 都为真,那么 sql 语句将会变为:select *from t_user where t_id=? and t_username=? and t_password=?

    1. foreach功能

foreach 的主要用在构建 in 条件中,它可以在SQL语句中迭代一个集合,foreach 的主要属性有:item index open separator close collection。需要注意的是 collection,在不同的情况下该属性的值是不一样的如:List Array Map

 

Test.java

@Test
    public void getStudent2(){
         
        try {
                    
             
                List list=new ArrayList();
                list.add(2);
                list.add(3);
                list.add(4);
                list.add(5);
                List ulist=mapper.getStudent2(list);
                for(User users:ulist){
                    System.out.println(users.getPassword()+"  "+users.getUsername());
                }               
                
        } finally{
            // TODO Auto-generated catch block
            session.close();
        }
    }
    1. sql , include 功能

抽取可重用的SQL片段,方便后面引用:

  1. sql 抽取经常将要查询的列名,或插入用的列名抽取出来方便引用。
  2. include 来引用已抽取的sql

    
    
        (t_username,t_password,t_sid)
    
    
    
        insert into t_user
        
        values 
        
            (#{user.username},#{user.password},#{user.sid})
        
    

使用标签所拼接而成的 sql 语句:
insert into t_user (t_username,t_password,t_sid) values (?,?,?) , (?,?,?) , (?,?,?) , (?,?,?)
可以看到 include 标签将我们抽取出来的 sql 语句填充了回去,使用 separate 以 "," 进行分割
Test.java

public void addUser(){
         
        try {
                User user1=new User();  
                user1.setPassword("19978878");
                user1.setSid(2);
                user1.setUsername("zcdfggad");
                
                User user2=new User();  
                user2.setPassword("2013456");
                user2.setSid(1);
                user2.setUsername("oiuyiusa");
                
                User user3=new User();  
                user3.setPassword("wqewqe878");
                user3.setSid(2);
                user3.setUsername("xczfdgsad");
                
                User user4=new User();  
                user4.setPassword("qweqw8878");
                user4.setSid(1);
                user4.setUsername("32164897/");
                
                List ulist=new ArrayList();
                ulist.add(user1);
                ulist.add(user2);
                ulist.add(user3);
                ulist.add(user4);
                
                int tmp=mapper.addUser(ulist);
                session.commit();
                System.out.println(tmp);
                
        } finally{
            // TODO Auto-generated catch block
            session.close();
        }
    }
  • 8.bind 功能

使用 ONGL 表达式将变量进行绑定


Mybatis 动态 SQL 非常灵活,当需要写大量拼接语句使使用动态 SQL 能大大的减少我们所需的工作量,合理的运用到项目中提升了开发效率。

上篇:Mybatis(二)返回值、表查询
http://www.jianshu.com/p/adf5ddc7247a

你可能感兴趣的:(Mybatis (三) 动态sql)