解放双手,不写SQL!一个开源mybatis神器
什么是通用 Mapper?
它是一个可以方便的使用 Mybatis 进行单表的增删改查优秀开源产品。它使用拦截器来实现具体的执行 Sql,完全使用原生的 Mybatis 进行操作。在 Github 上标星 5.9K!
为什么要用 Mapper?
它提供了所有单表的基本增删改查方法,大大节省了我们书写基本 mapper.xml 的时间。尤其对于新工程和新表来说,极大的提高...
不客气的说,使用这个通用 Mapper 甚至能改变你对 Mybatis 单表基础操作不方便的想法,使用它你能简单的使用单表的增删改查,包含动态的增删改查。
同时,在代码结构合理的前提下,更换 RDBMS 也无须修改 sql,只需修改部分配置即可实现。
如何使用 Mapper?
先通过 maven 引入 jar 包:
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>x.x.x</version>
</dependency>
添加配置文件:
配置方式分为 Java 编码方式和 spring 集成方式。
Java 编码方式
MapperHelper mapperHelper = new MapperHelper();
//特殊配置
Config config = new Config();//具体支持的参数看后面的文档
config.setXXX(XXX);//设置配置
mapperHelper.setConfig(config);// 注册自己项目中使用的通用Mapper接口,这里没有默认值,必须手动注册
mapperHelper.registerMapper(Mapper.class);
//配置完成后,执行下面的操作
mapperHelper.processConfiguration(session.getConfiguration());
2). 纯Spring配置方式
<bean >
<property name="basePackage" value="com.isea533.mybatis.mapper"/>
<property name="properties">
<value>
mappers=tk.mybatis.mapper.common.Mapper </value>
</property>
</bean>
你没看错,就是这么配置的,注意这里是 tk.mybatis.xxx, 和 MyBatis 的唯一区别就是 org. 改成了 tk.,方便修改和记忆。
通用 Mapper 的各项属性通过 properties 属性进行配置,如果默认配置就是一行 mappers=tk.mybatis.mapper.common.Mapper 时,可以不写,就会变成:
<bean >
<property name="basePackage" value="com.isea533.mybatis.mapper"/>
</bean>
继承通用 Mapper 接口(注意必须要加泛型):
@Repository
public interface MaterialDao extends Mapper<MaterialMeta>,
InsertUseGeneratedKeysMapperr<MaterialMeta> {}
上图示例继承了Mapper和InsertUseGeneratedKeysMapper,则直接拥有了这2个接口的所有方法。
上图中实体类的写法示例:
@Table(name = "tb\_helpcenter\_material")
public class MaterialMeta {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String tags;
private Long classificationId;
private String platform;
private String lecturerName;
// Setters&Getters
}
实体类的规则:
1. 表名默认使用类名, 驼峰转下划线 (只对大写字母进行处理), 如 UserInfo 默认对应的表名为 user_info。
2. 表名可以使用 @Table(name = "tableName") 进行指定, 对不符合第一条默认规则的可以通过这种方式指定表名.
3. 字段默认和 @Column 一样, 都会作为表字段, 表字段默认为 Java 对象的 Field 名字驼峰转下划线形式.
4. 可以使用 @Column(name = "fieldName") 指定不符合第 3 条规则的字段名
5. 使用 @Transient 注解可以忽略字段, 添加该注解的字段不会作为表字段使用.
6. 建议一定是有一个 @Id 注解作为主键的字段, 可以有多个 @Id 注解的字段作为联合主键.
7. 默认情况下, 实体类中如果不存在包含 @Id 注解的字段, 所有的字段都会作为主键字段进行使用 (这种效率极低).
8. 实体类可以继承使用, 可以参考测试代码中的 tk.mybatis.mapper.model.UserLogin2 类.
9. 由于基本类型, 如 int 作为实体类字段时会有默认值 0, 而且无法消除, 所以实体类中建议不要使用基本类型.
10.@NameStyle 注解,用来配置对象名 / 字段和表名 / 字段之间的转换方式,该注解优先于全局配置 style,可选值:
另外,建议实体类的所有 Field 全部使用装箱类,不要使用基本类型。
id 字段上的 @GeneratedValue 注解用来表示该表使用的主键策略类型。
使用 Mybatis-Generator 来生成实体类:
使用方法参见:http://ks.netease.com/blog?id=8920
关于主键策略
主键策略主要用于 insert 场景。通常情况下,可以不用设置表对象的主键策略。不设置时,默认会使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键。
你也可以以 @GeneratedValue(generator = “”) 的形式来指定主键策略命令。如:@GeneratedValue(strategy = GenerationType.IDENTITY
,generator = “select last_insert_id()”) 等。
同时,可以根据实际需要,在全局配置中指定主键策略的执行 ORDER。
用 Mybatis-Generator 生成实体类,并创建一个继承了 Mapper 接口的 dao 以后,还要写什么呢?
答案是不用了,可以直接用了
就像这样:
MaterialMeta materialMeta = ReflectUtil.convertObj(MaterialMeta.class, material, false);
materialMeta.setPlatform(platformStr);
materialDao.insertSelective(materialMeta);
还有这样:
Example example = new Example(MaterialMeta.class);
example.createCriteria().andEqualTo("classificationId", material.getClassificationId()).andEqualTo("deleted",false);
example.orderBy("sort").desc();
PageHelper.startPage(1, 1);
List<MaterialMeta> materialMetas = materialDao.selectByExample(example);
或者这样:
materialMeta.setStatus(MaterialStatus.online);
materialMeta.setPublishDate(new Date());
materialDao.updateByPrimaryKeySelective(materialMeta);
如此一来,一行 sql 都不需要写,mapper.xml 文件也不需要了(特殊 sql 仍然需要手写)
只是引入了原生的 Mapper 吗?有没有什么缺陷?我们做了什么改动?
fork 的 Mapper 版本是 3.4.2 的,最新 3.4.3 还没有 release。
像这样的通用框架,几乎支持了市面上所有主流的 rdbms,但是大网易的 DDB 就呵呵哒了。
肿么办呢,当然是改啦。主要的问题是主键策略不支持。于是题主就给她新增了一种逐渐策略,名字就叫 “DDB”。同样是通过拦截器修改 mybatis 的 Configuration 实现的。
同时新增了一个支持 DDB 批量 Insert 的 Mapper,使用全局替换符的形式实现。
在对原生的 Mapper 做了这 2 个增强以后,就可以愉快的支持 DDB 的增删改查了。
使用时,请引入以下 jar 包:
<dependency>
<groupId>com.netease.pop.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.0</version>
</dependency>
同时,在配置文件中增加如下 2 行:
INDENTITY=DDB 表示使用名称为 DDB 的主键策略 (或者也可以在实体类的 GeneratedValue 注解中指定 generator 命令)
ORDER=BEFORE 表示在 insert 命令前执行该主键策略 (这是为了在 insert 前获取主键 id 值来使用)
其他
除了节省书写 sql 的时间外,配合另一个分页的开源插件 PageHelper 使用,可以事半功倍。使用上简单到可怕。
用法示例如下:
PageHelper.offsetPage(offset, limit);
Page<MaterialMeta> metas = (Page<MaterialMeta>) materialDao.selectByExample(example);
没错,就只有这么一行。。。
具体的接入方式可以参看以下文档:https://github.com/pagehelper/MybatisPageHelper/blob/master/README_zh.md
写在最后
欢迎大家关注我的公众号【风平浪静如码】,海量Java相关文章,学习资料都会在里面更新,整理的资料也会放在里面。
觉得写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!
解放双手,不写SQL!一个开源mybatis神器的更多相关文章
- 访问github太慢?我写了一个开源小工具一键变快
前言 GitHub应该是广大开发者最常去的站点,这里面有大量的优秀项目,是广大开发者寻找资源,交友学习的好地方.尤其是前段时间GitHub公布了一项代码存档计划--Arctic Code Vault, ...
- VisualStudio,用C#写的一个开源移动APP,资产管理类项目SmoSec
继SmoOne之后,Smobiler团队又推出一款用C#开发的APP开源项目. 这款开源项目名为SmoSec,目前包含资产管理.耗材管理两大类. 并且,未来会不断迭代,持续增加盘点.标签打印和仓库管理 ...
- 写完批处理脚本,再写个Gradle脚本,解放双手
前言 上一篇写个批处理来帮忙干活---遍历&字符串处理中,我们已经学习如何写批处理脚本来帮我们做一些简单的重复性工作,本篇继续来学习如何用 Gradle 写脚本,让它也来帮我们干活 Gradl ...
- MyBatis 本是apache的一个开源项目iBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...
- 10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)
本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 鸽了很久没发文,不写文章的日子真的好惬意,每天也不用愁着写点什 ...
- 如果我写一个开源的HIS软件
HIS也称为医院信息管理系统,如果我要写一个 开源的,会成吗?为什么要这么做?出于对这个行业的担忧及其当前该行业的一些问题的思考.我曾跟两个HIS供应商讨论过这个话题,但可以感受到他们在利益面前,最终 ...
- Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。
Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console.file等.Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别. ...
- 乱写的一个SQL框架
闲来没事,看了mybatis的实现形式,就心血来潮的自己弄了一个仿照mybatis的框架,性能肯定不好,而且有很多问题,但是是一次有益的尝试 1.基本配置文件 <!--加载数据源--> & ...
- NET Core写了一个轻量级的Interception框架[开源]
NET Core写了一个轻量级的Interception框架[开源] ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只 ...
随机推荐
- 报表和仪表板在线设计器Stimulsoft Designer 最新版发布
Stimulsoft Designer是统一的Stimulsoft框架的一部分,该框架包括用于生成报表和分析数据的引擎.报表设计器和查看器. 您可以在计算机上创建报表,继续使用在线设计器在云中对其进行 ...
- Python练习题 041:Project Euler 013:求和、取前10位数值
本题来自 Project Euler 第13题:https://projecteuler.net/problem=13 # Project Euler: Problem 13: Large sum # ...
- pytorch和tensorflow的爱恨情仇之定义可训练的参数
pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量 pytorch版本:1.6.0 tensorflow版本:1.15.0 之前我们就已 ...
- 020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结
020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结 本文知识点:变量与常量 知识总结 Java中的标识符 Java中的关键字 目前常 ...
- CentOS openssh升级到openssh-7.2版本
查看现在的版本SSH -V 一.准备 备份ssh目录(重要) cp -rf /etc/ssh /etc/ssh.bak [ 可以现场处理的,不用设置 安装telnet,避免ssh升级出现问题,导致无法 ...
- VS2013 c++ 生成和调用DLL动态链接库(.def 方法已验证OK)
转载:https://blog.csdn.net/zhunianguo/article/details/52294339 .def 方法 创建动态库方法: 创建动态库是生成 .dll .lib 两个个 ...
- 微型直流电机控制基本方法 L298N模块
控制任务 让单个直流电机在L298N模块驱动下,完成制动.自由停车,正反转,加减速等基本动作 芯片模块及电路设计 图1 L298N芯片引脚 图2 L298N驱动模块 表1 L298N驱动模块的控制引脚 ...
- LiteOS-任务篇-源码分析-删除任务函数
目录 前言 笔录草稿 源码分析 LOS_TaskDelete函数源码分析 完整源码 参考 链接 前言 20201009 LiteOS 2018 需要会通用链表 笔录草稿 源码分析 LOS_TaskDe ...
- 持续集成工具之Jenkins安装部署
一.DevOps理念 所谓DevOps是指development和Operations的组合,中文意思就是开发和运维的简写.devops理念主要是针对企业中的研发人员.运维人员和测试人员的工作理念,是 ...
- 多测师讲解python _string_高级讲师肖sir
import stringprint (string.ascii_letters )#大小写英文:'#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW ...