if条件查询

格式: <if test=”条件判断”> 添加到sql的语句 </if>

where标签

简化SQL语句中WHERE条件判断

智能处理and和or

如果使用几个if条件标签,如果第一个条件不成立,那么该sql语句就不成立了.

把所有的if条件语句加入到where标签内,则会根据if语句成立是否添加where条件,若标签返回的内容是以and或者or开头的,会自动剔除.

案例:

<!-- 分类后根据关键字进行搜索 -->

<select id="getUserListByClassify" resultMap="userList">

SELECT user.*,role.roleName

FROM smbms_user user

INNER JOIN smbms_role role ON user.userRole=role.id

<where>

<if test="userName != null">

AND   userName like CONCAT('%',#{userName},'%')

</if>

<if test="userRole != null">

AND userRole=#{userRole}

</if>

</where>

</select>

trim标签

属性:

prefix:前缀 如果有返回值,在标签前加的语句

suffix:后缀 如果有返回值,在标签后加的语句

prefixOverrides:对于trim包含内容的首部进行指定内容的忽略

sufixOverrides:对于trim包含内容的尾部进行指定内容的忽略

可以去除多余的关键字(自定义)   where只能去除多余的and/or

<!-- 分类后根据关键字进行搜索 -->

<select id="getUserListByClassify" resultMap="userList">

SELECT user.*,role.roleName

FROM smbms_user user

INNER JOIN smbms_role role ON user.userRole=role.id

<trim prefix="where" prefixOverrides="and | or">

<if test="userName != null">

userName like CONCAT('%',#{userName},'%')

</if>

<if test="userRole != null">

and userRole=#{userRole}

</if>

</trim>

</select>

if+set进行修改(在实际开发中很少使用)

如何只对有值得参数进行修改,而不必每次都要获取整个对象.

案例:

<!-- 更新用户属性 -->

<update id="update" parameterType="User">

UPDATE smbms_user

<set>

<if test="userCode != null">userCode=#{userCode},</if>

<if test="userName!= null">userName=#{userName},</if>

<if test="userPassword!=          null">userPassword=#{userPassword},</if>

<if test="gender!= null">gender=#{gender},</if>

<if test="birthday!= null">birthday=#{birthday},</if>

<if test="phone!= null">phone=#{phone},</if>

<if test="address!= null">address=#{address},</if>

<if test="modifyDate!= null">modifyDate=#{modifyDate}</if>

</set>

where id=#{id}

</update>

if+trim进行修改

添加条件判断修改

<!-- 更新用户属性 -->

<update id="update" parameterType="User">

UPDATE smbms_user

<trim prefix="set" prefixOverrides="," resultMap="userList">

<if test="userCode != null">userCode=#{userCode},</if>

<if test="userCode != null">userName=#{userName},</if>

<if test="userCode !=          null">userPassword=#{userPassword},</if>

<if test="userCode != null">gender=#{gender},</if>

<if test="userCode != null">birthday=#{birthday},</if>

<if test="userCode != null">phone=#{phone},</if>

<if test="userCode != null">address=#{address},</if>

<if test="userCode != null">modifyDate=#{modifyDate}</if>

</trim>

where id=#{id}

</update>

使用foreach进行复杂查询

迭代一个集合,通常用于in条件

属性:

item:表示集合中每一个元素进行迭代时候的别名

index:指定一个名称,表示迭代过程中,每次迭代到的位置.(可省略...)

open:表示语句以什么开始 例:open=”(”

separator:表示每次进行迭代之间以什么作为分隔符.

close:表示该语句以什么结束.

collection:最关键并最容易出错的属性,该属性必须指定,不同情况下,该属性的值也不一样,主要分三种:

  1. 若传入的参数为单参数且参数类型是一个List的时候,collection属性值为list.
  2. 若入参为单参数且参数类型为数组的时候,collection属性值为array
  3. 若传入的参数为多参数,就需要把他们封装为一个Map处理,属性值为Map的key.

案例:使用foreach实现 全选 删除

<!-- 删除用户 -->

<delete id="delete" parameterType="map">

DELETE FROM smbms_user WHERE id IN

<!-- 传入的参数为map集合时 collection=为map的key -->

<foreach collection="id" item="userId" open="(" separator="," close=")">

#{userId}

</foreach>

<!-- 传入的参数为数组时候  collection="array" -->

<foreach collection="array" item="userId" open="(" separator="," close=")">

#{userId}

</foreach>

<!-- 传入的参数为List时候  collection="list" -->

<foreach collection="list" item="userId" open="(" separator="," close=")">

#{userId}

</foreach>

</delete>

 

choose(when,otherwise)

类似于java的switch --case语句,跟JSTL的choose使用方式一样.

when元素:当test属性中条件满足的时候.就会输出when元素的内容.跟java中switch一样,依次向下执行,当有一个when中的test条件成立后,执行该语句立马跳出choose,所以choose中只有一个条件会输出.

MyBatis分页

获取数据的页数

<!-- 获取数据的总记录数 -->

<select id="getAllPages" resultType="Integer">

SELECT COUNT(`id`) AS pages FROM smbms_user

<trim prefix="where" prefixOverrides="and | or">

<if test="userRole != null">

userRole=#{userRole};

</if>

</trim>

</select>

注:if或when标签是针对JAVABEAN或者MAP的,进行判断的参数要么使用注解进行封装,或传入对象,或添加进map在进行传参数.

分页

<!-- 查询所有用户 并进行分页 -->

<select id="getAllUser" resultType="User">

SELECT user.*,role.roleName

FROM smbms_user user

INNER JOIN smbms_role role ON user.userRole=role.id

ORDER BY creationDate DESC LIMIT #{from},#{pageSize}

</select>

获取最后一条插入数据的id(自增主键)

Mysql动态查询的更多相关文章

  1. MYSQL动态查询拼接的表名的SQL脚本实现(MYSQL动态执行SQL脚本)

    可以使用MYSQL的预处理逻辑:https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html   例如: pr ...

  2. Mybatis动态查询

    需要导入的jar包: 实体类User: package com.bjsxt.pojo; import java.io.Serializable; public class User implement ...

  3. JDBC动态查询MySQL中的表(按条件筛选)

    动态查询实现按条件筛选.PreparedStatement 准备语句指定要查询的表头列,.setString()通过赋值指定行,.executeQuery()执行语句 在数据库test里先创建表sch ...

  4. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  5. mysql死锁-查询锁表进程-分析锁表原因【转】

    查询锁表进程: 1.查询是否锁表 show OPEN TABLES where In_use > 0;   2.查询进程     show processlist   查询到相对应的进程===然 ...

  6. WinForm动态查询

    WinForm 动态查询 1. 使用场景 在对数据进行筛选, 包含多个筛选字段时适用. 2. 接口设计 /// <summary> /// 定义可作为追加到 WHERE 子句的控件接口 / ...

  7. Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办--转自http://www.jb51.net/article/88236.htm

    这篇文章主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下   项目开发中,在做Mybatis动态查询时,遇到了 ...

  8. springboot整合spring data jpa 动态查询

    Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询,在实现动态查询时我们需要用到Criteria API,主要是以下三个: 1.Criteria ...

  9. JDBC实现动态查询

    一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语 ...

随机推荐

  1. HttpClientUtil 工具类 实现跨域请求数据

    package com.xxx.common.util; import java.io.IOException; import java.net.URI; import java.util.Array ...

  2. how to read openstack code: Neutron architecture

    今天这一章节非常重要.我们知道neutron是一个非常复杂的系统,由很多组件构成.研究这样一个复杂的系统,正确的顺序应该是现在宏观上对其整体结构有所了解,然后再由针对性的对其组件进行深入了解.本章要做 ...

  3. commons-lang常用工具类StringEscapeUtils

    原文:https://my.oschina.net/mousai/blog/88832 在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是为了防止s ...

  4. go-import下划线的作用

    原文:http://studygolang.com/articles/4356 ------------------------------------------------------------ ...

  5. react 执行 yarn build 页面无法显示

    资源文件路径问题 如果你使用create-react-app创建项目,执行命令 yarn build 后,直接以静态方式打开build文件夹内的index.html,会看到页面显示出现问题,打开con ...

  6. Mariadb 主从

    一 mariadb主从多用于网站架构,因为该主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构 ...

  7. hdu 5253 连接的管道(kruskal)(2015年百度之星程序设计大赛 - 初赛(2))

    连接的管道 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. Rational 最新软件试用下载地址

    看到非常多 TX 都在问老版本号 Raitonal 软件相关的问题,可是因为产品升级的时候有非常多名字都发生了更改(比方说 Rational Rose 最新的版本号变成了 Rational Softw ...

  9. 有banner的uid数, 有logo的uid数 , 交集数

    [len(i) for i in [banners_uid_set,logos_uid_set,banners_uid_set&logos_uid_set]] import glob impo ...

  10. Windows10 Win键失灵的解决方法

    之前在Windows10出来的时候在使用过程中发现:按“Win键”调出开始菜单没有用.一点反应都没有.Win+R等这样的组合键也没用. 后来周年更新后,还是无法使用... 各种方法用尽啊.都不行啊! ...