项目告一段落,业务代码也写得差不多了,框架仍然用的是 ssm ,为了省去单表数据库操作的代码编写,继续用 mybatis generator 生成单表对应的实体类、dao层映射关联及配置文件,私下还尝试了几个实现批量插入,翻页查询及实体类序列化的插件,还是很奏效的。下面着重介绍一下近期开发中常见的 mybatis xml 中的特殊写法。

1. 关于 >,< 比较运算符的使用

  一种写法是直接将 > 换成 &gt; 把 < 换成 &lt;

        <if test="start != null">
AND call_time &gt;= #{start}
</if>
<if test="end != null">
AND call_time &lt;= #{end}
    </if>

  另一种写法是用 <![CDATA[ *** ]]> 将 sql 包起来:

        <![CDATA[
and create_time >= #{start}
]]>

2. 实现模糊查询 like

  一种是比较规矩一点的写法,用 <bind name=" *** " value = " *** " />  实现 like 子句的绑定:

    <if test="secretId != null and secretId != ''">
<bind name="pattern" value="'%' + secretId + '%'" />
and secret_id like #{pattern}
</if>

  注意将 <bind .../> 写在条件判断里面,否则当 secretId 为 null 的时候是会出异常的。

  另一种比较简单粗暴,直接写为 '%${like_clause}%' 放到语句中:

    <if test="batchNo != null and batchNo != ''">
WHERE batch_no LIKE '%${batchNo}%'
</if>

3. IF(***,***,***) 这样的 mysql 函数在 mybatis 中无效:

   <select id="getCallerItems" parameterType="java.lang.String">
SELECT a.account AS name,
IF(tmp1.calledNum IS NULL,0,tmp1.calledNum),
IF(tmp2.ownedCallNum IS NULL,0,tmp2.ownedCallNum)
FROM account a LEFT JOIN (
SELECT COUNT(*) AS calledNum,`owner`
FROM secret_pool
WHERE `status` = 0
<if test="batchNo !=null">
and batch_no = #{batchNo}
</if>
AND call_round > 0
GROUP BY `owner`
)tmp1 ON a.account = tmp1.`owner` LEFT JOIN (
SELECT COUNT(*) AS ownedCallNum,`owner`
FROM secret_pool
WHERE `status` = 0
<if test="batchNo !=null">
and batch_no = #{batchNo}
</if>
GROUP BY `owner`
)tmp2 ON a.account = tmp2.`owner`
</select>

  这里我是想用将外连接中因匹配不到对应结果而产生的 null 替换成 0 ,结果非但没有替换成功还查不出正确的结果,心塞。

4. <where>,<choose>,<foreach> 标签的应用:

  <where></where> 广泛用于非必传参数的条件查询;

  mybatis 中没有表示 else if 的标签,可用<choose> 配合 <otherwise> 来代替;

  <foreach> 在传入参数包含集合的时候可用到;

    <select id="selectByPagination" resultMap="BaseResultMap" parameterType="bz.sunlight.dto.UserSearchDTO">
SELECT u.* FROM `user` u
LEFT JOIN user_role ur ON u.Id = ur.User_Id
LEFT JOIN role r ON ur.Role_Id = r.Id
<where>
<if test="name != null and name != ''">
u.`Name` LIKE '%${name}%'
</if>
<if test="status != null">
AND u.Status = #{status}
</if>
<if test="roleId != null">
AND r.Id IN
<foreach item="item" collection="roleIds" separator="," open="(" close=")" index="">
#{item, jdbcType=VARCHAR}
</foreach>
</if>
</where>
<if test="sortField != null and sortField != ''">
ORDER BY
<choose>
<when test="isDesc != null and isDesc"> ${sortField} DESC </when>
<otherwise> ${sortField} </otherwise>
</choose>
</if>
<if test="pageSize != null">
<if test="offset != null">
limit ${offset}, ${pageSize}
</if>
<if test="offset == null">
limit ${pageSize}
</if>
</if>
</select>

  其实说到底,不管哪种写法都是为了实现一条 sql 语句,后台开发核心还是 sql ,即使框架用得再熟,如果对理解不透数据模型不能高效地查出准确的结果,什么高大上的实现方式都是花架子,至于到底选择哪种写法,个人觉得越简单越好。我虽然在上面列举了不同的实现方式都因为在对的时间遇到了不一定对的它,记下来缅怀那段邂逅。

