MyBatis动态Sql语句

MyBatis动态Sql语句MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法MyBatis中用于实现动态SQL的元素主要有:ifchoose(when,otherwise)trimwheresetforeach1、if对属性进行判断,如果不为空则执行判断条件[html] view plain copy<select id="selectByCriteria" parameterType="com.mucfc.dto.Student" resultMap="BaseResultMap">select * from t_studentwhere<if test="stuId != null and stuId !=''">STU_ID = #{stuId}</if><if test="stuName != null and stuName !=''" >and STU_NAME = #{stuName}</if><if test="stuClass != null and stuClass !=''">and STU_CLASS = #{stuClass}</if><if test="stuSex != null and stuSex !=''">and STU_SEX=#{stuSex}</if><if test="stuAge != null and stuAge !=''">and STU_AGE=#{stuAge}</if></select>来看看结果:这是从web页面输入的参数这是输出的结果这是打印出来的Sql语句从结果可以看出,只有在条件不为空的时候,属性才会赋值。

2、where当where中的条件使用的if标签较多时,这样的组合可能会导致错误。

我们以在1中的查询语句为例子,当输入参数stuId为空时,就会报错然后是输出的结果:此时SQL语句变成了select * from t_student where and STU_SEX=?这样会报错如果上面例子,参数stuId为null,将不会进行STUDENT_NAME列的判断,则会直接导“WHERE AND”关键字多余的错误SQL。

这时我们可以使用where动态语句来解决。

这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。

此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

可以改成如下:[html] view plain copy<select id="selectByCriteria" parameterType="com.mucfc.dto.Student" resultMap="BaseResultMap">select * from t_student<where><if test="stuId != null and stuId !=''">STU_ID = #{stuId}</if><if test="stuName != null and stuName !=''" >and STU_NAME = #{stuName}</if><if test="stuClass != null and stuClass !=''">and STU_CLASS = #{stuClass}</if><if test="stuSex != null and stuSex !=''">and STU_SEX=#{stuSex}</if><if test="stuAge != null and stuAge !=''">and STU_AGE=#{stuAge}</if></where></select>再来看看,输入查询条件然后输出结果打印出来的SQL语句- ==> Preparing: select * from t_student WHERE STU_SEX=?==> Parameters: 男(String)<== Total: 14说明结果是正确的。

如果它包含的标签中有返回值的话就插入一个where。

此外如果标签返回的内容是以AND或OR开头的,则它会剔除掉。

3、set当update语句中没有使用if标签时,如果有一个参数为null,都会导致错误。

当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。

使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。

使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值。

如下示例:4、trimtrim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。

[html] view plain copy<select id="selectByCriteria" parameterType="com.mucfc.dto.Student" resultMap="BaseResultMap">select * from t_student<trim prefix="where" prefixOverrides="AND|OR"><if test="stuId != null and stuId !=''">STU_ID = #{stuId}</if><if test="stuName != null and stuName !=''" >and STU_NAME = #{stuName}</if><if test="stuClass != null and stuClass !=''">and STU_CLASS = #{stuClass}</if><if test="stuSex != null and stuSex !=''">and STU_SEX=#{stuSex}</if><if test="stuAge != null and stuAge !=''">and STU_AGE=#{stuAge}</if></trim></select>首先判断是否需要where,如果需要,它会自动判断如果where后面有and或者or,就自动把它们都去掉。

prefix是前置的,还有suffix是后置的。

如下输入查找参数stuclass=2。

看看打印出来的语句suffix是后置的例子[html] view plain copy<insert id="insert" parameterType="com.mucfc.dto.Student" >insert into t_student<trim prefix="(" suffix=")" suffixOverrides="," ><if test="stuId != null" >STU_ID,</if><if test="stu_name!= null" >STU_NAME,</if></trim><trim prefix="values (" suffix=")" suffixOverrides="," ><if test="stuId != null" >#{stuId},</if><if test="stu_name != null" >#{stu_name},</if><pre name="code" class="html"> </insert</pre><br>这里是自动判断是否为空,然后去掉逗号[html] view plain copyprefix="(" suffix=")"会自动判断是否需要加上()这个符号5、choose有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。

而使用if 标签时,只要test中的表达式为true,就会执行if标签中的条件。

MyBatis提供了choose 元素。

