MyBatis学习 之三动态SQL语句

合集下载

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 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动态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(foreach的用法--实现in集合)

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、。。。

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语句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元素的使⽤掌握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语句方法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动态sql语句if基本语法

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和参数

mybatis动态sql和参数
item表示集合中每一个元素进行迭代时的别名, index指定一个名字,用于表示在迭代过程中,每次迭代到的位置, open表示该语句以什么开始, separator表示在每次进行迭代之间以什么符号作为分隔符, close表示以什么结束,
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样 的,主要有一下3种情况:
</select>
when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件 满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出, 当所有的我很条件都不满足的时候就输出otherwise 中的内容。所以上述语句的意思非常简单, 当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时
</select>
trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀, 与之对应的属性是prefix和suffix;可以把 包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides和suffixOverrides;正因为trim有这样 的功能,所以我们也可以非常简单的利用trim来代替where 元素的功能
</select>
对应mapper
public List<Blog> dynamicForeach2Test(int[] ids);
</select>

MyBatis动态SQL标签用法

MyBatis动态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)有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。

mybatissql语法

mybatissql语法

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动态sql test用法

mybatis动态sql test用法

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的原理

mybatis动态sql的原理

mybatis动态sql的原理
MyBatis 的动态 SQL 是通过 XML 配置文件或注解的方式实现的,它的主要原理如下:
1. 解析 SQL 配置文件:MyBatis 首先会解析 XML 配置文件,将其中定义的 SQL 语句和参数信息解析出来。

2. 根据参数生成 SQL:使用解析得到的 SQL 语句模板和参数信息,MyBatis 会根据参数的值动态生成最终的 SQL 语句。

在生成 SQL 过程中,MyBatis 会根据不同的情况判断使用哪些语句片段和条件。

3. 执行 SQL:MyBatis 将生成的 SQL 语句交给数据库进行执行,并获取执行结果。

4. 将结果映射到 Java 对象:MyBatis 通过配置文件或注解中定义的映射关系,将查询结果映射到相应的 Java 对象中,便于后续的数据操作和处理。

动态 SQL 的原理主要是通过在 SQL 配置文件中定义逻辑判断和循环等语句片段,结合参数值进行条件判断和 SQL 拼接,从而生成最终的 SQL 语句。

这样可以根据不同的条件动态调整 SQL 语句,实现灵活的查询和更新操作。

同时,MyBatis 还提供了 OGNL 表达式语言的支持,使得在 SQL 配置文件中可以通过表达式对参数进行进一步的处理和计算。

mybatis 动态sql if用法

mybatis 动态sql if用法

在MyBatis中,可以使用<if>标签来实现动态SQL。

<if>标签用于包裹一个SQL片段,该SQL片段只有在<if>标签的test属性计算结果为true时才会被包含在最终的SQL语句中。

下面是一个使用<if>标签实现动态SQL的示例:xml复制代码<select id="getUser" resultType="User">SELECT * FROM usersWHERE 1=1<if test="username != null">AND username = #{username}</if><if test="email != null">AND email = #{email}</if></select>在上面的示例中,我们定义了一个名为getUser的查询语句,它会根据username和email参数的值动态地构建SQL语句。

如果username或email参数不为null,则会将对应的条件添加到SQL语句中。

在<if>标签的test属性中,我们可以使用任何有效的Java表达式来计算结果。

只要表达式的结果为true,则对应的SQL片段就会被包含在最终的SQL语句中。

如果表达式的结果为false,则该SQL片段将被忽略。

除了<if>标签外,MyBatis还提供了其他几种动态SQL元素,如<choose>、<when>、<otherwise>等,可以用于实现更复杂的动态SQL语句。

mybatis dynamic sql 用法

mybatis dynamic 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)

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有个隐患就是当传⼊参数为空的时候,可能会造成全表查询。

Tk.mybatis零sql语句实现动态sql查询的方法(4种)

Tk.mybatis零sql语句实现动态sql查询的方法(4种)

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查询。

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

