mybatis动态sql详解
1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
MyBatis中用于实现动态SQL的元素主要有:∙if∙choose(when,otherwise)∙trim∙where∙set∙foreachif就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。
先来看如下一个例子:Xml代码1.<select id="dynamicIfTest" parameterType="Blog" resultType="Blog">2. select * from t_blog where 11 = 13. <if test="title != null">4. and title = #{title}5. </if>6. <if test="content != null">7. and content = #{content}8. </if>9. <if test="owner != null">10. and owner = #{owner}11. </if>12.</select>这条语句的意思非常简单,如果你提供了title参数,那么就要满足title=#{title},同样如果你提供了Content和 Owner的时候,它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能,以往我们使用其他类型框架或者直接使用 JDBC的时候,如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了。
choose元素的作用就相当于JAVA中的switch语句,基本上跟JSTL中的choose 的作用和用法是一样的,通常都是与when和otherwise搭配的。
看如下一个例子:Xml代码1.<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">2. select * from t_blog where 11 = 13. <choose>4. <when test="title != null">5. and title = #{title}6. </when>7. <when test="content != null">8. and content = #{content}9. </when>10. <otherwise>11. and owner = "owner1"12. </otherwise>13. </choose>14.</select>when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出,当所有的都不满足的时候就输出 otherwise中的内容。
所以上述语句的意思非常简单,当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时候就输出and content = #{content},当所有条件都不满足的时候就输出otherwise中的内容。
where语句的作用主要是简化SQL语句中where中的条件判断的,先看一个例子,再解释一下where的好处。
Xml代码1.<select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">2. select * from t_blog3. <where>4. <if test="title != null">5. title = #{title}6. </if>7. <if test="content != null">8. and content = #{content}9. </if>10. <if test="owner != null">11. and owner = #{owner}12. </if>13. </where>14.</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 给忽略。
trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和 suffixOverrides;正因为trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能,示例代码如下:Xml代码1.<select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">2. select * from t_blog3. <trim prefix="where" prefixOverrides="and |or">4. <if test="title != null">5. title = #{title}6. </if>7. <if test="content != null">8. and content = #{content}9. </if>10. <if test="owner != null">11. or owner = #{owner}12. </if>13. </trim>14.</select>set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个 set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。
有了set元素我们就可以动态的更新那些修改了的字段。
下面是一段示例代码:Xml代码1.<update id="dynamicSetTest" parameterType="Blog">2. update t_blog3. <set>4. <if test="title != null">5. title = #{title},6. </if>7. <if test="content != null">8. content = #{content},9. </if>10. <if test="owner != null">11. owner = #{owner}12. </if>13. </set>14. where id = #{id}15.</update>上述示例代码中,如果set中一个条件都不满足,即set中包含的内容为空的时候就会报错。
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator 表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key下面分别来看看上述三种情况的示例代码:1.单参数List的类型:Xml代码1.<select id="dynamicForeachTest" resultType="Blog">2. select * from t_blog where id in3. <foreach collection="list" index="index" item="item" open="(" separator="," close=")">4. #{item}5. </foreach>6.</select>上述collection的值为list,对应的Mapper是这样的Java代码1.public List<Blog> dynamicForeachTest(List<Integer> ids);测试代码:Java代码1.@Test2.public void dynamicForeachTest() {3. SqlSession session = Util.getSqlSessionFactory().openSession();4. BlogMapper blogMapper = session.getMapper(BlogMapper.class);5. List<Integer> ids = new ArrayList<Integer>();6. ids.add(1);7. ids.add(3);8. ids.add(6);9. List<Blog> blogs = blogMapper.dynamicForeachTest(ids);10. for (Blog blog : blogs)11. System.out.println(blog);12. session.close();13.}2.单参数array数组的类型:Xml代码1.<select id="dynamicForeach2Test" resultType="Blog">2. select * from t_blog where id in3. <foreach collection="array" index="index" item="item" open="(" separator="," close=")">4. #{item}5. </foreach>6.</select>上述collection为array,对应的Mapper代码:Java代码1.public List<Blog> dynamicForeach2Test(int[] ids);对应的测试代码:Java代码1.@Test2.public void dynamicForeach2Test() {3. SqlSession session = Util.getSqlSessionFactory().openSession();4. BlogMapper blogMapper = session.getMapper(BlogMapper.class);5. int[] ids = new int[] {1,3,6,9};6. List<Blog> blogs = blogMapper.dynamicForeach2Test(ids);7. for (Blog blog : blogs)8. System.out.println(blog);9. session.close();10.}3.自己把参数封装成Map的类型Xml代码1.<select id="dynamicForeach3Test" resultType="Blog">2. select * from t_blog where title like "%"#{title}"%" and id in3. <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">4. #{item}5. </foreach>6.</select>上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:Java代码1.public List<Blog> dynamicForeach3Test(Map<String, Object> params);对应测试代码:Java代码1.@Test2.public void dynamicForeach3Test() {3. SqlSession session = Util.getSqlSessionFactory().openSession();4. BlogMapper blogMapper = session.getMapper(BlogMapper.class);5. final List<Integer> ids = new ArrayList<Integer>();6. ids.add(1);7. ids.add(2);8. ids.add(3);9. ids.add(6);10. ids.add(7);11. ids.add(9);12. Map<String, Object> params = new HashMap<String, Object>();13. params.put("ids", ids);14. params.put("title", "中国");15. List<Blog> blogs = blogMapper.dynamicForeach3Test(params);16. for (Blog blog : blogs)17. System.out.println(blog);18. session.close();19.}mybatis中的#和$的区别:1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
mybatis注解动态sql原理
mybatis注解动态sql原理
MyBatis是一种基于Java语言的持久层框架,提供了一种使用
注解的方式来编写SQL语句,称为MyBatis注解。
动态SQL
是MyBatis中一个重要的特性,可以根据不同的条件生成不同的SQL语句。
MyBatis通过提供注解来实现动态SQL。
注解是一种元数据,
可以通过在方法或参数上添加注解来指定SQL语句的一些特性。
MyBatis注解提供了多种条件注解,用于动态生成SQL语句。
动态SQL的原理如下:
1. 在Java代码中,我们可以通过添加不同的注解来指定SQL
语句的不同条件,比如条件判断、循环等。
2. MyBatis会解析这些注解,并根据注解中的条件生成对应的SQL语句。
例如,如果有一个条件判断的注解,MyBatis会根
据条件判断的结果来生成对应的SQL语句。
3. 生成的SQL语句会被传递给数据库进行执行。
动态SQL的好处是可以根据不同的条件生成不同的SQL语句,从而实现更灵活的查询功能。
同时,使用注解编写SQL语句,可以减少编写XML配置文件的工作量,提高开发效率。
总结起来,动态SQL是通过使用注解来指定SQL语句的不同
条件,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(超详细)动态SQL可以根据具体的参数条件,来对SQL语句进⾏动态拼接。
⽐如在以前的开发中,由于不确定查询参数是否存在,许多⼈会使⽤类似于where 1 = 1来作为前缀,然后后⾯⽤AND拼接要查询的参数,这样,就算要查询的参数为空,也能够正确执⾏查询,如果不加1 = 1,则如果查询参数为空,SQL语句就会变成SELECT * FROM student where,SQL不合法。
mybatis⾥的动态标签主要有if<!-- ⽰例 --><select id="find"resultType="student"parameterType="student">SELECT * FROM student WHERE age >= 18<if test="name != null and name != ''">AND name like '%${name}%'</if></select>当满⾜test条件时,才会将<if>标签内的SQL语句拼接上去。
choose<!-- choose 和 when , otherwise 是配套标签类似于java中的switch,只会选中满⾜条件的⼀个--><select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and != null">AND author_name like #{}</when><otherwise>AND featured = 1</otherwise></choose></select>sql<!-- List<User> findByList(List<Integer> list); --><select id="findByList"resultType="er"parameterType="java.util.List"> SELECT * FROM user<include refid="rnm"></include></select><sql id="rnm"><where><if test="list != null and list.size() > 0">AND id in<foreach collection="list"item="id"open="("separator=","close=")">#{id}</foreach></if></where></sql>trimwhere<where>标签只会在⾄少有⼀个⼦元素返回了SQL语句时, 才会向SQL语句中添加WHERE,并且如果WHERE之后是以AND或OR开头,会⾃动将其删掉。
MyBatis执行动态SQL语句详解
MyBatis执⾏动态SQL语句详解⼤家基本上都知道如何使⽤ MyBatis 执⾏任意 SQL,使⽤⽅法很简单,例如在⼀个 XXMapper.xml 中:<select id="executeSql" resultType="map">${_parameter}</select>你可以如下调⽤:sqlSession.selectList("executeSql", "select * from sysuser where enabled = 1");或者你可以在 XXMapper.java 接⼝中定义如下⽅法:List<Map> executeSql(String sql);然后使⽤接⼝调⽤⽅法:xxMapper.executeSql("select * from sysuser where enabled = 1");上⾯这些内容可能都会,下⾯在此基础上再复杂⼀点。
假如像上⾯SQL中的enabled = 1我想使⽤参数⽅式传值,也就是写成 enabled = #{enabled},如果你没有遇到过类似这种需求,可能不明⽩为什么要这么写,举个例⼦,要实现⼀种动态查询,可以在前台通过配置 SQL,提供⼀些查询条件就能实现⼀个查询的功能(为了安全,这些配置肯定是开发或者实施做的,不可能让⽤户直接操作数据库)。
针对这个功能,使⽤ MyBatis 实现起来相当容易。
配置 SQL 肯定要执⾏,⽤上⾯讲的这种⽅式肯定可以执⾏ SQL,如何提供参数呢?参数就是enabled = #{enabled}中的#{enabled}部分。
如果再多⼀些条件,⼀个配置好的 SQL 如下:select * from sysuserwhere enabled = #{enabled}and userName like concat('%',#{userName},'%')这种情况下,该怎么⽤ MyBatis 实现呢?⾸先 XML 中修改如下:<select id="executeSql" resultType="map">${sql}</select>接⼝中的⽅法修改为:List<Map> executeSql(Map map);然后调⽤⽅法:Map map = new HashMap();//这⾥的 sql 对应 XML 中的 ${sql}map.put("sql", "select * from sysuser "+ " where enabled = #{enabled} "+ " and userName like concat('%',#{userName},'%')");//#{enabled}map.put("enabled", 1);//#{userName}map.put("userName", "admin");//接⼝⽅式调⽤List<Map> list = xxMapper.executeSql(map);//sqlSession⽅式调⽤sqlSession.selectList("executeSql", map);有了这个SQL之后,就可以将 enabled 和 userName 作为条件提供给⽤户。
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中的动态SQL语句解析
Mybatis中的动态SQL语句解析这篇⽂章主要介绍了Mybatis中的动态SQL语句解析,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下 Mybatis中配置SQL有两种⽅式,⼀种是利⽤xml ⽅式进⾏配置,⼀种是利⽤注解进⾏配置。
Mybatis使⽤注解配置SQL,但是由于配置功能受限,⽽且对于复杂的SQL⽽⾔可读性很差,所以很少使⽤。
Mybatis常⽤xml配置的⽅式,使⽤xml的⼏个简单的元素,便能完成动态SQL的功能,⼤量的判断都可以在mybaties的映射xml⾥⾯配置,以达到许多需要⼤量代码才能实现的功能,⼤⼤减少了代码量,体现了Mybatis的灵活、⾼度可配置性和维护性。
元素作⽤备注if判断语句单条件分⽀判断choose(when,otherwise)相当于Java中的switch和case语句多条件分⽀判断trim辅助元素,⽤于处理特定的SQL拼装问题⽤于处理SQL拼装的问题foreach循环语句在in语句等列表条件常⽤if元素 if元素是最常⽤的判断语句,相当于Java中国的 if 语句,它常常与test属性联合使⽤。
<select id="findRole1" parameterType="string" resultMap="roleResultMap">select role_no, role_name, note from t_role where 1=1<if test="roleName != null and roleName !=''">and role_name like concat('%', #{roleName}, '%')</if></select> 当参数roleName传递进映射器时,如果参数不为空,则采取构造对 roleName 的模糊查询,否则就不要去构造这个条件。
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
Mybatis动态SQL⼀:动态SQL语句动态SQL可以说是Mybatis的⼀⼤特点。
在使⽤过JDBC来写SQL语句,你应该能理解不同的条件有不同的SQL语句要拼接,往往⼀个字符串被东拼西凑,特别痛苦,⽽且还得保证拼接的时候2段SQL⽚段之间要保留空格等待,利⽤动态SQL可以保证彻底摆脱这种痛苦! 其实使⽤动态SQL也不是⼀件容易的事,但借助可⽤于任何 SQL 映射语句中的强⼤的动态 SQL 语⾔,MyBatis 显著地提升了这⼀特性的易⽤性。
如果有之前在学web的时候接触过JSTL或者任何基于类XML语⾔的⽂本处理器,,或许你对动态SQL有⼀定的似曾相识感觉,在 MyBatis 之前的版本中,需要花时间了解⼤量的元素。
借助功能强⼤的基于 OGNL 的表达式,MyBatis 3 替换了之前的⼤部分元素,⼤⼤精简了元素种类,现在要学习的元素种类⽐原来的⼀半还要少。
Mybatis中⽤于实现动态SQL元素主要有if、choose、trim、where、set、foreach1:if标签动态 SQL 通常要做的事情是有条件地包含 where ⼦句的⼀部分。
简单说传来的值⽤if判断,有的话就拼接到where后⾯。
<!--根据性别和年龄查询--><!--注意:必须要带⼀个where 1=1 否则sql语句少了where语句,,if判断某个值为空就不会拼接某个⽚段 --><select id="findByAgeAndSex" parameterType="student" resultMap="studentMapper">select * from student where 1=1<if test="age!=0">and sage=#{age}</if><if test="sex!=null and sex!=''">and ssex=#{sex}</if></select>2:choose、when、otherwise标签这3个标签是⼀个整体和JSTL的⼀样,它们的本质都有点像java的switch分⽀语句,还是按照上⾯的例⼦,假设我传来年龄就按照年龄查询,传来性别就按照性别查询,年龄和性别都传来,就按照标签判断的先后顺序选择⼀个靠前的,然后下⼀个判断将不在执⾏,直接跳出,如果都不传则执⾏otherwise标签<!--根据性别和年龄的其中⼀个查询--><select id="findByAgeAndSexChoose" parameterType="student" resultMap="studentMapper"><!--基本sql语句-->select * from student where 1=1<!--switch开始--><choose><!--case :--><when test="age!=0">and sage=#{age}</when><!--case :--><when test="sex!=null and sex!=''">and ssex=#{sex}</when><!--default 如果都不成⽴则执⾏下⾯查询5条数据--><otherwise>limit 5</otherwise></choose></select>3:where、set、trim标签先说⼀下where,其实⼤家有没有发现,我前2个⽰例都有where 1=1,这是⼲嘛⽤的呢?其实这个是⼀个恒等式,加where 1=1和不加都⼀样,但是加上了,后⾯的拼接语句就可以使⽤ and xx=xx and xxx=xxx 如果没加,那么后⾯的if判断成⽴就会形成⼀个select * from student where and sage=xx;⼤家肯定发现错误了,其实Mybatis帮我们解决了where 1=1的拼接问题,我们可以不⽤⾃⼰⼿动写where属性了,我就改造⼀下第⼀个例⼦<!--根据性别和年龄查询--><!--加上where标签后就不⽤写恒等式了,就连前⾯的and也可写可不写看下⾯的2个if⾥⾯--><select id="findByAgeAndSex" parameterType="student" resultMap="studentMapper">select * from student<where><if test="age!=0">sage=#{age}</if><if test="sex!=null and sex!=''">and ssex=#{sex}</if></where></select>现在我们来聊聊trim,这个东西第⼀眼看上去特别难理解,以⾄于我都不知道是啥玩意,但是明⽩以后还是感觉不错的,就是⽤的很少,先不废话直接上代码看看<!--使⽤trim标签完成where案例trim标签有4个属性:prefix:前缀覆盖并增加其内容。
MyBatis源码解析----MyBatis动态SQL底层原理分析
MyBatis源码解析----MyBatis动态SQL底层原理分析前⾔废话不多说,直接进⼊⽂章。
我们在使⽤mybatis的时候,会在xml中编写sql语句。
⽐如这段动态sql代码:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15<update id="update"parameterType="er"> UPDATE users<trim prefix="SET"prefixOverrides=","><if test="name != null and name != ''">name = #{name}</if><if test="age != null and age != ''">, age = #{age}</if><if test="birthday != null and birthday != ''">, birthday = #{birthday}</if></trim>where id = ${id}</update>mybatis底层是如何构造这段sql的?这⽅⾯的知识⽹上资料不多,于是就写了这么⼀篇⽂章。
下⾯带着这个疑问,我们⼀步⼀步分析。
介绍MyBatis中⼀些关于动态SQL的接⼝和类SqlNode接⼝,简单理解就是xml中的每个标签,⽐如上述sql的update,trim,if标签:1 2 3public interface SqlNode {boolean apply(DynamicContext context); }SqlSource Sql源接⼝,代表从xml⽂件或注解映射的sql内容,主要就是⽤于创建BoundSql,有实现类DynamicSqlSource(动态Sql 源),StaticSqlSource(静态Sql源)等:1 2 3public interface SqlSource {BoundSql getBoundSql(Object parameterObject); }BoundSql类,封装mybatis最终产⽣sql的类,包括sql语句,参数,参数源数据等参数:XNode,⼀个Dom API中的Node接⼝的扩展类。
mybatis动态sql语法
mybatis动态sql语法在使用MyBatis进行数据库操作时,使用动态SQL可以有效地处理不同查询条件下的不同SQL语句。
MyBatis提供了一套灵活的动态SQL语法,使得我们能够根据需要动态生成SQL语句,以满足各种查询需求。
本文将详细介绍MyBatis动态SQL语法的使用。
一、if语句if语句是MyBatis中最常用的动态SQL语法之一。
通过if语句,我们可以根据条件判断来生成不同的SQL片段。
示例代码如下:```<select id="getUserList" resultType="User">SELECT *FROM userWHERE 1 = 1<if test="username != null and username != ''">AND username = #{username}</if><if test="age != null">AND age = #{age}</if></select>```在上述代码中,我们使用了if语句来生成动态的WHERE子句。
首先,我们判断username字段是否为空,如果不为空,则将其加入WHERE子句;然后,我们判断age字段是否为空,如果不为空,则同样将其加入WHERE子句。
通过这种方式,我们可以根据不同的查询条件动态生成不同的SQL语句。
二、choose语句choose语句也是常用的动态SQL语法之一。
它类似于Java中的switch语句,根据条件判断来选择执行不同的分支。
示例代码如下:```<select id="getUserList" resultType="User">SELECT *FROM user<where><choose><when test="username != null and username != ''">AND username = #{username}</when><when test="age != null">AND age = #{age}</when><otherwise>AND status = 1</otherwise></choose></where></select>```在上述代码中,我们使用choose语句来生成动态的WHERE子句。