Mybatis xml mapper 特殊写法总结的更多相关文章

  1. mybatis xml mapper 文件中 if-else 写法

    mybaits 中没有else要用chose when otherwise 代替 范例一 <!--批量插入用户--> <insert id="insertBusinessU ...

  2. mybatis xml动态语句写法

    mapper.java: /** * @Description: 根据摄像机Id查询出入记录 * @Param: * name 姓名 * monitorId 布控ID * starttime 开始时间 ...

  3. 关于Mybatis中Mapper是使用XML还是注解的一些思考

    XML 据说可以灵活的进行注解,但是修改以后还是要重新发布程序.当然,你可以说,在Tomcat中改了,然后热加载了,不就可以了.可是一般情况下都是几台,十几台服务器.都是用发布系统,持续集成的方式部署 ...

  4. mybatis从mapper接口跳转到相应的xml文件的eclipse插件

    mybatis从mapper接口跳转到相应的xml文件的eclipse插件 前提条件 开发软件 eclipse 使用框架 mybatis 为了方便阅读源码,项目使用mybatis的时候,方便从mapp ...

  5. mybatis.xml和mapper.xml的配置

    mybatis.xml和mapper.xml的配置 1.创建一个Source Folder 2.完成分包mapper和mybatis 3.创建mybatis.xml文档 4xml文档名 5.名字规范 ...

  6. mybatis xml和dao扫描写法

    第一种:接口和xml不在同一个目录,需要在sqlSessionFactoryBean中额外 指定xml的路径: <!-- myBatis文件 --> <bean id="s ...

  7. 【mybatis】idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin

    idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin,名字可能叫Free mybatis-plugin 安装上之后,可能需要重启ide ...

  8. 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)

    一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...

  9. (转)解决mybatis的mapper.xml查询不出数据,结果一直为null问题

    背景:记录mybatis使用过程中遇到的相关问题. 解决mybatis的mapper.xml查询不出数据,结果一直为null问题 解决方案: 1 修改实体类与数据库字段名相同 2 修改sql查询语句, ...

随机推荐

  1. HTML和XML中的转义字符

    HTML中的转义字符  HTML中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用他们的转义序列,如下所示: & ...

  2. JAVA笔记整理(二),下载安装JDK

    Windows平台 1.登录Oracle官方网站(http://www.oracle.com/index.html),找到下载 2.选择要下载的版本,点击JDK DOWNLOAD 3.下载文件,先勾选 ...

  3. mysql(单表查询,多表查询,MySQl创建用户和授权,可视化工具Navicat的使用)

    单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT ...

  4. queue模块笔记

    queue被称为消息队列,数据不会混乱,也可以用于复杂业务传递元素,队列是多线程的利器,其内部有锁的机制可以控制数据的统一且安全 queue.Queue()按照先进先出原则 queue.LifoQue ...

  5. 大数据之路week06--day07(Hadoop生态圈的介绍)

    Hadoop 基本概念 一.Hadoop出现的前提环境 随着数据量的增大带来了以下的问题 (1)如何存储大量的数据? (2)怎么处理这些数据? (3)怎样的高效的分析这些数据? (4)在数据增长的情况 ...

  6. 《TheOne团队》团队作业三:团队项目原型设计与开发

    项目 内容 作业所属课程 http://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/nwnu-daizh/p/10761596.h ...

  7. JavaScript常用类库推荐

    Axios Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 [中文说明], [Github], [教程] Lodash 一致性.模块化.高性能的 Jav ...

  8. 更新studio 3T的试用期时间

    j@echo off ECHO 重置Studio 3T的使用日期...... FOR /f "tokens=1,2,* " %%i IN ('reg query "HKE ...

  9. 学习路线 (转自 https://mp.weixin.qq.com/s/_FIGSda6wWL-5LXMQAk3IA )

  10. wsgiref 与 Django框架初识

    前戏: Web框架的本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,这样我们就可以自己实现Web框架 软件开发架构: c/s架构 客 ...