项目告一段落,业务代码也写得差不多了,框架仍然用的是 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. MVC-Cache-2.应用程序缓存(Cache:1.输出缓存[2].应用程序缓存)

    2.应用数据缓存-Cache 1.引入CacheHelper.cs CacheHelper.cs文件源码在下面; 2.介绍用法: //键 string ips = "键"; //值 ...

  2. (转)大厂常问到的14个Java面试题

    1. synchronized和reentrantlock异同 相同点 都实现了多线程同步和内存可见性语义 都是可重入锁 不同点 实现机制不同 synchronized通过java对象头锁标记和Mon ...

  3. 使用Arduino开发板控制步进电机

    目前为止,我还没有真正深入了解过电机,特别是步进电机. 最近我在计划一个项目,需要相对精确的电机控制,所以可能会使用到步进电机,但很快就意识到我首先应该更多地了解这些. 本篇文章主要介绍我到目前为止学 ...

  4. datatable修改每页默认显示的数量

    datatable修改每页默认显示的数量 一.总结 一句话总结: iDisplayLength属性:'iDisplayLength':50 1.datatable默认每页显示50个? iDisplay ...

  5. evpp return index.html

    https://github.com/yuqingtong1990/ggtalk_server/blob/99f0f85c683dc0a0c3e76dcae611f60f6456eed6/server ...

  6. python访问aws-S3服务

    创建本地 AWS 凭证文件 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/. 创建一个新用户,其权限仅限于您希望您的代 ...

  7. 【xsy2978】Product of Roots 生成函数+多项式ln+多项式exp

    题目大意:给你两个多项式$f(x)$和$g(x)$,满足$f(x)=\prod\limits_{i=1}^{n}(a_i+1)$,$g(x)=\prod\limits_{i=1}^{m}(b_i+1) ...

  8. C# TreeView 右键菜单

    方法一: 在winform中,添加一个contextMenuStrip1,设置TreeView的属性ContextMenuStrip为contextMenuStrip1,并为这个contextMenu ...

  9. 51、[源码]-Spring容器创建-容器创建完成

    51.[源码]-Spring容器创建-容器创建完成 12.finishRefresh();完成BeanFactory的初始化创建工作:IOC容器就创建完成: 1).initLifecycleProce ...

  10. HttpServletRequest获取浏览器、服务端和客户端信息

    如何通过HttpServletRequest来获取到上面的属性呢? 1.引入开源工具 <!-- https://mvnrepository.com/artifact/eu.bitwalker/U ...