动态sql

一:if标签使用:

我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接。

Mapper配置文件:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jd.com.vodemo.voMapper" >
<select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo">
SELECT * FROM t_account WHERE = AND
<if test="ac.name!=null and ac.name!=''">
NAME LIKE '%${ac.name}%'
</if>
<if test="ac.id!=null and ac.id!=''">
AND id >#{ac.id}
</if>
</select>
</mapper>

注意:我们需要使用SELECT    * FROM t_account WHERE 1=1 AND  条件1 AND 条件2.。。。。。这种使用。

其中if标签中的test表达式是测试条件和字段是否为空或者nul,注意这里也是属性.属性。

实际的输出语句:

2018-04-25 18:40:14,733 DEBUG [main] voMapper.findAccByIdAndName.debug:139 | ==>  Preparing: SELECT * FROM t_account WHERE 1=1 AND NAME LIKE '%ok%' AND id >?

二、where标签:可以帮我们补全where关键字也不需要1=1的条件:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jd.com.vodemo.voMapper" >
<select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo">
SELECT * FROM t_account
<where>
<if test="ac.name!=null and ac.name!=''">
NAME LIKE '%${ac.name}%'
</if>
<if test="ac.id!=null and ac.id!=''">
And id >#{ac.id}
</if>
</where> </select>
</mapper>

sql语句:

如果别的查询语句也需要这些条件 我们可以进行重用

在<mapper>标签下面 使用sql标签。

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jd.com.vodemo.voMapper" >
6 <sql id="useMangCon" >
7 <where>
8 <if test="ac.name!=null and ac.name!=''">
9 NAME LIKE '%${ac.name}%'
10 </if>
11 <if test="ac.id!=null and ac.id!=''">
12 And id >#{ac.id}
13 </if>
14 </where>
15 </sql>
<select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo" > SELECT * FROM t_account
<include refid="useMangCon" /> </select>
</mapper>

其种id是唯一是别人调用的时候标识。

相应的引用使用的标签是include标签。

 <include refid="useMangCon" />

这样这部分的条件可以进行复用。

三、foreach的标签

当前端传来一些列的id,为列表的时候,我们可以使用id进行查询。这时候sql使用的是in而 不是or  or的效率很低。

           <foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," >
#{xx}
</foreach>

首先了解下foreach的里的属性意思:

1、collection:集合,就是传入的变量的集合的名称。这个需要跟你传入的对象内的属性字段相对应!

2、item:循环的元素,将元素放入这个item中(是将ids的元素放在item里面不是一个而是整个集合)。

3、open:循环开始的拼接符。

4、colse:循环结束的拼接符。

5、separator:就是sql语句中集合内的元素之间的分隔符。

6、#{xx}:取出item的集合。这个名字要和item的名字一样。因为是同一个变量的名称。

完整的例子:

     <select id="findAccByIdList" parameterType="jd.com.vodemo.vodemo" resultType="jd.com.mybaitstest.account" >
SELECT * FROM t_account
<!--<where>-->
<foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," >
#{xx}
</foreach>
<!--</where>--> </select>

其中的where标签可以有也可以没有,只是在foreach中的open拼接的时候需要注意带不带where就可以。

其中parameterType不能写:List<Integer> 会报:columnNumber: 53; 与元素类型 "select" 相关联的 "parameterType" 属性值不能包含 '<' 字符 所以传入对象。

vo类:

 package jd.com.vodemo;
import jd.com.mybaitstest.account; import java.util.List; public class vodemo {
private List<Integer> ids; private account ac; public void setAc(account ac) {
this.ac = ac;
} public account getAc() {
return ac;
} public void setIds(List<Integer> ids) {
this.ids = ids;
} public List<Integer> getIds() {
return ids;
}
}

接口:

 package jd.com.vodemo;
import jd.com.mybaitstest.account;
import java.util.List; public interface voMapper { List<account> findAccByIdAndName(vodemo vo);
List<account> findAccByIdList(vodemo vo);
}

mapper类:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jd.com.vodemo.voMapper" >
<sql id="useMangCon" >
<where>
<if test="ac.name!=null and ac.name!=''">
NAME LIKE '%${ac.name}%'
</if>
<if test="ac.id!=null and ac.id!=''">
And id >#{ac.id}
</if>
</where>
</sql>
<select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo" > SELECT * FROM t_account
<include refid="useMangCon" /> </select>
<select id="findAccByIdList" parameterType="List<Integer>" resultType="jd.com.mybaitstest.account" >
SELECT * FROM t_account
<!--<where>-->
<foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," >
#{xx}
</foreach>
<!--</where>--> </select>
</mapper>