if标签是与(and)的关系,而choose比傲天是或(or)的关系。

choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。

当choose中所有when的条件都不满则时,则执行otherwise中的sql。

类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。

[html] view plain copy<!-- 满足其中一个条件时候用choose when操作--><select id="selectByCriteria" parameterType="com.mucfc.dto.Student" resultMap="BaseResultMap">select * from t_student<where><choose><when test="stuId != null and stuId !=''">STU_ID = #{stuId}</when><when test="stuClass != null and stuClass !=''">and STU_CLASS = #{stuClass}</when><otherwise></otherwise></choose></where></select>输入两个参数这里会跳过王五这个参数,因为stuId不为空然后看打印了来的语句,果然只有一个条件,所以说明是对的foreach对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。

合集下载

Mybatis中动态SQL,if,where,foreach的使用教程详解

Mybatis中动态SQL,if,where,foreach的使用教程详解

Mybatis中动态SQL,if,where,foreach的使⽤教程详解MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们⽅便的在SQL语句中实现某些逻辑。

MyBatis中⽤于实现动态SQL的元素主要有:ifchoose(when,otherwise)trimwheresetforeachmybatis核⼼对sql语句进⾏灵活操作,通过表达式进⾏判断,对sql进⾏灵活拼接、组装。

1、statement中直接定义使⽤动态SQL:在statement中利⽤if 和 where 条件组合达到我们的需求,通过⼀个例⼦来说明:原SQL语句:<select id="findUserByUserQuveryVo" parameterType ="UserQueryVo" resultType="UserCustom">select * from userwhere username = #{ername} and sex = #{userCustom.sex}</select>现在需求是,如果返回值UserCustom为空或者UserCustom中的属性值为空的话(在这⾥就是ername或者userCustom.sex)为空的话我们怎么进⾏灵活的处理是程序不报异常。

做法利⽤if和where判断进⾏SQL拼接。

<select id="findUserByUserQuveryVo" parameterType ="UserQueryVo" resultType="UserCustom">select * from user<where><if test="userCustom != null"><if test="ername != null and ername != ''"><!-- 注意and不能⼤写 -->and username = #{ername}</if><if test="userCustom.sex != null and userCustom.sex != ''">and sex = #{userCustom.sex}</if></if></where></select>有时候我们经常使⽤where 1=1这条语句来处理第⼀条拼接语句,我们可以使⽤< where > < where />来同样实现这⼀功能。

mybatis使用动态sql模糊查询写法

mybatis使用动态sql模糊查询写法

mybatis使用动态sql模糊查询写法1. 引言1.1 概述本文旨在介绍使用MyBatis进行动态SQL模糊查询的写法。

随着互联网技术的发展和数据量的增加,对数据库的模糊查询需求也越来越多。

而动态SQL是MyBatis框架提供的一种强大的查询特性,可以根据不同条件生成相应的SQL 语句,非常适用于模糊查询场景。

1.2 文章结构本文共包括五个部分。

首先,我们会简要介绍MyBatis动态SQL的概念及其作用;接着,详细介绍了动态SQL语句的分类。

然后,重点围绕动态SQL模糊查询展开讲解,包括使用like关键字和concat函数进行模糊查询两种常见写法。

之后,在示例与解析部分,我们将分别给出三个实际案例来演示如何使用动态SQL进行模糊查询,并进行详尽解析。

最后,我们将在结论与总结部分回顾文章内容,并对MyBatis动态SQL的优势和应用场景进行总结。

1.3 目的通过本文,读者将能够全面掌握使用MyBatis进行动态SQL模糊查询的写法,并了解到其在实际开发中的应用。

同时,本文还旨在引导读者深入了解MyBatis 框架的核心特性和灵活查询的技巧,从而提升数据库模糊查询的效率和准确性。

对于开发人员而言,这将是一篇实用且具有指导意义的文章。

2. MyBatis动态SQL概述2.1 MyBatis简介MyBatis是一个开源的持久化框架,它可以将数据库和Java对象之间的映射关系进行配置,并通过XML或注解方式实现对数据库的访问。

MyBatis提供了丰富的功能和灵活性,使得开发者能够更加方便地进行数据持久化操作。

2.2 动态SQL的作用动态SQL是MyBatis中一项非常重要的特性。

