开源mybatis神器

news2024/11/24 12:55:23

什么是通用 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 包:

同时,在配置文件中增加如下 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《SQL基础》07. 约束

SQL-约束约束常见约束案例外键约束删除/更新行为约束 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确性、有效性和完整性。 分类&#xff1a; 约束描述关键字非空约束限制该字段的数据不能为n…

动态内存管理(2)

TIPS 1. scanf读取与空格&#xff1a; 我们都知道&#xff0c;scanf()在从输入缓冲区里面读取数据的时候&#xff0c;如果中间碰到了空格&#xff0c;那么就会直接停下来&#xff0c;而如果在最前面有个空格&#xff0c;直接无视空格。 2. scanf()读取与\n&#xff0c;如果是…

【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割

【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割 精选精析&#xff1a; 【论文原文】&#xff1a; Prior Guided Feature Enrichment Network for Few-Shot Segmentation (当前引用次数&#xff1a;184) 【论文代码】&#xff1a; https://github.co…

【爪洼岛冒险记】第5站:多图解,超详细讲解Java中的数组、二维数组--建议收藏

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01; &#x1f4dc;所属专栏&#xff1a;爪洼岛冒险记【从小白到大佬之路】 ✈往期博文回顾: 【爪洼岛冒险记】…

【GD32F427开发板试用】RT-THREAD标准版 移植使用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;打盹的消防车 前言&#xff1a; 无意在微信看到了GD做活动&#xff0c;想到了第一时间体验一下&#xff0c;搭配RT-THREAD&#xff0c;也很方…

【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanDefinition体系】

整体结构图 1. BeanDefinition 用于保存 Bean 的相关信息&#xff0c;包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等&#xff0c; 它是实例化 Bean 的原材料&#xff0c;Spring 就是根据 BeanDefinition 中的信息实例化 Bean。 2. 我们获取对象的方式一般有…

AioDnsBrute:一款功能强大的异步DNS爆破工具

关于AioDnsBrute AioDnsBrute是一款功能强大的异步DNS爆破工具&#xff0c;该工具基于Python 3.5开发&#xff0c;并使用了asyncio库以实现针对目标域名的异步爆破。 该工具的运行速度非常快&#xff0c;在一台小型VPS主机上&#xff0c;可以实现在1.5-2分钟之内处理大约10万…

【计数DP】P4933 大师

这道是洛谷官方题单的简单DP为啥我放上来呢&#xff0c;因为我因为各种各样的细节原因没做出来感觉计数的DP有点点难&#xff0c;得多写了P4933 大师 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题意&#xff1a;思路&#xff1a;第一眼肯定是设dp[i][j]为以a[i]为结尾&…

8. 【Redisson源码】分布式信号量RSemaphore

目录 一、RSemaphore的使用 二、RSemaphore设置许可数量 三、RSemaphore的加锁流程 四、RSemaphore的解锁流程 【本篇文章基于redisson-3.17.6版本源码进行分析】 基于Redis的Redisson的分布式信号量RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。 …

从首个「数实融合」公益球场,看元宇宙奏响创新「三重奏」

作者 | 曾响铃 文 | 响铃说 2022年的元宇宙&#xff0c;一半是海水&#xff0c;一半是火焰。 一边是刮起元宇宙热潮的Roblox股价跌去大半&#xff0c;Meta也因元宇宙亏损深陷泥潭。另一边&#xff0c;经过2021年元宇宙概念落地和普及&#xff0c;2022年却也是元宇宙相关产业…

分享86个PHP源码,总有一款适合您

PHP源码 分享86个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 86个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1fsoGdkr_-wZUaJvVMOlihQ?pwdlhyo 提取码&#xff…

Java 泛型是什么?一文带你吃透泛型

文章目录1. Java 泛型2. 泛型类3. 泛型接口4. 泛型方法5. 泛型集合Java编程基础教程系列1. Java 泛型 Java 泛型是 JDK1.5 中引入的一个新特性&#xff0c;其本质是参数化类型&#xff0c;把类型作为参数传递。其主要的形式有泛型类&#xff0c;泛型接口和泛型方法。泛型概念的…

sqoop安装(linux)

一、前期准备安装好hadoop伪分布安装好MySQL下载sqoop压缩文件实验环境&#xff1a;实验环境版本CentOS 6.5MySQL5.7.37hadoop3.3.0sqoop1.4.7sqoop1.4.7 下载链接&#xff1a;https://pan.baidu.com/s/16AUdtBmSv7OG2PTyA1XcgQ?pwdqu7lmysql驱动包下载地址&#xff1a;https:…

易于设置的倒计时页面Easy countdown

今天开始放假了 什么是 Easy countdown &#xff1f; Easy countdown 是一个易于设置的倒计时页面。可以设置为倒计时或计时器。 先看看官方提供的动图 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 easy-countdown &#xff0c;选择第一个 yooooomi/easy-countdown&am…

【前端学习指南】基础开发环境搭建

&#x1f36d; Hello&#xff0c;我是爱吃糖的范同学 邻近春节&#xff0c;虽然学校的事情已经处理的差不多了&#xff0c;又开始要忙着找实习......时间安排上还是有很多问题&#xff0c;希望大家多多包涵&#xff0c;我已经加班加点在写作了&#x1f602;&#x1f602;&…

高盐废水如何处理,离子交换树脂在高盐废水中的应用

什么是高盐废水&#xff1f; 高盐废水是工业废水中较常见的一种&#xff0c;它是指总含盐量(以NaCl计&#xff09;至少为1%的废水&#xff0c;属于难处理的废水之一。 高盐废水中的总溶解固体物TDS&#xff0c;多在10000-25000mg/L&#xff0c;含盐成分复杂&#xff0c;有Na、…

vue3中echarts组件的最佳封装形式

项目中经常用到echarts&#xff0c;不做封装直接拿来使用也行&#xff0c;但不可避免要写很多重复的配置代码&#xff0c;封装稍不注意又会过度封装&#xff0c;丢失了扩展性和可读性。始终没有找到一个好的实践&#xff0c;偶然看到一篇文章&#xff0c;给了灵感。找到了一个目…

【数据结构】并查集

目录1.概述2.代码实现3.应用本文参考&#xff1a; LABULADONG 的算法网站 《数据结构教程》&#xff08;第 5 版&#xff09;李春葆主编 1.概述 &#xff08;1&#xff09;并查集支持查找一个元素所属的集合以及两个元素各自所属的集合的合并运算。当给出两个元素的一个无序对…

氨氮废水如何处理,离子交换树脂在氨氮废水中的应用点

近几年来重点污染源考核结果及地表水监测结果表明&#xff0c;氨氮超标现象仍较严重。认清氨氮的来源&#xff0c;了解其危害&#xff0c;采取有效的处理措施成为保护水环境不被氨氮污染的必要环节。 北京科海思科技有限公司利用离子交换特种树脂可以做到有针对性的氨氮的去除…

vue2之生命周期

生命周期 生命周期是指组件从创建&#xff0c;运行到销毁的阶段。而生命周期函数&#xff08;也叫生命周期钩子&#xff09;是vue在关键的时刻帮我们调用的一些特殊名称的函数&#xff0c;会根据生命周期的阶段&#xff0c;依次执行。 beforeCreatecreatedbeforeMountmountedb…