动态SQL

代码参考mybatis-demo

1.动态sql元素

动态SQL_第1张图片

2.动态查询语句

  • 有问题的if语句
    

测试代码:

    @Test
    // if用于select,并与where配合
    public void testSelectIfOper() {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

        String email = "qq.com";
        Byte sex = null;
        List list = mapper.selectIfOper(email, sex);
//      List list = mapper.selectIfandWhereOper(email, sex);
        System.out.println(list.size());

    }

错误:多了and

2018-09-24 15:44:16.146 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectIfOper - ==>  Preparing: select id, user_name, real_name, sex, mobile, email, note, position_id from t_user a where a.email like CONCAT('%', ?, '%') and 
  • 一种不优雅的解决方法——添加1=1

  • 优雅的解决方法——where

    

测试代码:

    @Test
    // if用于select,并与where配合
    public void testSelectIfOper() {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

        String email = "qq.com";
        Byte sex = null;
//        List list = mapper.selectIfOper(email, sex);
        List list = mapper.selectIfandWhereOper(email, sex);
        System.out.println(list.size());

    }

结果:

2018-09-24 15:54:05.008 [main] DEBUG c.e.m.mapper.TUserMapper.selectIfandWhereOper - ==>  Preparing: select id, user_name, real_name, sex, mobile, email, note, position_id from t_user a WHERE a.email like CONCAT('%', ?, '%') 
2018-09-24 15:54:05.049 [main] DEBUG c.e.m.mapper.TUserMapper.selectIfandWhereOper - ==> Parameters: qq.com(String)
2018-09-24 15:54:05.072 [main] DEBUG c.e.m.mapper.TUserMapper.selectIfandWhereOper - <==      Total: 2
2

3.动态更新语句

   
        update t_user
        set
        
            user_name = #{userName,jdbcType=VARCHAR},
        
        
            real_name = #{realName,jdbcType=VARCHAR},
        
        
            sex = #{sex,jdbcType=TINYINT},
        
        
            mobile = #{mobile,jdbcType=VARCHAR},
        
        
            email = #{email,jdbcType=VARCHAR},
        
        
            note = #{note,jdbcType=VARCHAR},
        
        
            position_id = #{positionId,jdbcType=INTEGER}
        
        where id = #{id,jdbcType=INTEGER}
    

测试代码:

    @Test
    // if用于update,并与set配合
    public void testUpdateIfOper() {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

        TUser user = new TUser();
        user.setId(3);
        user.setUserName("cindy");
        user.setRealName("王美丽");
        user.setEmail("[email protected]");
        user.setMobile("18695988747");
        user.setNote("cindy's note");
        user.setSex((byte) 2);
        user.setPositionId(1);
        System.out.println(mapper.updateIfOper(user));
//      System.out.println(mapper.updateIfAndSetOper(user));

    }

有问题,当position没有时,会多余一个逗号。

  • 优雅的解决方法——使用set
   
        update t_user
        
            
                user_name = #{userName,jdbcType=VARCHAR},
            
            
                real_name = #{realName,jdbcType=VARCHAR},
            
            
                sex = #{sex,jdbcType=TINYINT},
            
            
                mobile = #{mobile,jdbcType=VARCHAR},
            
            
                email = #{email,jdbcType=VARCHAR},
            
            
                note = #{note,jdbcType=VARCHAR},
            
            
                position_id = #{positionId,jdbcType=INTEGER},
            
        
        where id = #{id,jdbcType=INTEGER}
    

4.动态插入语句

   
        insert into t_user (
        
            id,
        
        
            user_name,
        
        
            real_name,
        
        
            sex,
        
        
            mobile,
        
        
            email,
        
        
            note,
        
        
            position_id
        
        )
        values(
        
            #{id,jdbcType=INTEGER},
        
        
            #{userName,jdbcType=VARCHAR},
        
        
            #{realName,jdbcType=VARCHAR},
        
        
            #{sex,jdbcType=TINYINT},
        
        
            #{mobile,jdbcType=VARCHAR},
        
        
            #{email,jdbcType=VARCHAR},
        
        
            #{note,jdbcType=VARCHAR},
        
        
            #{positionId,jdbcType=INTEGER}
        
        )
    

测试代码:

    @Test
    // if用于insert,并与trim配合
    public void testInsertIfOper() {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

        TUser user = new TUser();
        user.setUserName("mark");
        user.setRealName("毛毛");
        user.setEmail("[email protected]");
        user.setMobile("18695988747");
        user.setNote("mark's note");
        user.setSex((byte) 1);
        user.setPositionId(1);
        System.out.println(mapper.insertIfOper(user));
//      System.out.println(mapper.insertSelective(user));
    }

