付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MyBatis动态Sql语句MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法MyBatis中用于实现动态SQL的元素主要有:ifchoose(when,otherwise)trimwheresetforeach1、if对属性进行判断,如果不为空则执行判断条件htmlviewplaincopyparameterType="com.mucfc.dto.Student"<selectid="selectByCriteria"resultMap="BaseResultM
2、ap">select*fromt_studentwhere<iftest="stuId!=nullandstuId!=''">STU_ID=#stuId</if><iftest="stuName!=nullandstuName!=''">andSTU_NAME=#stuName</if><iftest="stuClass!=nullandstuClass!=''">andSTU_CLASS=#stuClass&l
3、t;/if><iftest="stuSex!=nullandstuSex!=''">andSTU_SEX=#stuSex</if><iftest="stuAge!=nullandstuAge!=''">andSTU_AGE=#stuAge</if></select>来看看结果:这是从web页面输入的参数这是输出的结果这是打印出来的Sql语句从结果可以看出,只有在条件不为空的时候,属性才会赋值。2、where当where中的条件使用的if标签较多时,这样的组合
4、可能会导致错误。我们以在1中的查询语句为例子,当输入参数stuId为空时,就会报错然后是输出的结果:此时SQL语句变成了select*fromt_studentwhereandSTU_SEX=?这样会报错如果上面例子,参数stuId为null,将不会进行STUDENT_NAME列的判断,则会直接导“WHEREAND'关键字多余的错误SQL这时我们可以使用where动态语句来解决。这个"where”标签会知道如果它包含的标签中有返回值的话,它就插入一个where'。此外,如果标签返回的内容是以AND或OR开头的,则它会剔除掉。可以改成如下:htmlviewplainco
5、py<selectid="selectByCriteria"parameterType="com.mucfc.dto.Student"resultMap="BaseResultMap">select*fromt_student<where><iftest="stuId!=nullandstuId!=''">STU_ID=#stuId</if><iftest="stuName!=nullandstuName!=''&quo
6、t;>andSTU_NAME=#stuName</if><iftest="stuClass!=nullandstuClass!=''">andSTU_CLASS=#stuClass</if><iftest="stuSex!=nullandstuSex!=''">andSTU_SEX=#stuSex</if><iftest="stuAge!=nullandstuAge!=''">andSTU_AGE=#stuAg
7、e</if></where></select>再来看看,输入查询条件然后输出结果打印出来的SQL语句-=>Preparing:select*fromt_studentWHERESTU_SEX=?=>Parameters:男(String)<=Total:14说明结果是正确的。如果它包含的标签中有返回值的话就插入一个where。此外如果标签返回的内容是以AND或OR开头的,则它会剔除掉。3、set当update语句中没有使用if标签时,如果有一个参数为null,都会导致错误。当在update语句中使用if标签时,如果前面的if没有执行,则或导
8、致逗号多余错误。使用set标签可以将动态的配置SET关键字,和剔除追加到条件末尾的任何不相关的逗号。使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:4、trimwhere和set的效果。parameterType="com.mucfc.dto.Student"trim是更灵活的去处多余关键字的标签,他可以实践htmlviewplaincopy<selectid="selectByCriteria"resultMap="BaseResultMap">select*fromt_stud
9、ent<trimprefix="where"prefixOverrides="AND|OR"><iftest="stuId!=nullandstuId!=''">STU_ID=#stuId</if><iftest="stuName!=nullandstuName!=''">andSTU_NAME=#stuName</if><iftest="stuClass!=nullandstuClass!='
10、9;">andSTU_CLASS=#stuClass</if><iftest="stuSex!=nullandstuSex!=''">andSTU_SEX=#stuSex</if><iftest="stuAge!=nullandstuAge!=''">andSTU_AGE=#stuAge</if></trim></select>where后面有and或者or,就自动把首先判断是否需要where,如果需要,它会自动判断如果它们
11、都去掉。prefix是前置的,还有suffix是后置的。如下输入查找参数stuclass=2。看看打印出来的语句suffix是后置的例子htmlviewplaincopy<insertid="insert"parameterType="com.mucfc.dto.Student">insertintot_student<trimprefix="("suffix=")"suffixOverrides=","><iftest="stuId!=null"
12、;>STU_ID,</if><iftest="stu_name!=null">STU_NAME,</if></trim><trimprefix="values("suffix=")"suffixOverrides=","><iftest="stuId!=null">#stuId,</if><iftest="stu_name!=null">#stu_name,</if&g
13、t;<prename="code"class="html"></insert</pre><br>这里是自动判断是否为空,然后去掉逗号htmlviewplaincopyprefix="("suffix=")"会自动判断是否需要加上()这个符号5、 choose有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。MyBatis提供了choose元素。if标签是与(and)的关系,而choos
14、e比傲天是或(or)的关系。choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java的switch语句,choose为switch,when为case,otherwise贝U为defaultohtmlviewplaincopy<!-满足其中一个条件时候用choosewhen操彳-><selectid="selectByCriteria"parameterType="com.mucfc.dto.Stud
15、ent"resultMap="BaseResultMap">select*fromt_student<where><choose><whentest="stuId!=nullandstuId!='">STU_ID=#stuId</when><whentest="stuClass!=nullandstuClass!=''">andSTU_CLASS=#stuClass</when><otherwise></o
16、therwise></choose></where></select>输入两个参数这里会跳过王五这个参数,因为stuId不为空然后看打印了来的语句,果然只有一个条件,所以说明是对的foreach对于动态SQL非常必须的,主是要迭代一个集合,通常是用于IN条件。List实例将使用“list”做为键,数组实例以“array”做为键。foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。注意:你可以传递一个Li
17、st实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,c
18、lose表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:如果传入的是单参数且参数类型是一个List的时候,collection属性值为list如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属
19、性值就是传入的List或array对象在自己封装的map里面的key下面分别来看看上述三种情况的示例代码:1 .单参数List的类型:htmlviewplaincopy<selectid="dynamicForeachTest"resultType="Blog">select*fromt_blogwhereidin<foreachcollection="list"index="index"item="item"open="("separator="
20、,"close=")">#item</foreach></select>上述collection的值为list,对应的Mapper是这样的javaviewplaincopypublicList<Blog>dynamicForeachTest(List<Integer>ids);测试代码:javaviewplaincopyTestpublicvoiddynamicForeachTest()SqlSessionsession=Util.getSqlSessionFactory().openSession();Blo
21、gMapperblogMapper=session.getMapper(BlogMapper.class);List<Integer>ids=newArrayList<Integer>();ids.add(1);ids.add(3);ids.add(6);List<Blog>blogs=blogMapper.dynamicForeachTest(ids);for(Blogblog:blogs)System.out.println(blog);session.close();2 .单参数array数组的类型:javaviewplaincopy<selec
22、tid="dynamicForeach2Test"resultType="Blog">select*fromt_whereidin<foreachcollection="array"index="index"item="item"open="("separator=","close=")">#item</foreach></select>上述collection为array,对应的Mapper代
23、码:javaviewplaincopypublicList<Blog>dynamicForeach2Test(intids);对应的测试代码:javaviewplaincopyTestpublicvoiddynamicForeach2Test()SqlSessionsession=Util.getSqlSessionFactory().openSession();BlogMapperblogMapper=session.getMapper(BlogMapper.class);intids=newint1,3,6,9;List<Blog>blogs=blogMapper.
24、dynamicForeach2Test(ids);for(Blogblog:blogs)System.out.println(blog);session.close();3 .自己把参数封装成Map的类型javaviewplaincopy<selectid="dynamicForeach3Test"resultType="Blog">select*fromt_blogwheretitlelike"%"#title"%"andidin<foreachcollection="ids"
25、;index="index"item="item"open="("separator=","close=")">#item</foreach></select>上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:javaviewplaincopypublicList<Blog>dynamicForeach3Test(Map<String,Object>params);对应测试代码:javaviewplai
26、ncopyTestpublicvoiddynamicForeach3Test()SqlSessionsession=Util.getSqlSessionFactory().openSession();BlogMapperblogMapper=session.getMapper(BlogMapper.class);finalList<Integer>ids=newArrayList<Integer>();ids.add(1);ids.add(2);ids.add(3);ids.add(6);ids.add(7);ids.add(9);Map<String,Objec
27、t>params=newHashMap<String,Object>();params.put("ids",ids);params.put("title","中国");List<Blog>blogs=blogMapper.dynamicForeach3Test(params);for(Blogblog:blogs)System.out.println(blog);session.close();6、联合实例:htmlviewplaincopy<insertid="batchInsertTr
28、xBillDetailInfo"parameterType="java.util.Map">INSERTALL<foreachcollection="list"item="item">intoTRX_BILL_DETAIL_INFO<trimprefix="("suffix=")"suffixOverrides=","><iftest="item.id!=null">ID,</if><i
29、ftest="item.custNo!=null">CUST_NO,</if><iftest="item.transCode!=null">TRANS_CODE,</if><iftest="item.transRefno!=null">TRANS_REFNO,</if><iftest="item.transSeqno!=null">TRANS_SEQNO,</if><iftest="item.orderNo!=
30、null">ORDER_NO,</if><iftest="item.transAmt!=null">TRANS_AMT,</if><iftest="item.billDate!=null">BILL_DATE,</if><iftest="item.billFlag!=null">BILL_FLAG,</if><iftest="item.transDesc!=null">TRANS_DESC,</if></trim><trim
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养老院护理员基础知识
- 2025年公共卫生专项训练卷
- 油气管道维护工常识强化考核试卷含答案
- 冲印师诚信品质评优考核试卷含答案
- 长期照护师岗前安全管理考核试卷含答案
- 砖瓦烧火工诚信评优考核试卷含答案
- 生活垃圾清运工成果转化强化考核试卷含答案
- 民宿管家风险评估与管理考核试卷含答案
- 电机检修工岗前安全生产知识考核试卷含答案
- 油料计量员安全素养水平考核试卷含答案
- 协查通报治安管理制度
- 2025年江西省南昌市高考数学一模试卷+答案解析
- 中航集团(国航股份)信息管理部招聘笔试题库2025
- 2025年云南省中考数学-26题二次函数降次幂题35道
- 外贸佣金返还协议书
- 中山市施工合同标准文本
- 元宵节安全教育
- 2025年春季学期教导处工作计划及安排表
- 2025年九年级数学复习计划
- 幼儿园开学前教职工安全工作培训
- 医保DRG培训课件
评论
0/150
提交评论