它允许我们根据不同条件来动态生成SQL语句,在遇到不同情况时执行不同的数据库操作。

这样可以大大提升程序的灵活性和可维护性。

2.3 动态SQL语句的分类在MyBatis中,动态SQL语句主要分为四类:- if判断:通过if标签来判断某个条件是否成立,根据条件结果来决定是否包含某部分SQL语句。

mybatis 动态sql if用法

mybatis 动态sql if用法

电子合同存证服务合同甲方(以下简称“甲方”):公司名称:法定代表人姓名:注册地址:乙方(以下简称“乙方”):公司名称:法定代表人姓名:注册地址:鉴于甲方拥有一定的电子合同存证服务能力,乙方希望委托甲方为其提供电子合同存证服务,各方经友好协商,达成如下协议:第一条服务内容1.1甲方应根据乙方的需求,为其提供电子合同存证服务,具体服务内容如下:(1)检验、验证和签署电子合同的真实性和完整性;(2)为电子合同提供可追溯的时间戳;(3)提供电子合同存证的相关证明文件;(4)确保电子合同数据的安全性和保密性;(6)其他甲方与乙方约定的服务。

1.2甲方应按照服务内容及时、准确地向乙方提供相关服务。

乙方应根据甲方的要求提供相应的合同、协议等信息,以便甲方进行存证操作。

1.3乙方委托甲方存证的电子合同应符合国家法律法规规定的合法合同,甲方不对电子合同的内容、效力和合法性承担责任。

第二条服务费用及支付方式2.1乙方向甲方支付的服务费用为每份电子合同存证服务收费XXXX元。

2.2服务费用的支付方式为:(1)乙方应在甲方提供存证服务后的7个工作日内,将应付费用以现金/银行转账/电汇等方式支付至甲方指定的账户;(2)乙方应提供相应的付款凭证给予甲方,以便甲方核查。

2.3如乙方逾期未支付服务费用,甲方有权采取如下措施之一或多项:(1)中止电子合同存证服务;(2)要求乙方支付延迟履行的违约金;(3)要求乙方支付逾期履行的滞纳金;(4)追究乙方的违约责任。

第三条保密义务3.1甲方应对乙方委托存证的电子合同数据严格保密,不得泄露、篡改或非法使用。

3.2甲方不得将乙方的电子合同数据提供给任何第三方,除非取得乙方书面同意或法律法规另有规定。

3.3乙方如发现甲方存在泄露、篡改或非法使用电子合同数据等违法违规行为,有权要求甲方承担相应的法律责任,并取得相应的赔偿。

第四条风险责任4.1由于电子合同存证服务所涉及的信息传输和数据存储,可能面临各种风险,包括但不限于网络故障、黑客攻击、系统崩溃等。

06-Mybatis中的传参、属性和动态SQL

06-Mybatis中的传参、属性和动态SQL

06-Mybatis中的传参、属性和动态SQL 1、mybatis中参数传递1.1 MyBatis中对sql语句参数的传递这⾥要明⽩⼀点,由于mybatis是在dao层起作⽤,dao层的接⼝中定义了和⼀个sql映射⽂件中各条sql语句的⽅法,就是说接⼝中的⽅法中需要传递的参数都是与sql语句中需要的参数对应的,那么映射⽂件中每个sql语句中添加parameterType属性以指定传递参数是什么类型就变得可有可⽆了。

1、--⼀个参数的传递这类情况就是mapper⽂件中的sql语句只需要⼀个参数,如按表中id查询数据。

传递⼀个参数⼀般都是传递简单数据类型,dao接⼝中的⽅法⼀般如下:public User selectUserById(Integer id);映射⽂件中的sql语句的占位符中变量名可以随便写:select * from t_user where id=#{随便写}当我们⽤接⼝实现类对象调⽤selectUserById时,动态代理⽣成的实现类中调⽤SqlSession对象的selectOne⽅法,将整型参数传进去,因为sql语句中只需要⼀个参数,这个值怎么传都会传给sql中的参数位置,所以在占位符中特意指定接收属性的参数值。

2、--多参数传递这类情况就是mapper⽂件中的sql语句需要多个参数,如按表中id和(或)name查询数据,或者是insert操作,亦或是update操作等等。

