什么是通用 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...
对于主键策略
主键策略次要用于 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...
写在最初
欢送大家关注我的公众号【惊涛骇浪如码】,海量Java相干文章,学习材料都会在外面更新,整顿的材料也会放在外面。
感觉写的还不错的就点个赞,加个关注呗!点关注,不迷路,继续更新!!!