mybatis教程之动态sql语句
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模糊查询写法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用法

电子合同存证服务合同甲方(以下简称“甲方”):公司名称:法定代表人姓名:注册地址:乙方(以下简称“乙方”):公司名称:法定代表人姓名:注册地址:鉴于甲方拥有一定的电子合同存证服务能力,乙方希望委托甲方为其提供电子合同存证服务,各方经友好协商,达成如下协议:第一条服务内容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标签)

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的使用说明

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、存储过程以及高级映射。
在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中的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标签的⽤法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 标签⾥⾯的代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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代码。