多参传递有多种⽅式:--1)注解@Param命名参数传参--(掌握)@Param("参数名") 数据类型变量名dao接⼝⽅法中参数定义如下:public List<User> selectByNameOrId(@Param("loginName") String name,@Param("id") Integer id);当调⽤该⽅法时内部是将我们输⼊的name(id)参数的值以注解中定义的参数名为key存储到⼀个集合中(这只是猜测),所以sql语句中的占位符中填写正确的对应参数名#{}--当然sql中的条件⼀般都是表中的字段,所以参数名都是按表中对应字段命名。

Mybatis中的update动态SQL语句

Mybatis中的update动态SQL语句

Mybatis中的update动态SQL语句Mybatis中的CRUD操作(增删改查)中,简单的SQL操作⽐较直观,如查找操作:<select id="findBySrcId" resultMap="entityRelationResultMap">SELECT * FROM ENTITY_RELATION WHERE SRC_ID=#{srcId}</select>其中id对应同名java⽂件中的⽅法,resultMap对应的⾃定义的数据类型(当使⽤java⾃带类型就更容易了,⽐如ng.String之类的)。

但是涉及到更新操作时,可能不需要对所有字段更新,这时不需要更新的字段需要保持原字段信息,当使⽤以下信息就会报错:<update id="updateOne" parameterType="com.inspur.search.data.EntityRelation">update ENTITY_RELATION SET SRC_ID=#{srcId},SRC_TYPE=#{srcType},DEST_ID=#{destId},DEST_TYPE=#{destType},REL_TYPE=#{relType},STATUS=#{status},SN_ID=#{snId}where id=#{id}</update>因为不更新的字段,会被传递null到SQL中,引起异常。

这时就需要进⾏动态SQL拼接,如下,使⽤trim就是为了删掉最后字段的“,”。

主要不⽤单独写SET了,因为set被包含在trim中了:<update id="updateOne" parameterType="com.inspur.search.data.EntityRelation">UPDATE ENTITY_RELATION<trim prefix="set" suffixOverrides=","><if test="srcId!=null">SRC_ID=#{srcId},</if><if test="srcType!=null">SRC_TYPE=#{srcType},</if><if test="destId!=null">DEST_ID=#{destId},</if><if test="destType!=null">DEST_TYPE=#{destType},</if><if test="relType!=null">REL_TYPE=#{relType},</if><if test="status!=null">STATUS=#{status},</if><if test="snId!=null">SN_ID=#{snId},</if></trim>WHERE id=#{id}</update>。

MyBatis动态SQL————MyBatis动态SQL标签的用法

MyBatis动态SQL————MyBatis动态SQL标签的用法

MyBatis动态SQL————MyBatis动态SQL标签的⽤法1.MyBatis动态SQLMyBatis 的强⼤特性之⼀便是它的动态 SQL,即拼接SQL字符串。

如果你有使⽤ JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。

拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。

利⽤动态 SQL 这⼀特性可以彻底摆脱这种痛苦。

通常使⽤动态 SQL 不可能是独⽴的⼀部分,MyBatis 当然使⽤⼀种强⼤的动态 SQL 语⾔来改进这种情形,这种语⾔可以被⽤在任意的 SQL 映射语句中。

动态 SQL 元素和使⽤ JSTL 或其他类似基于 XML 的⽂本处理器相似。

在 MyBatis 之前的版本中,有很多的元素需要来了解。

MyBatis 3 ⼤⼤提升了它们,现在⽤不到原先⼀半的元素就可以了。

MyBatis 采⽤功能强⼤的基于 OGNL 的表达式来消除其他元素。

2.动态SQL标签:if,choose (when, otherwise),trim (where, set),foreach2.1 if标签:直接上代码<select id="queryByIdAndTitle"resultType="Blog">SELECT * FROM BLOGWHERE 1=1<if test="id!= null and title!=null">AND id=#{id} and title=#{title}</if></select>注:if标签⼀般⽤于⾮空验证,如上例,若id为空,if标签⾥的代码,将不会执⾏,反之,则会执⾏。

2.2 choose(when,otherwise)标签:直接上代码<select id="queryBy"resultType="Blog">SELECT * FROM BLOG WHERE 1=1<choose><when test="title != null">AND title like #{title}</when><otherwise>AND id= 1</otherwise></choose></select>注:choose(when,otherwise)标签相当于switch(case,default) ,如上例,若title 为空,when标签⾥的代码,将不会执⾏,默认执⾏otherwise 标签⾥⾯的代码。

