mybatis实战教程之八:动态sql语句
mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句mybatis 的动态sql语句是基于OGNL表达式的。
可以方便的在sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句(简单的条件判断)2. choose (when,otherwize) ,相当于java 语言中的switch ,与jstl 中的choose 很类似.3. trim (对包含的内容加上prefix,或者suffix 等,前缀,后缀)4. where (主要是用来简化sql语句中where条件判断的,能智能的处理and or ,不必担心多余导致语法错误)5. set (主要用于更新时)6. foreach (在实现mybatis in 语句查询时特别有用)下面分别介绍这几种处理方式1. mybaits if 语句处理程序代码<select id="dynamicIfTest" parameterType="Blog" resultType="Blog"> select * from t_blog where 1 = 1<if test="title != null">and title = #{title}</if><if test="content != null">and content = #{content}</if><if test="owner != null">and owner = #{owner}</if></select>这条语句的意思非常简单,如果你提供了title参数,那么就要满足title=#{title},同样如果你提供了Content和Owner的时候,它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能,以往我们使用其他类型框架或者直接使用JDBC的时候,如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了2.2. choose (when,otherwize) ,相当于java 语言中的switch ,与jstl 中的choose 很类似程序代码<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog"> select * from t_blog where 1 = 1<choose><when test="title != null">and title = #{title}</when><when test="content != null">and content = #{content}</when><otherwise>and owner = "owner1"</otherwise></choose></select>when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出,当所有的我很条件都不满足的时候就输出otherwise中的内容。
所以上述语句的意思非常简单,当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时候就输出and content =#{content},当所有条件都不满足的时候就输出otherwise中的内容。
3.trim (对包含的内容加上prefix,或者suffix 等,前缀,后缀)程序代码<select id="dynamicTrimTest" parameterType="Blog" resultType="Blog"> select * from t_blog<trim prefix="where" prefixOverrides="and |or"><if test="title != null">title = #{title}</if><if test="content != null">and content = #{content}</if><if test="owner != null">or owner = #{owner}</if></trim></select>trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim 有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能4. where (主要是用来简化sql语句中where条件判断的,能智能的处理and or 条件程序代码<select id="dynamicWhereTest" parameterType="Blog" resultType="Blog"> select * from t_blog<where><if test="title != null">title = #{title}</if><if test="content != null">and content = #{content}</if><if test="owner != null">and owner = #{owner}</if></where></select>where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。
像上述例子中,如果title=null,而content != null,那么输出的整个语句会是select * from t_blog where content =#{content},而不是select * from t_blog where and content = #{content},因为MyBatis会智能的把首个and 或or 给忽略。
5.set (主要用于更新时)程序代码<update id="dynamicSetTest" parameterType="Blog">update t_blog<set><if test="title != null">title = #{title},</if><if test="content != null">content = #{content},</if><if test="owner != null">owner = #{owner}</if></set>where id = #{id}</update>set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。
有了set元素我们就可以动态的更新那些修改了的字段6. foreach (在实现mybatis in 语句查询时特别有用)foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:如果传入的是单参数且参数类型是一个List的时候,collection属性值为list如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map 的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key1.1.单参数List的类型程序代码<select id="dynamicForeachTest" resultType="Blog">select * from t_blog where id in<foreach collection="list" index="index" item="item" open="(" separator=","close=")">#{item}</foreach></select>上述collection的值为list,对应的Mapper是这样的程序代码public List<Blog> dynamicForeachTest(List<Integer> ids);测试代码程序代码@Testpublic void dynamicForeachTest() {SqlSession session = Util.getSqlSessionFactory().openSession();BlogMapper blogMapper = session.getMapper(BlogMapper.class);List<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(3);ids.add(6);List<Blog> blogs = blogMapper.dynamicForeachTest(ids);for (Blog blog : blogs)System.out.println(blog);session.close();}2.数组类型的参数程序代码<select id="dynamicForeach2Test" resultType="Blog">select * from t_blog where id in<foreach collection="array" index="index" item="item" open="(" separator=","close=")">#{item}</foreach></select>对应mapper程序代码public List<Blog> dynamicForeach2Test(int[] ids);3. Map 类型的参数程序代码<select id="dynamicForeach3Test" resultType="Blog">select * from t_blog where title like "%"#{title}"%" and id in<foreach collection="ids" index="index" item="item" open="(" separator=","close=")">#{item}</foreach></select>mapper 应该是这样的接口:程序代码public List<Blog> dynamicForeach3Test(Map<String, Object> params);通过以上方法,就能完成一般的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模糊查询写法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(@select使用if)
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中的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 标签⾥⾯的代码。
MyBatis--动态SQL(foreach的用法--实现in集合)
MyBatis--动态SQL(foreach的⽤法--实现in集合) 在使⽤foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不⼀样的,主要有⼀下3种情况:如果传⼊的是单参数且参数类型是⼀个List的时候,collection属性值为list .如果传⼊的是单参数且参数类型是⼀个array数组的时候,collection的属性值为array .如果传⼊的参数是多个的时候,我们就需要把它们封装成⼀个Map了,当然单参数也可以封装成map,实际上如果你在传⼊参数的时候,在MyBatis⾥⾯也是会把它封装成⼀个Map的,map的key就是参数名,所以这个时候collection属性值就是传⼊的List或array对象在⾃⼰封装的map⾥⾯的key. foreach可以对数组,Map或实现了Iterable接⼝(如List,Set)的对象进⾏遍历。
数组在处理时会转换为List对象,因此foreach遍历的对象可以分为两⼤类:Iterable类型和Map类型。
foreach实现in集合或数组是最简单和常⽤的⼀种情况,根据传⼊的⽤户id集合查询出所有符合条件的⽤户。
1.只有⼀个数组参数或集合参数 ⾸先在UserMapper接⼝中增加如下⽅法: 在UserMapper.xml中编写SQL编写测试类:测试结果:(注意⾃⼰拼接的SQL是否⽆误,⼀般出错就在这⾥) 2.有多个参数 当有多个参数的时候,要使⽤@Param注解给每个参数指定⼀个名字,否则在SQL中使⽤参数时就会不⽅便,因此将collection设置为@Param注解指定的名字即可 3.参数是Map类型 修改测试类: 测试结果:。
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语句
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语句方法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方法,执行批量插入批量插入能有效减少数据库交互次数,提高插入效率。
