mybatis中insert语句动态sql篇「建议收藏」

mybatis中insert语句动态sql篇「建议收藏」在mybatis中如何把insert语句改成动态入参;原SQL语句如下:<!–插入user方法一–><insertid="addUser"parameterType="user">insertintosmbms_user(userCode,userName,userPassword,gender,addres

大家好,又见面了,我是你们的朋友全栈君。

在mybatis中如何把insert语句改成动态入参;
原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>

对于入参传入的是一个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{
   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的写法,如下

<!-- 动态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语句进行执行

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152500.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • SqlServer 函数Declare通过传变量查询超慢解决办法

    SqlServer 函数Declare通过传变量查询超慢解决办法from参考:1,Declare传参查询速度慢,直接放入参数执行sql却快,求大牛给原因2,OPTION(RECOMPILE)提高带参数执行SQL语句的索引效率 遇到的问题:通过参数执行sql函数查询速度超慢示例示例代码:class=”lang:tsqldecode:true”>declare@prefixnvarchar(10)=’095-0021-‘;…

    2022年8月22日
  • 原生js之字符串截取[通俗易懂]

    原生js之字符串截取[通俗易懂]字符串截取的方法有三种:slice(start,end+1),substring(start,end+1),substr(start,n).slice(start,end+1):两个参数时,参数指截取位置,截取含头不含尾;一个参数时,默认截取到字符串结尾。参数可以为负数,负数就倒着数位置。substring(start,end+1):两个参数时,参数指截取位置,截取含头不含…

    2022年5月24日
  • 硬盘分区显示磁盘上没有足够的空间完成此操作_您选择的分区可用空间不足

    硬盘分区显示磁盘上没有足够的空间完成此操作_您选择的分区可用空间不足在新的预装windows7的品牌机上,工作人员一般将磁盘分为C、D两个分区。但往往造成C盘有很大一部分的空间没办法分出来,而分出来的部分空间又不能和后面的磁盘合并,甚至出现无法新建简单卷的操作,即点

    2022年8月4日
  • Docker技术( 容器虚拟化技术 )「建议收藏」

    Docker虚拟化容器技术第一章Docker简介诞生背景Docker介绍虚拟机技术容器虚拟化技术官方网址第二章Docker安装前提条件安装DockerDocker底层原理Docker结构图工作原理Docker为什么比VM快第三章Docker常用命令帮助命令镜像命令容器命令第一章Docker简介诞生背景一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发…

    2022年4月10日
  • vue $attrs的使用

    vue $attrs的使用$attrs的使用vue$attrs是在vue的2.40版本以上添加的。项目中有多层组件传参可以使用$attrs,可以使代码更加美观,更加简洁,维护代码的时候更方便。如果使用普通的父子组件传参prop和$emit,$on会很繁琐;如果使用vuex会大材小用,只是在这几个组件中使用,没必要使用vuex;使用事件总线eventBus,使用不恰当的话,有可能会出现事件多次执行。如果给组件传递…

    2022年10月18日
  • 关于SecureCRT及Vim的使用

    关于SecureCRT及Vim的使用听说大部分的搞网络或者被网络搞的同学,每天都会使用SecureCRT在Linux下进行开发、测试等工作。正所谓“工欲善其事,必先利其器”,一个趁手的开发环境对工作效率的提升是不言而喻的。我在这里简单介绍一下个人在日常使用中积累下来的常用设置及操作,希望对不熟悉的朋友能有一点点参考作用,一家之言,欢迎拍砖。【SecureCRT篇】1、 自动登录服务器如果我们需要经常登录固定某

    2022年6月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号