JAVA框架 Mybaits 动态sql的更多相关文章

  1. JAVA框架 Mybaits 动态代理

    一.动态代理: mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类.底层通过反射实例化代理对象,通过代理对象调用相应的方法, ...

  2. mybatis框架(5)---动态sql

    那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态S ...

  3. mybatis框架中动态SQL的编写

    1.动态SQL:在SQL语句中加入流程控制.比如加入if,foreach等. 重点掌握if语句: 案例1: <update id="updateItem" parameter ...

  4. Mybaits动态Sql

    什么是动态SQL? MyBatis的强大之处便是它的动态SQL,如果你使用JDBC那么在根据不同条件查询时,拼接SQL语句是多么的痛苦. 比如查询一个学生信息,可以根据学生的姓名,性别,班级,年龄,学 ...

  5. JAVA框架 Mybaits

     注意:我们在resultType中,对于selectlist方法也是projo类.resultType参数的含义是list的泛型的类型. 一:jar包下载: https://github.com/m ...

  6. java EE实现动态SQL的

    结果图 情况一:

  7. JAVA框架 Mybaits 一对一、一对多

    一:阐述 我们在日常操作的时候,很多时候会遇到多表联合查询,由于参照物的不通 ,会出现一对一.一对多的情况.比如说:账号信息和订单表,从订单表角度和账号信息是一对一的情况(一个订单只能是一个用户的情况 ...

  8. JAVA框架 Mybaits 输入和输出映射

    一.输入映射 当前端传来的参数,比较复杂,比如说用户名称.订单单号.账号信息等等.后端有可能有多个projo类对应这些信息.我们需要把这些的projo类封装成一个类似一个vo类. 通过设置字段形式关联 ...

  9. JAVA框架 Mybaits 核心配置

    一:mybaits的核心配置文件:SqlMapConfig.xml 配置文件中需要关注的属性: 二.properites属性:一般引用配置文件(properites文件)比如:数据库的配置.我们可以编 ...

随机推荐

  1. mysql小试题

    1. 用户登录日志表 xes_user_login_logs 如下: (1) 检索登录超过两次的用户ID(sql语句) select user_id from vvt_ceshi group by u ...

  2. 移动设备 小米2S不显示CD驱动器(H),便携设备,MTP,驱动USB Driver,MI2感叹号的解决方法

    小米2S不显示CD驱动器(H),便携设备,MTP,驱动USB Driver,MI2感叹号的解决方法 by:授客 QQ:1033553122 用户环境 操作系统:Win7 手机设备:小米2S   问题描 ...

  3. 华Xia相机WEB后台设置

    1:设备维护->设备信息:出入口类型:入口2:更多参数->屏显参数:屏显协议18 3:更多参数->外设参数:RS581-1 串口使能勾上 串口工作模式 屏显控制 96004:更多参数 ...

  4. 快速配置webpack 4.x

    区分开发模式和生产模式: npm run start——开发模式,启用devServer,文件的改动实时更新.刷新 npm run build——生产模式,打包文件到dist文件夹 // packag ...

  5. 常用的第三方模块 chardet url

    chardet 字符串编码一直是令人非常头疼的问题,尤其是我们在处理一些不规范的第三方网页的时候.虽然Python提供了Unicode表示的str和bytes两种数据类型,并且可以通过encode() ...

  6. SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组

    SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组 之前写过一篇文章:SQLSERVER将一个文件组的数据移动到另一个文件组 每个物理文件(数据文件)对应一个文件组的情况(一对一) 如 ...

  7. RBAC用户角色权限设计方案【转载】

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  8. python的学习之路day4

    大纲 1.一些常用的内置函数 callable() chr() & ord() 随机生成验证码 map() 全局变量,局部变量 hash() & round() max() min() ...

  9. python字典的基本操作

    字典的基本方法 什么是字典: 字典是一种 key - value的数据类型,听alex说就像我们上学用的字典,通过笔划,字母来查找对饮页面的详细内容. 语法: id_dict = { 'stu1101 ...

  10. 利用windows的计划任务和eKing.CmdReadFileAndSendEmailOper(控制台小程序)实现远程登录服务器的邮件告警提醒

    一.场景摘要: 1.windows计划任务中,有一个用户登录时候触发的事件 2.cmd命令:netstat -ano   | find "3389" 可以看到当前远程登录的IP 3 ...