有问题,当position没有时,会多余一个逗号。

  • 优雅的解决方法——使用trim
   
        insert into t_user
        
            
                id,
            
            
                user_name,
            
            
                real_name,
            
            
                sex,
            
            
                mobile,
            
            
                email,
            
            
                note,
            
            
                position_id,
            
        
        
            
                #{id,jdbcType=INTEGER},
            
            
                #{userName,jdbcType=VARCHAR},
            
            
                #{realName,jdbcType=VARCHAR},
            
            
                #{sex,jdbcType=TINYINT},
            
            
                #{mobile,jdbcType=VARCHAR},
            
            
                #{email,jdbcType=VARCHAR},
            
            
                #{note,jdbcType=VARCHAR},
            
            
                #{positionId,jdbcType=INTEGER},
            
        
    

5.foreach

List selectForeach4In(String[] names);
    

其中collection可以是array/ list/ map。

测试程序:

    @Test
    // Foreach用于in查询
    public void testForeach4In() {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

        String[] names = new String[]{"lison","james"};
        List users = mapper.selectForeach4In(names);
        System.out.println(users.size());
    }

结果:

2018-09-24 16:17:28.262 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectForeach4In - ==>  Preparing: select id, user_name, real_name, sex, mobile, email, note, position_id from t_user a where a.user_name in ( ? , ? ) 
2018-09-24 16:17:28.308 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectForeach4In - ==> Parameters: lison(String), james(String)
2018-09-24 16:17:28.328 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectForeach4In - <==      Total: 2
2

5.1 批量操作

int insertForeach4Batch(List users);
    
        insert into t_user (user_name, real_name,
        sex, mobile,email,note, position_id)
        values
        
            (
            #{user.userName,jdbcType=VARCHAR},
            #{user.realName,jdbcType=VARCHAR},
            #{user.sex,jdbcType=TINYINT},
            #{user.mobile,jdbcType=VARCHAR},
            #{user.email,jdbcType=VARCHAR},
            #{user.note,jdbcType=VARCHAR},
            #{user.positionId,jdbcType=INTEGER}
            )
        
    

测试代码:

    @Test
    // Foreach用于批量插入
    public void testForeach4Insert() {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

        TUser user1 = new TUser();
        user1.setUserName("king");
        user1.setRealName("李小京");
        user1.setEmail("[email protected]");
        user1.setMobile("18754548787");
        user1.setNote("king's note");
        user1.setSex((byte)1);
        TUser user2 = new TUser();
        user2.setUserName("deer");
        user2.setRealName("陈大林");
        user2.setEmail("[email protected]");
        user2.setMobile("18723138787");
        user2.setNote("deer's note");
        user2.setSex((byte)1);


        int i = mapper.insertForeach4Batch(Arrays.asList(user1,user2));
        System.out.println(i);
    }

结果:

2018-09-24 16:20:27.404 [main] DEBUG c.e.mybatis.mapper.TUserMapper.insertForeach4Batch - ==>  Preparing: insert into t_user (user_name, real_name, sex, mobile,email,note, position_id) values ( ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ? ) 
2018-09-24 16:20:27.452 [main] DEBUG c.e.mybatis.mapper.TUserMapper.insertForeach4Batch - ==> Parameters: king(String), 李小京(String), 1(Byte), 18754548787(String), [email protected](String), king's note(String), null, deer(String), 陈大林(String), 1(Byte), 18723138787(String), [email protected](String), deer's note(String), null
2018-09-24 16:20:27.453 [main] DEBUG c.e.mybatis.mapper.TUserMapper.insertForeach4Batch - <==    Updates: 2
2

延伸:在Mysql中怎样进行批量操作

  • 1)通过foreach动态拼装SQL语句
insert into t_user (user_name, real_name, sex, mobile,email,note, position_id) values ( ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ? ) 
  • 2)通过JDBC的stmt.addBatch(sql)执行批量操作

  • 3)使用BATCH类型的executor

    @Test
    // 批量更新
    public void testBatchExcutor() {
        // 2.获取sqlSession
//        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, true);
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

        TUser user = new TUser();
        user.setUserName("mark");
        user.setRealName("毛毛");
        user.setEmail("[email protected]");
        user.setMobile("18695988747");
        user.setNote("mark's note");
        user.setSex((byte) 1);
        user.setPositionId(1);
        System.out.println(mapper.insertSelective(user));

        TUser user1 = new TUser();
        user1.setId(3);
        user1.setUserName("cindy");
        user1.setRealName("王美丽");
        user1.setEmail("[email protected]");
        user1.setMobile("18695988747");
        user1.setNote("cindy's note");
        user1.setSex((byte) 2);
        user1.setPositionId(1);
        System.out.println(mapper.updateIfOper(user1));

        sqlSession.commit();
        System.out.println("----------------");

    }

参考

  • 1)享学课堂Lison老师笔记

你可能感兴趣的:(动态SQL)