项目告一段落,业务代码也写得差不多了,框架仍然用的是 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. 改变说明文档显示位置wrap

    装饰器会改变文档的显示位置 例子1:使用wrap前,输出内函数中的说明文档 def check(fun): """检查权限的装饰器""" d ...

  2. 【leetcode】513.Find Bottom Left Tree Value

    原题 Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / 1 ...

  3. SHA256WithRSA

    在上文中了解到SHA和RSA,工作中恰好用到扩展应用:SHA256WithRSA,本文总结下学习过程,备忘の 再提供另外一种方法,实现Java版pem密钥和.Net版xml密钥相互转换的方法 密钥转换 ...

  4. OSI七层模型的新认识

    OSI 七层模型是internet的基石,它并没有制定一个标准,规定我们要怎么去做.美国军方曾把它精简到四层,只是站在了更实用的层次. 我们先来看看这个模型.   应用层->Applicatio ...

  5. Java springboot 中上传图片文件的1Md的限制

    在配置文件中修改了 spring.servlet.multipart.max-file-size=3.40spring.servlet.multipart.max-request-size=3M 遇到 ...

  6. MySQL进阶13--常见六大约束: 非空/默认/主键/唯一约束/检查约束/外键约束--表级约束 / 列级约束

    /* MySQL进阶13 常见六大约束: 1.not null 非空 2.default :默认值,用于保证该字段的默认值 ; 比如年龄:1900-10-10 3.primary key : 主键,用 ...

  7. .NET Core SignalR 和 .NET SignalR 区别

    由于要转 .NET Core ,对于以前用到的一些进行迁移. 在迁移 SignalR 的时候发现 .NET Core 下的和 .NET 下的区别还是挺大的. 功能差异 自定重新连接 .NET 下的 S ...

  8. 跨站请求伪造(CSRF 或者 XSRF)与跨站脚本(XSS)

    跨站请求伪造 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 X ...

  9. VueRouter基础

    安装 直接下载(官方CDN) https://unpkg.com/vue-router/...通过页面script标签引入,如下: <script src='https://unpkg.com/ ...

  10. C++重温历史

    这是一篇C#开发重新学习C++的体验文章. 作为一个C#开发为什么要重新学习C++呢?因为在C#在很多业务场景需要调用一些C++编写的COM组件,如果不了解C++,那么,很容易注定是要被C++同事忽悠 ...