mybatis教程之动态sql语句
- 格式:pdf
- 大小:764.59 KB
- 文档页数:12
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模糊查询写法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语句。
电子合同存证服务合同甲方(以下简称“甲方”):公司名称:法定代表人姓名:注册地址:乙方(以下简称“乙方”):公司名称:法定代表人姓名:注册地址:鉴于甲方拥有一定的电子合同存证服务能力,乙方希望委托甲方为其提供电子合同存证服务,各方经友好协商,达成如下协议:第一条服务内容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由于电子合同存证服务所涉及的信息传输和数据存储,可能面临各种风险,包括但不限于网络故障、黑客攻击、系统崩溃等。
MyBatis动态SQL第⼀篇之实现多条件查询(if、where、trim标签)⼀、动态SQL概述以前在使⽤JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是⼀件痛苦的事情。
通常的解决⽅法是写很多的if-else条件语句对字符串进⾏拼接,并确保不能忘了空格或在字段的最后省略逗号。
MyBatis使⽤动态SQL来改善这种情形,动态SQL是基于OGNL的表达式,可⽅便我们在SQL语句中实现某些逻辑。
⽤于实现动态SQL的元素如下。
if:利⽤if实现简单的条件选择choose(when,otherwise):相当于Java中的switch语句,通常与when和otherwise搭配使⽤set:解决动态更新语句trim:可以灵活的去除多余的关键字foreach:迭代⼀个集合,通常⽤于in条件⼆、if⽤法在查询条件不是很多并且较为固定的情况下,最好的解决⽅案是采⽤多参数直接⼊参的⽅式,这样代码⽐较清晰,可读性强。
如下public interface UserMappper{public List<User> getUserList(@Param("userName") String userName,@Param("userRole") Integer roleId);}<select id="getUserList" resultMap="userList">select u.*, r.roleName from smbms_user u, smbms_role rwhere erName like connect ('%', #{userName}, '%')and erRole=#{userRole} and erRole=r.id</select>在上述代码中,参数使⽤了@Param注解,并将参数roleId重命名为userRole测试上述代码,如下在两个条件都给出的情况下,如String userName="孙"; Integer roleId=3,此时会输出正确结果;若传⼊的⽤户⾓⾊roleId为空,即只按⽤户名称进⾏模糊查询,如String userName="孙"; Integer roleId=null,此时输出的结果不满⾜需求:没有输⼊⽤户⾓⾊的情况下,只根据⽤户名称进⾏模糊查询的需求;若传⼊的⽤户⽤户名称userName为“”(空字符串),roleId有值(roleId=3),此时结果是正确的;针对上述这种某字段⽤户输⼊可能为空的情况,我们使⽤动态SQL的if元素来实现多条件查询,如下<select id="getUserList" resultMap="userList">select u.*, r.roleName from smbms_user u, smbms_role r where erRole=r.id<if test="userRole != null"> and erRole = #{userRole}</if><if test="userName != null and userName != ''"> and erName like concat('%', #{userName}, '%')</if></select>在上述代码中,利⽤if元素实现简单的条件判断,if元素的test属性表⽰进⼊if内需要满⾜的条件。
mybatis的动态sql之iftest的使⽤说明参数为String,if test读取该参数代码<select id="getMaxDepartId" parameterType="ng.String" resultType="ng.String">SELECT MAX(DEPART_ID) FROM T_P_DEPART<where><if test="_parameter!=null and _parameter!=''">AND DEPART_PID = #{departId,jdbcType=VARCHAR}</if><if test="_parameter==null or _parameter==''">AND DEPART_PID IS NULL</if></where></select>参数为pojo , if test读取该参数代码<select id="findShopByName" parameterType="ShopVo" resultType="ShopCustomer">select * from shop<where><if test="shopCustomer.shopname!=null and shopCustomer.shopname!=''">shop.shopname like '%${shopCustomer.shopname}%'</if><if test="shopCustomer.shopname==null or shopCustomer.shopname==''">AND shop.shopname is null</if></where></select>补充:关于mybatis中 if test的条件怎么写1.mybatis 中的 if test写法1.1官⽅⽂档上对于if是这么写的<if test="title != null">AND title like #{title}</if>参考官⽅⽂档:实际项⽬中会有这种情况: 页⾯上title字段输⼊某个值进⾏查询,⼿动将输⼊框中的值删除,然后再次查询,发现结果不正确,究其原因是应为title传⼊了空串" " 这样在mybatis配置⽂件中就会⽤空串进⾏查询,导致出现错误结果1.2建议写法<if test="title != null and title != ''" >AND title like #{title}</if>2.使⽤mybatis 做修改时将字段置空if中如果传⼊的参数如果为空,那么将不会执⾏if中的语句解决办法:<update id="updateObject" parameterType="*.*.Object" >update table<set><if test="Object.fullName == null or Object.fullName ==''">full_name = null,</if><if test="Object.fullName != null and Object.fullName !=''">full_name = #{companyOrg.fullName},</if><if test="Object.level == null or Object.level ==''">level = null,</if><if test="Object.level == 0 ">level = null,</if><if test="Object.level != null and Object.level !='' and Object.level != 0 ">level = #{companyOrg.level},</if></set>where 1=1 and id =#{companyOrg.id}</update>以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
mybatis的动态sql中修改的用法MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
在MyBatis中,动态SQL是一个非常实用的功能,可以用来生成复杂的SQL语句。
动态SQL包括动态SQL过滤器和动态SQL 映射文件。
本文将重点介绍MyBatis中动态SQL的修改用法。
一、动态SQL的用法MyBatis允许我们在XML映射文件中使用#{...}来创建动态SQL。
#{...}是一个变量占位符,可以用来插入变量或者表达式的结果。
通过使用#{...},我们可以动态地构建SQL语句,从而实现根据不同的条件来生成不同的查询语句。
二、修改动态SQL的方法1.使用#{}替代${}:${}将会被替换成Java代码字符串,而#{}则允许插入变量或表达式的结果。
使用#{...}可以避免SQL注入攻击,因为它只允许特定类型的字符被插入。
2.使用OGNL(Object-GraphNavigationLibrary)表达式:OGNL 表达式允许我们使用Java代码来访问对象的属性和方法。
在MyBatis 中,我们可以使用OGNL表达式来动态地访问对象的属性或调用方法,从而生成复杂的SQL语句。
3.使用SQL片段和动态SQL过滤器:MyBatis提供了一些内置的SQL片段,如SELECT、INSERT、UPDATE和DELETE等。
我们可以通过在XML映射文件中使用这些SQL片段来构建基本的动态SQL语句。
此外,MyBatis还支持自定义SQL过滤器,我们可以使用这些过滤器来扩展MyBatis的动态SQL功能。
三、修改动态SQL的示例下面是一个使用#{}和OGNL表达式来修改动态SQL的示例:假设我们有一个用户表,其中包含id、name和email三个字段。
我们想要根据不同的条件来查询用户数据。
首先,在XML映射文件中定义一个查询语句:```xml<selectid="selectUsers"resultType="er">SELECT*FROMuserWHERE1=1<iftest="name!=null">ANDname=#{name}</if><iftest="email!=null">ANDemail=#{email}</if></select>```在上述示例中,我们使用了#{...}来代替字符串插入,并且使用了OGNL表达式来访问用户的name和email属性。
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标签的⽤法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、。
动态 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语句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语句从结果可以看出,只有在条件不为空的时候,属性才会赋值。
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方法,执行批量插入批量插入能有效减少数据库交互次数,提高插入效率。
mybatis动态sql语句if基本语法MyBatis是一款流行的Java持久层框架,它提供了许多强大的功能,其中包括动态SQL语句的支持。
在MyBatis的动态SQL语句中,if 语句是非常常用的一个元素。
本文将介绍MyBatis动态SQL语句中if语句的基本语法。
1. 简单的if语句最基本的if语句是通过在SQL语句中使用if标签来实现的。
if 标签的使用格式如下:```<if test="条件">SQL语句</if>```这里的条件是一个表达式,如果表达式为true,则执行if标签内的SQL语句。
2. if-else语句在MyBatis的动态SQL语句中,我们还可以使用if-else语句来实现条件判断。
if-else语句的使用格式如下:```<if test="条件">SQL语句1</if><otherwise>SQL语句2</otherwise>```如果条件为true,则执行SQL语句1;否则执行SQL语句2。
3. 嵌套if语句在MyBatis的动态SQL语句中,我们可以使用嵌套if语句来进行多重条件判断。
嵌套if语句的使用格式如下:```<if test="条件1">SQL语句1<if test="条件2">SQL语句2</if></if>```如果条件1为true,则执行SQL语句1;如果条件2也为true,则执行SQL语句2。
4. if语句中使用参数在MyBatis的动态SQL语句中,我们可以使用参数来动态地构建SQL语句。
参数的使用格式如下:```<if test="参数 != null">SQL语句</if>```如果参数不为null,则执行if标签内的SQL语句。
MyBatis动态SQL标签用法where例子的等效trim语句:Xml代码<!-- 查询学生list,like姓名,=性别 --><select id="getStudentListWhere" parameterType="StudentEntity"resultMap="studentResultMap">SELECT * from STUDENT_TBL ST<trim prefix="WHERE" prefixOverrides="AND|OR"><if test="studentName!=null and studentName!='' ">ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')</if><if test="studentSex!= null and studentSex!= '' ">AND ST.STUDENT_SEX = #{studentSex}</if></trim></select>set例子的等效trim语句:Xml代码<!-- 更新学生信息 --><update id="updateStudent" parameterType="StudentEntity">UPDATE STUDENT_TBL<trim prefix="SET" suffixOverrides=","><if test="studentName!=null and studentName!='' ">STUDENT_TBL.STUDENT_NAME = #{studentName},</if><if test="studentSex!=null and studentSex!='' ">STUDENT_TBL.STUDENT_SEX = #{studentSex},</if><if test="studentBirthday!=null ">STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, </if><if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' ">STUDENT_TBL.CLASS_ID = #{classEntity.classID}</if></trim>WHERE STUDENT_TBL.STUDENT_ID = #{studentID};</update>12、choose (when, otherwise)有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。
mybatis sql语法MyBatis是一种持久层框架,它提供了一种将SQL语句与Java代码进行解耦的方式。
以下是MyBatis中常用的SQL语法:1. 查询语句:- SELECT:用于查询数据,可以使用WHERE子句进行条件过滤,使用ORDER BY子句进行排序。
- INSERT:用于插入数据。
- UPDATE:用于更新数据。
- DELETE:用于删除数据。
2. 参数传递:- 使用#{}来表示参数占位符,例如:SELECT * FROM table WHERE id = #{id}。
- 使用${}来表示参数替换,例如:SELECT * FROM table WHERE id = ${id}。
注意,使用${}可能存在SQL注入的风险,应尽量避免使用。
3. 动态SQL:- IF:用于条件判断,例如:SELECT * FROM table WHERE<if test="id != null">id = #{id}</if><if test="name != null">AND name = #{name}</if>- CHOOSE、WHEN、OTHERWISE:用于多条件判断,类似于Java中的switch 语句。
- FOREACH:用于循环遍历集合,例如:SELECT * FROM table WHERE id IN <foreach collection="ids" item="id" open="(" separator=","close=")">#{id}</foreach>4. 结果映射:- 使用<resultMap>标签定义结果映射关系,例如:<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/></resultMap>- 使用<association>标签定义关联关系,例如:<association property="department" javaType="Department"><id property="id" column="department_id"/><result property="name" column="department_name"/></association>以上是MyBatis中常用的SQL语法,通过使用这些语法,可以方便地进行数据库操作。
mybatis动态sqltest用法==========概述--MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
动态SQL则是MyBatis中的一个重要特性,它允许你在运行时构建SQL语句。
本篇文章将介绍MyBatis动态SQL的Test用法,帮助你更好地理解和使用动态SQL。
一、动态SQL的类型--------在MyBatis中,动态SQL主要由三种类型构成:1.`if`:根据条件判断,决定是否包含某个SQL片段。
2.`choose`、`when`、`otherwise`:类似于Java中的switch-case结构,根据条件执行不同的SQL片段。
3.`foreach`:用于迭代集合,生成批量插入的SQL语句。
二、Test用法详解--------Test是MyBatis提供的一个标签,用于在XML映射文件中构建动态SQL。
它的用法非常灵活,可以结合其他标签来构建复杂的SQL语句。
###1.使用Test构建条件判断可以使用Test标签结合if标签来构建条件判断的SQL语句。
例如:```xml<selectid="findActiveUsers"resultType="User">SELECT*FROMusersWHEREstatus=1<Testcondition="status==1">ANDage>30</Test></select>```在上面的例子中,如果status字段的值为1,则会在SQL语句中添加一个条件`ANDage>30`。
###2.使用Test构建循环语句可以使用Test标签结合foreach标签来构建循环语句,用于批量插入或更新数据。
例如:```xml<insertid="insertUsers"parameterType="list">INSERTINTOusers(name,age)<foreachcollection="list"item="user"index="index"separator=",">VALUES(<Test>${}</Test>,<Test>${user.age}</Test>)</foreach></insert>```在上面的例子中,foreach标签会遍历名为list的参数,并使用Test标签拼接出一个个SQL插入语句。
MyBatis中动态SQL语句完成多条件查询choose(when otherwise)相当于Java中的switch语句,通常when和otherwise⼀起使⽤。
where:简化SQL语句中的where条件。
set 解决SQL语句中跟新语句我们课已通过⼏个例⼦来看⼀下这⼏个元素的运⽤场景:if:<select id="queryEmp" resultType="cn.test.entity.Emp">select * from emp where 1=1<if test="deptNo!=null">and deptno=#{deptNO}</if><if test="deptName!=null">and deptno=#{deptName}</if></select>注:<if test="deptNo!=null">中的deptNo是指实体类中的属性或字段;choose:<select id="queryEmp" resultType="cn.test.entity.Emp">select * from emp where 1=1<choose><when test="deptNo!=null">and deptno=#{deptNo}</when><when test="deptName!=null">and deptname=#{deptName}</when><otherwise>and personnum>#{personNum}</otherwise></choose></select>注:上⾯也说了,choose相当于Java中的switch语句;当第⼀个when满⾜时;就只执⾏第⼀个when中的条件。
Tk.mybatis零sql语句实现动态sql查询的⽅法(4种)⽬录实现⽅式:⽅式⼀:使⽤Example实现⽅式⼆:使⽤example.createCriteria实现⽅式三:使⽤Example.builder实现⽅式四:使⽤weekendSqls实现有时候,查询数据需要根据条件使⽤动态查询,这时候需要使⽤动态sql,通常我们会⾃⼰写动态sql来实现,⽐如:<select id="findStudentByCondition" resultType="com.example.service.entity.Student">SELECT id, name, score FROM tbl_student<where><if test="score !=null and score > 0">score > #{score}</if><if test="name !=null and name != ''"><bind name="pattern" value=" '%' + name + '%' "/>AND name LIKE #{pattern}</if></where>ORDER BY score DESc</select>这个sql是查询成绩⼤于90并且名字包含“i”的学⽣信息。
但是有时候⼜加了⼀个条件,⼜要去改sql,改⼊参,有没有⼀种⽅式可以将写动态sql像写代码⼀样实现呢?如果你有这个想法,推荐你了解⼀下Tk.mybatis。
关于Tk.mybatis的介绍以及如何配置,本⽂暂不介绍,不了解的请⾃⾏百度,本⽂只介绍如何基于tk.mybatis实现不写sql 语句也能实现动态sql查询。
mybatis dynamic sql 用法MyBatis的动态SQL用于根据不同条件动态生成SQL语句,以便进行灵活的数据库操作。
下面是MyBatis动态SQL的用法示例:1. 使用if标签使用if标签可以根据条件判断是否包含某个SQL语句片段。
```<select id="getUserList" resultMap="userResultMap">SELECT * FROM usersWHERE 1=1<if test="username != null and username != ''">AND username = #{username}</if><if test="email != null and email != ''">AND email = #{email}</if></select>```2. 使用choose、when和otherwise标签使用choose、when和otherwise标签可以根据多个条件选择执行不同的SQL语句片段。
```<select id="getUserList" resultMap="userResultMap">SELECT * FROM users<where><choose><when test="username != null and username != ''">AND username = #{username}</when><when test="email != null and email != ''">AND email = #{email}</when><otherwise>AND status = 1</otherwise></choose></where></select>```3. 使用foreach标签使用foreach标签可以根据集合进行循环,动态生成SQL语句片段。
MyBatis在注解上使⽤动态SQL(@select使⽤if)1、⽤script标签包围,然后像xml语法⼀样书写@Select({"<script>","SELECT * FROM tbl_order","WHERE 1=1","<when test='title!=null'>","AND mydate = #{mydate}","</when>","</script>"})2、⽤Provider去实现SQL拼接,例如:public class OrderProvider {private final String TBL_ORDER = "tbl_order";public String queryOrderByParam(OrderPara param) {SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER);String room = param.getRoom();if (StringUtils.hasText(room)) {sql.WHERE("room LIKE #{room}");}Date myDate = param.getMyDate();if (myDate != null) {sql.WHERE("mydate LIKE #{mydate}");}return sql.toString();}}public interface OrderDAO {@SelectProvider(type = OrderProvider.class, method = "queryOrderByParam")List<Order> queryOrderByParam(OrderParam param);}注意:⽅式1有个隐患就是当传⼊参数为空的时候,可能会造成全表查询。
mybatis教程之动态sql语句
有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。
使用Oracle的序列、mysql的函数生成Id。
这时我们可以使用动态sql。
下文均采用mysql语法和函数(例如字符串链接函数CONCAT)。
selectKey 标签
在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。
使用myBatis的selectKey标签可以实现这个效果。
下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。
所以在执行完此方法后,边可以通过这个实体类获取生成的key。
Xml代码
trim代替set
Xml代码
测试代码,查询学生中,在20000001、20000002这两个班级的学生:
Java代码。