作者:倪骏来源:sq.163yun.com/blog/article/198894931418546176

什么是通用 Mapper?

它是一个可以方便的使用 Mybatis 进行单表的增删改查优秀开源产品。它使用拦截器来实现具体的执行 Sql,完全使用原生的 Mybatis 进行操作。在 Github 上标星 5.9K!

为什么要用 Mapper?

它提供了所有单表的基本增删改查方法,大大节省了我们书写基本 mapper.xml 的时间。尤其对于新工程和新表来说,极大的提高…

不客气的说,使用这个通用 Mapper 甚至能改变你对 Mybatis 单表基础操作不方便的想法,使用它你能简单的使用单表的增删改查,包含动态的增删改查。

同时,在代码结构合理的前提下,更换 RDBMS 也无须修改 sql,只需修改部分配置即可实现。

如何使用 Mapper?

先通过 maven 引入 jar 包:

tk.mybatis

mapper

x.x.x

添加配置文件:

配置方式分为 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配置方式

mappers=tk.mybatis.mapper.common.Mapper

你没看错,就是这么配置的,注意这里是 tk.mybatis.xxx, 和 MyBatis 的唯一区别就是 org. 改成了 tk.,方便修改和记忆。

通用 Mapper 的各项属性通过 properties 属性进行配置,如果默认配置就是一行 mappers=tk.mybatis.mapper.common.Mapper 时,可以不写,就会变成:

继承通用 Mapper 接口(注意必须要加泛型):

@Repository

public interface MaterialDao extends Mapper,

InsertUseGeneratedKeysMapperr {}

上图示例继承了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 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 包:

com.netease.pop.mybatis

mapper

4.0.0

同时,在配置文件中增加如下 2 行:

INDENTITY=DDB 表示使用名称为 DDB 的主键策略 (或者也可以在实体类的 GeneratedValue 注解中指定 generator 命令)

ORDER=BEFORE 表示在 insert 命令前执行该主键策略 (这是为了在 insert 前获取主键 id 值来使用)

其他

除了节省书写 sql 的时间外,配合另一个分页的开源插件 PageHelper 使用,可以事半功倍。使用上简单到可怕。

用法示例如下:

PageHelper.offsetPage(offset, limit);

Page metas = (Page) materialDao.selectByExample(example);

没错,就只有这么一行。。。

具体的接入方式可以参看以下文档:https://github.com/pagehelper/MybatisPageHelper/blob/master/README_zh.md

不写sql的Java_解放双手,不写SQL!一个开源mybatis神器相关推荐

  1. 解放双手,不写 SQL!一个开源 mybatis 神器

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...

  2. 手写Spring-第五章-解放双手!自动化配置!

    前言 上次我们完成了Bean之间依赖的注入.但在最后测试的时候,吃到了苦头.Bean定义的构建太麻烦了>_<!而且现在的Bean定义还只有class和属性两个内容,如果以后再继续扩充,想必 ...

  3. 快速批量移除B站粉丝,解放双手!

    快速批量移除B站粉丝,解放双手! 一秒一个,全自动,亲测可用! 步骤 1.登录b站,鼠标移到个人头像上,点击粉丝数,跳转到粉丝管理页面 2.在页面右键,选择"检查",进入页面源码 ...

  4. 淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树

    http://blog.csdn.net/qq910894904/article/details/28658421 OceanBase是阿里巴巴集团自主研发的可扩展的关系型数据库,实现了跨行跨表的事务 ...

  5. java中利用框架传入相同的url实现crud操作_还在手写CRUD代码?这款开源框架助你解放双手!

    相信很多朋友在项目中使用的ORM框架都是MyBatis,如果单用MyBatis来操作数据库的话,需要手写很多单表查询的SQL实现.这时候我们往往会选择一个增强工具来实现这些单表CRUD操作,这里推荐一 ...

  6. 10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 鸽了很久没发文,不写文章的日子真的好惬意,每天也不用愁着写点什 ...

  7. 「技术工具」10个解放双手使用在线工具,有些代码真的不用手写

    1.Aliyun Java Initializr 在日常开发工作和自己学习跑demo的时候,往往都需要快速构建一个springboot基础工程.除了用IDEA开发工具构建,更多就是用Spring In ...

  8. 解放双手——Android自动化测试

    解放程序猿宝贵的右手(或者是左手)--Android自动化测试技巧 Google大神镇楼 : http://developer.android.com/tools/testing-support-li ...

  9. 10 行 Python 代码自动清理电脑重复文件,解放双手!

    作者 | 陈熹 来源 | 早起Python(ID:zaoqi-python) 前言 大家好,又到了 Python 办公自动化系列. 今天分享一个系统层面的自动化案例: 「给定一个文件夹,使用 Pyth ...

最新文章

  1. AttributeError: ‘tuple‘ object has no attribute ‘group‘
  2. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
  3. 企业微服务中台落地实践和思想之我见
  4. double 导出txt保留两位_使用Jade“精修”XRD图谱并导出数据
  5. 【AI应用】三分钟,带你了解英特尔明年重点发力的这八大方向
  6. 怎么操作会导致MySQL锁表
  7. 进程和线程的定义和区别
  8. ACL 2019 | 图表示解决长文本关系匹配问题:腾讯提出概念交互图算法
  9. 26 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义结果分析版本
  10. C、C++用指针引用的差异
  11. Ubuntu Server 16.04.x进入中文安装界面无法安装busybox-initramfs
  12. UVA 1590 IP Networks
  13. python pywifi 破解wifi密码
  14. lisp线段两端同时缩短的命令_cad中有没有办法同时对多条线段偏移?
  15. win10企业版2016长期服务激活教程
  16. 深度强化学习中的对抗攻击和防御
  17. iOS最安全?细数iOS曝过的安全漏洞|苹果|iOS|漏洞
  18. 在上海相亲碰到如此势利贪婪的“80后”女孩
  19. Linux日常软件安装(FC6)
  20. 动手的乐趣_1969功率放大器

热门文章

  1. Sonarqube各指标的定义及计算方法
  2. 程序员麦兜【编程笔记】-String存储管理
  3. 生产用计算机打印机管理,办公电脑及打印机是否按电子设备计提折旧?
  4. 《Android 应用案例开发大全(第3版)》——第2章,第2.4节壁纸的实现
  5. 电源管理 第二部分 ---- Windows CE设备驱动开发之电源管理
  6. 骁龙820A车载系统Soc上Car架构解析
  7. 模仿天猫网站-前端项目
  8. 同底数幂比较大小方法_初一下学期,巧用幂的有关法则比较大小,这些题目不再是难题...
  9. 博科交换机java版本_博科SAN光纤交换机端口L/G-port解决方法
  10. 云原生安全专家观察:容器云安全现状和发展趋势