mybatis中insert语句动态sql篇

在mybatis中如何把insert语句改成动态入参;
原SQL语句如下:


  
   insert into smbms_user(userCode,userName,userPassword,gender,address,phone) 
    values(#{userCode},#{userName},#{userPassword},#{gender},#{address},#{phone})
  

对于入参传入的是一个user对象,对象包含了userCode,userName,userPassword,gender,address,phone这些属性,
一般我们插入对象,插入什么属性就需要在sql语句中写上对应的字段名,然后在values中写上对应的字段名的值。如果插入场景很多,比如有此插入只需两个字段,有些插入只需三个字段,那我们就需要写多个方法,多条对应的sql语句。mybatis支持动态sql,对于增、删、查、改都支持。下面我们来修改上面的示例语句。
首先对于示例代码:


  
   insert into smbms_user(userCode,userName,userPassword,gender,address,phone) 
    values(#{userCode},#{userName},#{userPassword},#{gender},#{address},#{phone})
  

我们在测试类里运行看一下console打印出来的sql语句,
我们传入所有对象的属性

//测试方法
@Test
 public void test0() {
  int count=0;
  SqlSession sqlSession=null;
   try{
   sqlSession=MyBatisUtil.createSqlSession(); 
   //调用Mapper文件来对数据进行操作,
   User user=new User();
   user.setUserCode("测试Code1");
   user.setUserName("测试用户1");
   user.setGender(21);
   user.setAddress("测试地址");
   user.setPhone("测试号码");
   user.setUserPassword("1111111");
   count=sqlSession.insert("cn.smbms.dao.user.UserMapper.addUser", user);
   logger.debug("UserMapperTest count:"+count); 
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    MyBatisUtil.closeSqlSession(sqlSession);
   }
   
 }

控制台输入的语句

[DEBUG] 2018-11-29 22:39:56,685 cn.smbms.dao.user.UserMapper.addUser - ==>  Preparing: insert into smbms_user(userCode,userName,userPassword,gender,address,phone) values(?,?,?,?,?,?) 
[DEBUG] 2018-11-29 22:39:56,716 cn.smbms.dao.user.UserMapper.addUser - ==> Parameters: 测试Code1(String), 测试用户1(String), 1111111(String), 21(Integer), 测试地址(String), 测试号码(String)

可以看出把我们写的sql语句完整输出出来的,
接下来我们给入参对象注释掉两个属性

User user=new User();
   user.setUserCode("测试Code1");
   user.setUserName("测试用户1");
   user.setGender(21);
   user.setAddress("测试地址");
   //user.setPhone("测试号码");
   //user.setUserPassword("1111111");

测试类运行后看console

[DEBUG] 2018-11-29 22:44:31,866 cn.smbms.dao.user.UserMapper.addUser - ==>  Preparing: insert into smbms_user(userCode,userName,userPassword,gender,address,phone) values(?,?,?,?,?,?) 
[DEBUG] 2018-11-29 22:44:31,896 cn.smbms.dao.user.UserMapper.addUser - ==> Parameters: 测试Code1(String), 测试用户1(String), null, 21(Integer), 测试地址(String), null

可以看出sql语句依然完整打印出来了,只是我们未入参的属性注入的值为null

现在更改示例sql的写法,如下


  
  
   
    
     userCode,
    
    
     userName,
    
    
     userPassword,
    
    
     gender,
    
    
     address,
    
    
     phone,
    
   
  
  
  
  
   
    
     #{userCode},
    
    
     #{userName},
    
    
     #{userPassword},
    
    
     #{gender},
    
    
     #{address},
    
    
     #{phone},
    
   
  
  
   insert into smbms_user() 
    values()
  
    

然后入参如下 ,我们只赋值了两个属性:

User user=new User();
   user.setUserCode("测试Code1");
   user.setUserName("测试用户1");
   //user.setGender(21);
   //user.setAddress("测试地址");
   //user.setPhone("测试号码");
   //user.setUserPassword("1111111");

测试类运行后console显示的sql语句为:

[DEBUG] 2018-11-29 22:49:50,726 cn.smbms.dao.user.UserMapper.addUser2 - ==>  Preparing: insert into smbms_user( userCode, userName ) values( ?, ? ) 
[DEBUG] 2018-11-29 22:49:50,756 cn.smbms.dao.user.UserMapper.addUser2 - ==> Parameters: 测试Code1(String), 测试用户1(String)

可以发现mybatis执行sql语句会动态根据我们的入参来执行sql语句,如此,我们无论插入多少字段,只需在xml中写一条sql语句 在映射接口中写一个方法就可以了,mybatis会动态的为我们生成sql语句进行执行

你可能感兴趣的:(mybatis)