MyBatis学习之三动态SQL语句三、动态SQL语句MyBatis学习之一、MyBatis简介与配置MyBatis+Spring+MySqlMyBatis学习之二、SQL语句映射文件(1)resultMapMyBatis学习之二、SQL语句映射文件(2)增删改查、参数、缓存MyBatis学习之三、动态SQL语句MyBatis学习之四、MyBatis配置文件有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。

使用Oracle的序列、mysql的函数生成Id。

这时我们可以使用动态sql。

下文均采用mysql语法和函数(例如字符串链接函数CONCAT)。

3.1 selectKey 标签在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。

使用myBatis的selectKey标签可以实现这个效果。

下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。

所以在执行完此方法后,边可以通过这个实体类获取生成的key。

<!-- 插入学生自动主键--> <insert id="createStudentAutoKey" parameterType="liming.student.manager.data.model.StudentEntity" keyProperty="studentId"> <selectKey keyProperty="studentId" resultType="String" order="BEFORE"> select nextval('student') </selectKey> INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, STUDENT_PHOTO, CLASS_ID, PLACE_ID) V ALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday}, #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{classId}, #{placeId}) </insert>调用接口方法,和获取自动生成keyStudentEntity entity = new StudentEntity(); entity.setStudentName("黎明你好"); entity.setStudentSex(1); entity.setStudentBirthday(DateUtil.parse("1985-05-28")); entity.setClassId("20000001"); entity.setPlaceId("70000001"); this.dynamicSqlMapper.createStudentAutoKey(entity); System.out.println("新增学生ID: " + entity.getStudentId());selectKey语句属性配置细节:属性描述取值keyPropertyselectKey 语句生成结果需要设置的属性。

resultTyp e 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int 类型。

order 1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert语句;2:AFTER,就先运行insert 语句再运行selectKey 语句。

BEFOREAFTERstatement Type MyBatis 支持STA TEMENT,PREPARED和CALLABLE 的语句形式,对应Statement ,PreparedStatement 和CallableStatement 响应STA TEMENTPREPAREDCALLABLE3.2 if标签if标签可用在许多类型的sql语句中,我们以查询为例。

首先看一个很普通的查询:<!-- 查询学生list,like姓名--> <select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </select>但是此时如果studentName或studentSex为null,此语句很可能报错或查询结果为空。

此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,增加灵活性。

参数为实体类StudentEntity。

将实体类中所有的属性均进行判断,如果不为空则执行判断条件。

<!-- 2 if(判断参数) - 将实体类不为空的属性作为where条件--> <select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDENT_BIRTHDAY, ST.STUDENT_PHOTO, ST.CLASS_ID, ST.PLACE_ID FROM STUDENT_TBL ST WHERE <if test="studentName !=null "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=V ARCHAR}),'%') </if> <if test="studentSex != null and studentSex != '' "> AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER} </if> <if test="studentBirthday != null "> AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE} </if> <if test="classId != null and classId!= '' "> AND ST.CLASS_ID = #{classId, jdbcType=V ARCHAR} </if> <if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=' ' "> AND ST.CLASS_ID = #{classEntity.classId, jdbcType=V ARCHAR} </if> <if test="placeId != null and placeId != '' "> AND ST.PLACE_ID = #{placeId, jdbcType=V ARCHAR} </if> <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' "> AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=V ARCHAR} </if> <if test="studentId != null and studentId != '' "> AND ST.STUDENT_ID = #{studentId, jdbcType=V ARCHAR} </if> </select>使用时比较灵活,new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。

public void select_test_2_1() { StudentEntity entity = new StudentEntity(); entity.setStudentName(""); entity.setStudentSex(1); entity.setStudentBirthday(DateUtil.parse("1985-05-28")); entity.setClassId("20000001"); //entity.setPlaceId("70000001"); List<StudentEntity> list = this.dynamicSqlMapper.getStudentList_if(entity); for (StudentEntity e : list) { System.out.println(e.toString()); } }3.3 if + where 的条件判断当where中的条件使用的if标签较多时,这样的组合可能会导致错误。

相关文档
最新文档