灵活的MyBatis
一、前言
将数据存储到数据库是开发中很重要的一环。曾经有程序员说自己做过最牛逼的事情就是增删改查。确实我们做了很多页面,后太代码写了很多,可是最终都离不开数据库的增删改查。Java有一套自己的JPA标准,而Hibernate很好的实现了这套标准,但为什么会有企业会选择MyBatis进行开发?Hibernate入门的门槛相对较高,而MyBatis上手容易,同时灵活,平常怎么在数据库使用SQL语句,很容易的就可以移植到MyBatis的XML文件里,灵活使得实际开发中更加方便。
二、简单的增删改查
MyBatis中需要将SQL语句封装到XML文件的标签中,无论是简单的增删改查,还是复杂的查询,这种模式都是行之有效的。当然从整体上来看,这种有序地排列SQL语句是一个非常好的结果,在理想的情况下,并没有问题。然而实际上,有的项目会用几十个字段,一个单一业务模块背后的SQL代码可能达到上千行,同时有可能没有注释,这样子想找一条已经存在有合用的SQL语句是非常麻烦的事情,同时也很容易造成重复编写相同、相似SQL语句的情况。
比如,已经有一条SQL语句获取没有被删除的User
<select id="getUser" resultType="User">
SELECT * FORM T_USER WHERE DELETE_FLAG = '0'
</select>
如果代码量太大,同时接口方法的命名信息抽象,又没有写任何注释的情况下,有可能会产生相似的语句
<select id="getCancelUser" resultType="User">
SELECT * FROM T_USER WHERE DELETE_FLAG = '1'
</select>
一个是获取已经登记但没有注销的所有用户,一个是获取所有已经注销了的用户。看上去不可能产生这种情况,在上千行代码的情况下,就有可能会产生,毕竟接口抽象,又没有注释。
因此,对于这种简单SQL语句,可以使用注解的方法,使抽象的接口"形象化“
@Select("SELECT * FROM T_USER WHERE DELETE_FLAG = '0'")
public User getUser();
当你的团队成员在寻找相似语句的时候,就可以很容易地注意到这条SQL语句,而不是这表述含糊的方法名。这个时候,就不需要写一条新的SQL语句,只需要在原来的基础上进行修改就可以了
@Select("SELECT * FROM T_USER WHERE DELETE_FLAG = #{deleteFlag}")
public User getUser(@Param("deleteFlag")String deleteFlag);
这样同一条SQL语句,只要传不同的值就可以了。@Param是参数的注解,一般情况下,是可以不加这个注解的,MyBatis可以自动封装。
类似地,还有@Insert、@Update、@Delete注解,使用基本雷同。
三、动态SQL
在进行数据库操作的时候,我们通常传入对象来进行增删改查,但是如果传入的对象在某些时候没有值,那么我们通过动态标签就可以避免重复编写相似的SQL语句
1、<if>与<where>
//public List<Blog> findActiveBlogLike(Blog blog)
<select id="findActiveBlogLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
<WHERE>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</WHERE>
</select>
我们可以通过<if>标签,判断传入的对象是否存在值,进而动态改变查询的SQL语句。如果所有的条件均为空,那么就会出现SELECT * FROM BLOG WHERE 这样的SQL语句,这个时候会报错,当然可以改为SELECT * FROM BLOG WHERE 1=1。同时也可以引用<where>标签,当所有的条件均不存在的时候,这个where也会被自动去掉
2、<foreach>
//public List<Post> selectPostIn(List<String> list)
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
当我们需要查询的SQL语句包含in 的时候,我们可以通过<foreach>来遍历实现。
3、<set>
<update id="updateAuthorIfNecessary"
parameterType="domain.blog.Author">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio},</if>
</set>
where id=#{id}
</update>
进行更行操作的时候,传入的对象的各个字段不一定都有值,这个时候,可以使用<if>标签来进行动态列举,但这个时候会产生一个问题,那就是条件后面的“,”逗号,为了避免报错,这里可以引入<set>标签,即使最后一个条件后面有逗号,也不会报错
动态标签还有其他的,详细可以参考官方文档[1]。
四、缓存[2]
对于一些常用的查询,不可能每一次都从数据库里头拿,特别是那些相对固定,同时数据量又比较大的查询。这个时候缓存显得比较重要。MyBatis有自己的缓存机制,也可以与Ehcache整合[3],当然最好是使用Redis
五、后言
MyBatis是一个很灵活的持久层框架,本文旨在阐述MyBatis的基本使用,以及日常优化配置。同时本文也是这一系列最后一篇文章。本系列五篇文章旨在指出理论学习与实际应用当中的差异,既非入门教程,也非解决方案。
--2018.10.08增补--
框架具有时代性。在SSM之前,是S2SH的时代,在哪个时代,S2SH是非常优秀的框架,对比起传统的JDBC和Servlet来说。上个世纪50年代,拿着“大哥大”打电话是非常先进的,毕竟当时很少人可以用到。本世纪初,诺基亚的手机相比起“大哥大”要先进许多。到今天2018年,人们都是用着代用指纹识别、可拍照、可上网的智能手机。技术在迭代,时代在改变。
Reference:
[1] 官方中文网,http://www.mybatis.org/mybatis-3/zh/index.html
[2] 小秋蜀黍, mybatis缓存文件的配置, https://blog.csdn.net/sinat_32133675/article/details/76691009
[3] 落叶枫桥, MyBatis笔记——EhCache二级缓存, https://www.cnblogs.com/pwc1996/p/4839133.html
灵活的MyBatis的更多相关文章
- MyBatis 入门(一)
MyBatis mybatis和hibernate都属于orm(对象与关系映射) 框架 mybatis的优点: 1.sql-mapping :操作更自由,可控性高,执行效率更高 2.轻量,学习更容易 ...
- MyBatis学习日记(一):拜见小主——MyBatis
近日学习MyBatis,特将学习过程及一点心得记录于此. MyBatis为何物? MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC ...
- Spring Boot集成MyBatis的2种方式
目录 写在前面 准备工作 配置数据库驱动 配置数据源 原生集成MyBatis 依赖配置 注册MyBatis核心组件 定义并使用映射器 通过MyBatis-Spring-Boot-Starter集成 默 ...
- mybatis配置与使用
一:Mybatis简介 1.名称由来 Mybatis原名叫ibatis.Mybatis一开始属于Apache,2010年从Apache转移到了GoogleCode这个组织中. 2.Mybatis概念 ...
- SpringDataJPA与Mybatis的优异性
首先表达个人观点,JPA必然是首选的. 个人认为仅仅讨论两者使用起来有何区别,何者更加方便,不足以真正的比较这两个框架.要评判出更加优秀的方案,我觉得可以从软件设计的角度来评判.个人对 mybatis ...
- MyBatis学习总结(一)——ORM概要与MyBatis快速起步
程序员应该将核心关注点放在业务上,而不应该将时间过多的浪费在CRUD中,多数的ORM框架都把增加.修改与删除做得非常不错了,然后数据库中查询无疑是使用频次最高.复杂度大.与性能密切相关的操作,我们希望 ...
- mybatis入门 配置文件解释 及测试
这里介绍一下mybatis 根据mybatis的官网说明,mybatis是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...
- mybatis入门配置和调试
欢迎转载http://www.cnblogs.com/jianshuai520/p/8669177.html大家一起努力,如果看的时候有图片半边遮挡起来的话,右键查看图片,就可以观看完整的图片,具体怎 ...
- [MyBatis] MyBatis理论入门
什么是MyBatis iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs) 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyB ...
随机推荐
- python基础04day
一 引子 数据类型 用途 定义方式 是否多项 有/无序 可/不可变 对应状态 数字 否 —— 不可 字符串 “”‘’“““””” 否 有 不可 列表 [] 是 有 可 同 ...
- cmd查找并杀死被占用的端口的进程
java开发启动server的时候经常会遇到端口被占用的错误提示, 如果不想更换服务配置的端口号,那么怎么解决端口被占用的情况呢? 1. cmd窗口输入netstat -ano ,在列表中查看被占用的 ...
- AngularJS 菜鸟
AngualrJS是 JavaScript框架. <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/ang ...
- Linux搭建MySQL主从
实现目标 搭建两台MySQL服务器(一主一从),一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作. 工作流程概述 主服务器: 开启二进制日志 配置唯一的server-id 获 ...
- 内核中dump_stack的实现原理(1) —— 栈回溯
环境 Aarch64 Qemu aarch64-linux-gnu-gcc linux-4.14 概述 栈回溯的目的是将函数的调用栈打印出来,对于分析函数调用和debug系统异常会很有帮助 ...
- SSH爆破应急响应
问题发现 登录云主机,根据提示消息,发现正遭受SSH爆破攻击,IP地址为159.65.230.189 查看登录相关安全日志:tail -f /var/log/secure,发现其他尝试爆破IP106. ...
- Kali linux network is unreachable
使用树莓派4 安装完kali linux后,配置好ip,能ping通上级路由. 但ping公网地址显示网络不可达. Ping: connect: network is unreachable 解决方法 ...
- 用Java的大整数类BigInteger来实现大整数的一些运算
关于BigInteger的构造函数,一般会用到两个: BigInteger(String val); //将指定字符串转换为十进制表示形式: BigInteger(String val,int rad ...
- 2019年杭电多校第一场 1009题String(HDU6586+模拟+单调栈)
题目链接 传送门 题意 给你一个字符串,要你构造一个长为\(k\)的子串使得每个字母出现的次数在\([L_i,R_i](0\leq i\leq26)\)间且字典序最小. 思路 做这种题目就是要保持思路 ...
- django最小程序开发流程
1.建立工程 在工程目录下打开cmd,输入以下命令.其中mysite是项目名称. django-admin startproject mysite 命令运行完后,在该目录下会出现一个名为mysite的 ...