mybatis中insert语句动态sql篇
在mybatis中如何把insert语句改成动态⼊参;
原SQL语句如下:
<!-- 插⼊user⽅法⼀ -->
<insert id="addUser" parameterType="user">
insert into smbms_user(userCode,userName,userPassword,gender,address,phone)
insert语句字段顺序
values(#{userCode},#{userName},#{userPassword},#{gender},#{address},#{phone})
</insert>
对于⼊参传⼊的是⼀个user对象,对象包含了userCode,userName,userPassword,gender,address,phone这些属性,
⼀般我们插⼊对象,插⼊什么属性就需要在sql语句中写上对应的字段名,然后在values中写上对应的字段名的值。如果插⼊场景很多,⽐如有此插⼊只需两个字段,有些插⼊只需三个字段,那我们就需要写
多个⽅法,多条对应的sql语句。mybatis⽀持动态sql,对于增、删、查、改都⽀持。下⾯我们来修改上⾯的⽰例语句。
⾸先对于⽰例代码:
<!-- 插⼊user⽅法⼀ -->
<insert id="addUser" parameterType="user">
insert into smbms_user(userCode,userName,userPassword,gender,address,phone)
values(#{userCode},#{userName},#{userPassword},#{gender},#{address},#{phone})
</insert>
我们在测试类⾥运⾏看⼀下console打印出来的sql语句,
我们传⼊所有对象的属性
//测试⽅法
@Test
public void test0() {
int count=0;
SqlSession sqlSession=null;
try{
ateSqlSession();
//调⽤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,userPasswor d,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), 2 1(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,userPasswor d,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的写法,如下
<!-- 动态sql插⼊⽅法⼆  start -->
<!-- 对应的插⼊字段的名字 -->
<sql id="key">
<trim suffixOverrides=",">
<if test="userCode!=null and userCode!=''">
userCode,
</if>
<if test="userName!=null and userName!=''">
userName,
</if>
<if test="userPassword!=null and userPassword!=''">    userPassword,
</if>
<if test="gender!=null and gender!=''">
gender,
</if>
<if test="address!=null and address!=''">
address,
</if>
<if test="phone!=null and phone!=''">
phone,
</if>
</trim>
</sql>
<!-- 对应的插⼊字段的值 -->
<sql id="values">
<trim suffixOverrides=",">
<if test="userCode!=null and userCode!=''">
#{userCode},
</if>
<if test="userName!=null and userName!=''">
#{userName},
</if>
<if test="userPassword!=null and userPassword!=''">    #{userPassword},
</if>
<if test="gender!=null and gender!=''">
#{gender},
</if>
<if test="address!=null and address!=''">
#{address},
</if>
<if test="phone!=null and phone!=''">
#{phone},
</if>
</trim>
</sql>
<insert id="addUser2" parameterType="user">
insert into smbms_user(<include refid="key"/>)
values(<include refid="values"/>)
</insert>
<!-- 动态sql插⼊⽅法⼆  end-->
然后⼊参如下 ,我们只赋值了两个属性:
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语句进⾏执⾏

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。