乐趣区

关于后端:解放双手不写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…

对于主键策略

主键策略次要用于 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 相干文章,学习材料都会在外面更新,整顿的材料也会放在外面。

感觉写的还不错的就点个赞,加个关注呗!点关注,不迷路,继续更新!!!

退出移动版