MyBatis之动态SQL:if、choose、when、otherwise、where、。。。

MyBatis之动态SQL:if、choose、when、otherwise、where、。

动态 SQL 是 MyBatis 的强⼤特性之⼀。

如果你使⽤过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后⼀个列名的逗号。

利⽤动态 SQL,可以彻底摆脱这种痛苦。

使⽤动态 SQL 并⾮⼀件易事,但借助可⽤于任何 SQL 映射语句中的强⼤的动态 SQL 语⾔,MyBatis 显著地提升了这⼀特性的易⽤性。

如果你之前⽤过 JSTL 或任何基于类 XML 语⾔的⽂本处理器,你对动态 SQL 元素可能会感觉似曾相识。

在 MyBatis 之前的版本中,需要花时间了解⼤量的元素。

借助功能强⼤的基于 OGNL 的表达式,MyBatis 3 替换了之前的⼤部分元素,⼤⼤精简了元素种类,现在要学习的元素种类⽐原来的⼀半还要少。

⼀、if —— 只要为true就加上后⾯的sql 使⽤动态 SQL 最常见情景是根据条件包含 where ⼦句的⼀部分。

⽐如:<select id="findActiveBlogWithTitleLike" resultType="Blog">SELECT * FROM BLOGWHERE state = ‘ACTIVE’<if test="title != null">AND title like #{title}</if></select> 这条语句提供了可选的查找⽂本功能。

如果不传⼊ “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传⼊了 “title” 参数,那么就会对 “title” ⼀列进⾏模糊查找并返回对应的 BLOG 结果(细⼼的读者可能会发现,“title” 的参数值需要包含查找掩码或通配符字符)。

Mybatis动态SQL(where元素、set元素、if元素)

Mybatis动态SQL(where元素、set元素、if元素)Mybatis动态SQL(where元素、set元素、if元素)- where元素只会在⾄少有⼀个⼦元素的条件返回 SQL ⼦句的情况下才去插⼊“WHERE”⼦句。

⽽且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

(也就是说where⽤在有多条if的条件的查询中,同时会过滤掉语句开头的AND、OR)- if 元素可以对给予的对象再进⾏⼀次判断- set元素可以⽤于动态包含需要更新的列,⽽舍去其它的。

1、创建⼀个⽤于搜索的动态SQl(1)、在表对应的配置⽂件的mapping中加⼊以下select标签(那么它再查找的时候就会先对其元素判空)1<select id="search" resultMap="userMap">2 select * from usr13<where>4<if test="username!=null">5 and username=#{username}6</if>7<if test="password!=null">8 and password=#{password}9</if>10</where>11</select>(2)、在主⽅法中加⼊以下代码,(加载相应的配置⽂件,查询⽤户名为getchar、密码为1234的⽤户是否存在,这种判断在⽤户登录中往往⽐较有⽤)1 config = Resources.getResourceAsStream("mybatis-config.xml");2 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);34 SqlSession session = factory.openSession();5 UserDAO userDAO = session.getMapper(UserDAO.class);6 User u = new User();7 u.setPassword("1234");8 u.setUsername("getchar");9 List<User> users = userDAO.search(u);10 System.out.println(users.size());11 System.out.println(users);(3)、这样实现查询的时候,就可以实现判断密码和账号是否为空。

MyBatis中动态SQL元素的使用

MyBatis中动态SQL元素的使⽤掌握MyBatis中动态SQL元素的使⽤ifchoose(when,otherwise)trimwheresetforeach<SQL>和<include>在应⽤中我们经常会做⼀些动态的拼接条件,但是如果是JDBC我们可以⽤程序拼接SQL语句,如果MyBatis,我们可以使⽤动态SQL语句。

例如按照员⼯姓名和⼯资来搜索员⼯信息,如果如果姓名和⼯资的检索值为空,则忽略这个检索条件。

⼀般来说,我们都会⽤where 1=1类似这种写法来实现,但是MyBatis就需要动态语句实现。

