十.MyBatis的动态SQL

10.1.什么是动态SQL

        动态SQL是指根据不同的条件或参数构建和执行SQL语句的过程。它允许你在运行时根据特定条件或参数动态地生成和执行SQL查询。动态SQL通常用于构建灵活的查询,以便根据不同的条件返回不同的结果。

        在MyBatis中,动态SQL是通过使用等元素来构建的。这些元素允许你在XML映射文件中定义动态的SQL查询,以便根据给定的条件或参数动态地生成和执行SQL语句。

10.2.if标签

        我们根据实体类的不同取值,使用不同的SQL语句来进行查询。比如在id如果不为空时可以根据 id查询,如果username不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。  

        mapper接口  

public interface UserDao {   

        //复杂条件查询
    public List findByUser(User user);
}

        mapper映射文件  


        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

   
 

        测试  

    @Test
    public void testFindAll(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setSex("男");
        user.setAddress("香港");
        List userList = userDao.findByUser(user);
        for(User u : userList){
            System.out.println(u);
        }
    } 

10.3.where标签

        为了简化上面where 1=1的条件拼装,我们可以使用where标签将if标签代码块包起来,将1=1条件去掉。

        若查询条件的开头为 “AND” 或 “OR”,where 标签会将它们去除。

 mapper映射文件

 
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

   

10.4.set标签

set标签用于动态包含需要更新的列,并会删掉额外的逗号  

mapper

public void updateByUser(User user); 

   
        update user
       
           
                username=#{username},
           

           
                birthday=#{birthday},
           

           
                sex=#{sex},
           

           
                address=#{address},
           

       

        where id=#{id}
   
 

测试

    @Test
    public void testUpdateByUser(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setId(50);
        user.setBirthday(new Date());
        user.setAddress("加拿大");
        userDao.updateByUser(user);
    } 

10.5.trim标签

trim标签可以代替where标签、set标签

mapper

    //修改
    public void updateByUser2(User user); 


        update user
       
       
           
                birthday=#{birthday},
           

           
                sex=#{sex},
           

           
                address=#{address},
           

       

        where id=#{id}
   
 

10.6.foreach标签

foreach标签的常见使用场景是集合进行遍历

mapper

 //批量删除
    public void deleteUserByIds(@Param("ids") List ids);
    //批量添加
    public void insertUsers(@Param("userList") List userList); 

   
        delete from user where id in
       
       
            #{id}
       

   

    
        INSERT INTO user(username,password,birthday,sex,address)
        VALUES
       
            (#{user.username},#{user.password},#{user.birthday},
                                        #{user.sex},#{user.address})
       

   

测试

   @Test
    public void testDeleteUserByIds(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List ids = new ArrayList();
        ids.add(50);
        ids.add(64);
        ids.add(67);
        userDao.deleteUserByIds(ids);
    }

    @Test
    public void testInsertUsers(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        long start = System.currentTimeMillis();
        List userList = new ArrayList<>();
        for(int i = 0 ;i < 10000; i++) {
            User user = new User();
            user.setUsername("刘德华");
            user.setPassword("111");
            user.setBirthday(new Date());
            user.setSex("男");
            user.setAddress("香港");
            //userDao.insertUser(user);
            userList.add(user);
        }
        userDao.insertUsers(userList);
        long end = System.currentTimeMillis();
        System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
        sqlSession.commit();
    }

10.7.sql标签

sql元素标签用来定义可重复使用的SQL代码片段,使用时只需要用include元素标签引用即可  

mapper

     //复杂条件查询
    public List findByUser3(User user);

 
   
       
            and username=#{username}
       

       
            and birthday=#{birthday}
       

       
            and sex=#{sex}
       

       
            and address=#{address}
       

   

     

测试

     @Test
    public void testFindAll3(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setAddress("香港");
        user.setUsername("刘德华");
        List userList = userDao.findByUser3(user);
        for(User u : userList){
            System.out.println(u);
        }
    }

你可能感兴趣的:(mybatis,sql,数据库,java,maven)