7.平凡之路-动态SQL语句

动态SQL语句是核心之一,这里我们通过几个示例来演示

一 多条件查询专题

1.通过恒等式完成动态SQL语句

涉及到if标签


    
        
        
        
        
        
    

    
        user_id,user_name,sex,money,birthday
    

    
        ${alias}.user_id,${alias}.user_name,${alias}.sex,${alias}.money,${alias}.birthday
    

  • 映射文件
    
    
    
  • Java测试代码
    @Test
    public void IF标签01(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            Map query = new HashMap<>();
            query.put("name", "悟");
            query.put("sex", "男");

            List userList =
                    sqlSession.selectList(User.class.getName()+".if01", query);
            System.out.println(userList);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
  • 图解说明


    7.平凡之路-动态SQL语句_第1张图片
    恒等式

2.where标签和if标签组合

  • 如果发现标签內有内容,那么会在内容的最前面加入关键字 where

  • 如果有内容,会检查内容的最前面是否含有 AND空格 或者 OR空格 ,自动将其抹掉

  • 映射文件

    
    
  • Java测试代码
    @Test
    public void IF标签02(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            Map query = new HashMap<>();
            query.put("name", "悟");
            query.put("sex", "男");

            List userList =
                    sqlSession.selectList(User.class.getName()+".if02", query);
            System.out.println(userList);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
  • 图解说明
7.平凡之路-动态SQL语句_第2张图片
where标签

3.trim标签和if标签



  • 映射文件
     
    
  • Java测试代码
    @Test
    public void trim标签(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            Map query = new HashMap<>();
            query.put("name", "悟");
            query.put("sex", "男");

            List userList =
                    sqlSession.selectList(User.class.getName()+".if03", query);
            System.out.println(userList);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
  • 图解说明


    7.平凡之路-动态SQL语句_第3张图片
    trim标签

二 更新操作

1.set标签

  • 当你发现有内容的时候,在内容的最前面加入 set

  • 当你发现有内容的时候,检查内容的最后面是否有逗号"," 如果将其抹掉

  • 映射文件

    
        UPDATE
            oa_user
        
            
                user_name=#{user_name},
            
            
                sex=#{sex},
            
            
                money=#{money},
            
            
                birthday=#{birthday},
            
        
        WHERE
            user_id=#{user_id}
    
    
  • Java测试代码
    @Test
    public void 更新操作_变更数据库(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            //数据
            User user = new User();
            user.setUser_id(3);
            user.setUser_name("天蓬元帅");
            //日期的转换
            String date = "1998-09-09";
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

            user.setBirthday(df.parse(date));

            int row =sqlSession.update(User.class.getName()+".update01", user);
            System.out.println(row);

            //事务的提交
            sqlSession.commit();

        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
  • 图解说明


    7.平凡之路-动态SQL语句_第4张图片
    set标签

2.trim标签完成更新

  • 映射文件
    
        UPDATE
            oa_user
        
            
                user_name=#{user_name},
            
            
                sex=#{sex},
            
            
                money=#{money},
            
            
                birthday=#{birthday},
            
       
        WHERE
            user_id=#{user_id}
    
  • Java测试代码
    @Test
    public void 更新操作_TRIM标签_变更数据库(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            //数据
            User user = new User();
            user.setUser_id(3);
            user.setUser_name("天蓬元帅123");
            //日期的转换
            String date = "1998-10-09";
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

            user.setBirthday(df.parse(date));

            int row =sqlSession.update(User.class.getName()+".update02", user);
            System.out.println(row);

            //事务的提交
            sqlSession.commit();

        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

三 choose 标签简单使用

  • 映射文件
    
  • Java测试代码
    @Test
    public void choose标签(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            Map query = new HashMap<>();
            query.put("sex", "女123213");

            List userList =
                    sqlSession.selectList(User.class.getName()+".choose01", query);
            System.out.println(userList);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

四 小于号问题

  • 映射文件
    
    
  • Java测试代码
    @Test
    public void 小于号的解决问题(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            List userList =
                    sqlSession.selectList(User.class.getName()+".less01", 1.0*800);
            System.out.println(userList);

            userList =
                    sqlSession.selectList(User.class.getName()+".less02",  1.0*600);
            System.out.println(userList);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
  • 图解说明


    7.平凡之路-动态SQL语句_第5张图片
    小于号问题解决问题

请参考附录1说明

五 动态添加语句

  • 映射文件
    
        INSERT INTO oa_user
            
                
                    user_name,
                
                
                    sex,
                
                
                    money,
                
                
                    birthday,
                
            
            
                 
                    #{user_name},
                
                
                   #{sex},
                
                
                   #{money},
                
                
                    #{birthday},
                
            
    
  • Java测试代码
    @Test
    public void 动态的添加语句(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            //数据
            User user = new User();
            user.setUser_name("刘备12333333");
            //日期的转换
            String date = "1998-10-09";
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            user.setBirthday(df.parse(date));

            user.setMoney(1111.11);

            int row =sqlSession.insert(User.class.getName()+".add01", user);
            System.out.println(row);

            //事务的提交
            sqlSession.commit();

            System.out.println(user);

        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

六 foreach标签

1.数组方式

  • 映射方式
    
    
        DELETE FROM
            oa_user
        WHERE user_id in 
        
        
            #{shxt}
        
    
  • Java测试代码
    @Test
    public void 传递数组删除规则(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            int row = sqlSession.delete(User.class.getName()+".delete01", new int[]{5,6});
            //事务的提交
            sqlSession.commit();
            System.out.println(row);
        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

2.List方式

  • 映射文件
     
    
        DELETE FROM
            oa_user
        WHERE user_id in 
        
            #{shxt}
        
    
  • Java测试代码
    @Test
    public void 传递集合删除规则(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            List tempList = new ArrayList<>();
            tempList.add(8);
            tempList.add(9);
            int row = sqlSession.delete(User.class.getName()+".delete02", tempList);
            //事务的提交
            sqlSession.commit();
            System.out.println(row);
        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

3.Map方式

  • 映射方式
    
        DELETE FROM
            oa_user
        WHERE user_id in 
        
            #{shxt}
        
    
  • Java测试代码
    @Test
    public void 传递Map删除规则(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            List tempList = new ArrayList<>();
            tempList.add(7);
            tempList.add(10);

            Map map = new HashMap();
            map.put("id_array", tempList);

            int row = sqlSession.delete(User.class.getName()+".delete03", map);
            //事务的提交
            sqlSession.commit();
            System.out.println(row);
        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
  • 图解方式


    7.平凡之路-动态SQL语句_第6张图片
    个人比较喜欢

4.批量添加

  • 映射文件
    
        INSERT INTO
        oa_user
        VALUES
        
        (#{user.user_name},#{user.sex},#{user.money})
        
    

附录1 : MyBatis在xml文件中处理大于号小于号的方法

第一种方法:

用了转义字符把>和<替换掉,然后就没有问题了。

SELECT * FROM test WHERE 1 = 1 AND start_date  <= CURRENT_DATE AND end_date >= CURRENT_DATE

附:XML转义字符

7.平凡之路-动态SQL语句_第7张图片
转义图

第二种方法

因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用符号进行说明,将此类符号不进行解析
你的可以写成这个:
mapper文件示例代码

  

你可能感兴趣的:(7.平凡之路-动态SQL语句)