1 if元素mapper.xml1<select id="selectStudentByCondition" parameterType="student" resultMap="BaseResultMap">2 select * from student where 1=13<!-- 当传⼊的属性值为空或者空字符串时会忽略掉条件4注意:test中的pojo中的属性名称5 like的使⽤6 <![CDATA[ ]]>的使⽤-->7<if test="stuName !=null and stuName != ''">8 and stu_name like '%' ||#{stuName}||'%'9</if>10<if test="stuBirthdate != null">11<![CDATA[and stu_birthdate>#{stuBirthdate}]]>12</if>13</select>daoImpl.java1 @Override2public void testQuery6(Student s){3 SqlSession session = fac.openSession();4 List<Student> result = session.selectList("student.selectStudentByCondition",s);5for (Student s1 : result) {6 System.out.println("s1 id=" + s1.getStuId());7 System.out.println("s1 name=" + s1.getStuName());8 System.out.println("s1 Birthdate=" + s1.getStuBirthdate());9 }10 session.close();11 }测试1public static void main(String[] args) throws Exception {2//创建要保存的学⽣信息3 Student s = new Student();4 s.setStuName("zhou");5 s.setStuBirthdate(new SimpleDateFormat("yyyy-MM-dd").parse("1991-1-12"));67 StudentDao sdao = new StudentDaoImpl(fac);8 sdao.testQuery6(s);9 }2 choose元素choose元素相当于java语句的if … else if …else语句1<!-- 动态SQL:choose标签 -->2<select id="queryByCondition2" parameterType="student " resultMap="BaseResultMap">3 select * from student where 1=14<choose>5<when test="stuName != null and stuName != ''">6 and stu_name=#{stuName}7</when>8<when test="stuBirthdate != null">9 and stu_birthdate=#{stuBirthdate}10</when>11<otherwise>12 and stu_phone=#{stuPhone}13</otherwise>14</choose>15</select>3 WHERE元素使⽤where元素会⾃动根据条件的个数增删where语句and运算符,所以不需要写where 1=1之类的语句1<!-- 动态SQL:where标签 -->2<select id="queryByCondition3" parameterType="student " resultMap="BaseResultMap">3 select * from student4<where>5<if test="stuName != null and stuName != ''">6 and stu_name=#{stuName}7</if>8<if test="stuBirthdate != null">9 and stu_birthdate=#{stuBirthdate}10</if>11<if test="stuPhone != null and stuPhone != ''">12 and stu_phone=#{stuPhone}13</if>14</where>15</select>4 Trim元素trim元素的主要功能是可以在⾃⼰包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的⾸部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides1<!-- 动态SQL:trim标签 -->2<select id="queryByCondition4" parameterType="student " resultMap="BaseResultMap">3 select * from student4<trim prefix="where" prefixOverrides="and|or">5<if test="stuName != null and stuName != ''">6 and stu_name=#{stuName}7</if>8<if test="stuBirthdate != null">9 and stu_birthdate=#{stuBirthdate}10</if>11<if test="stuPhone != null and stuPhone != ''">12 or stu_phone=#{stuPhone}13</if>14</trim>15</select>5 foreach元素foreach的主要⽤在构建in条件中,它可以在SQL语句中进⾏迭代⼀个集合。

MyBatis 动态批量插入sql语句方法

MyBatis 动态批量插入sql语句方法MyBatis实现动态批量插入的SQL语句可以采用foreach标签,具体方法如下:XML映射文件:xml<insert id="batchInsert">insert into USER (NAME, AGE)<foreach collection="list" item="item" separator="union all">(#{},#{item.age})</foreach></insert>Java代码:javaList<User> list = new ArrayList<>();list.add(new User("John", 20));list.add(new User("Tom", 25));list.add(new User("Jack", 30));SqlSession session = sqlSessionFactory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);mapper.batchInsert(list);mit();最后生成的SQL语句为:sqlinsert into USER (NAME, AGE)values('John', 20)union allvalues('Tom', 25)union allvalues('Jack', 30)通过foreach标签,动态拼接了多条insert语句,并使用union all连接,最终实现了批量插入。

主要特点:1. 将需要批量插入的数据封装在List集合中2. 在foreach标签内,使用#{item.属性}的方式访问集合中的每条记录3. 使用separator属性,指定union all连接多条insert语句4. 将封装好的List集合,作为参数传入mapper方法,执行批量插入批量插入能有效减少数据库交互次数,提高插入效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档