mybatis 批量修改_解放双手,不写SQL!一个开源 MyBatis 神器!!

什么是通用 Mapper?

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

a11e19e084d21026c7eae7ca8f3c2e44.png

为什么要用 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 来生成实体类:

关于主键策略

主键策略主要用于 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);

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

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

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

相关文章

论文速读:AI能从人类的愚蠢中学到什么?

来源&#xff1a;混沌巡洋舰本文来自对下面论文的编译和解读&#xff1a;导读&#xff1a;随着机器在某些认知问题上超越人类&#xff0c;人机协作将会带来越来越显著的影响。造成人类偏见的三个主要原因&#xff08;小而不完整的数据集&#xff0c;从自己的决策结果中学习&…

struts2的核心和工作原理

在学习struts2之前&#xff0c;首先我们要明确使用struts2的目的是什么&#xff1f;它能给我们带来什么样的优点&#xff1f; 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计。在这儿MVC模式的优点就不在提了。技术优势 Struts2有双方面的技术优势&#xff0c;一…

python函数递归法求一个数各位数之和_python – 设计一个使用digit_sum计算数字总和的递归函数...

要获得(正整数)数字的最后一位数,您可以计算模数&#xff1a;last_digit n % 10该数字的其余部分(不包括最后一个地方)是&#xff1a;rest (n - last_digit) / 10理论上这应该足以分割数字并添加数字&#xff1a;def sum_digits(n):if n < 10:return nelse:last_digit n …

mysql允许root远程连接_西部数码使用指南:远程桌面之终端服务器超出了最大允许连接数解决...

版权归西部数码所有&#xff0c;原文链接&#xff1a;https://www.west.cn/faq/list.asp?unid739出现这种情况的原因和解决办法。 原因:用远程桌面链接登录到终端服务器时经常会遇到“终端服务器超出最大允许链接数”诸如此类错误导致无法正常登录终端服务器&#xff0c;引起该…

关于征集2020重大科学问题和工程技术难题的通知

来源&#xff1a;中国指挥与控制学会学会全体会员&#xff1a;为研判未来科技发展趋势、前瞻谋划和布局前沿科技领域与方向&#xff0c;瞄准世界科技前沿&#xff0c;推进世界科技强国建设&#xff0c;根据《中国科协办公厅关于征集2020重大科学问题和工程技术难题的通知》精神…

java hive配置_Hive配置项的含义详解(1)

一个hive任务&#xff0c;如何才算是优化的任务&#xff0c;hadoop job config里哪些配置能影响hive的效率。看看hive的详细配置我们可以略知一二。hive的配置&#xff1a;hive.ddl.output.format&#xff1a;hive的ddl语句的输出格式&#xff0c;默认是text&#xff0c;纯文本…

怎么在别人网站注入js脚本_别人的网站是怎么实现引流的?这些站外SEO技巧是关键...

点击上方蓝字关注我们&#xff01;因为分享&#xff0c;我们相遇在SEO路上“网站上线一段时间了&#xff0c;为什么没有流量&#xff1f;为什么没有询盘&#xff1f;”对于做网络营销的企业而言&#xff0c;网站流量与询盘是建立网站的根本目的&#xff0c;可是为什么操作了一段…

比尔盖茨NEJM发文:新冠肺炎是百年一遇的流行病!全世界应该如何应对?

来源&#xff1a;生物谷面对任何危机&#xff0c;政府都有两个同等重要的责任&#xff1a;解决眼前的问题&#xff0c;并防止它再次发生。COVID-19大流行就是一个恰当的例子。我们现在需要拯救生命&#xff0c;同时也需要改善我们应对疫情的方式。第一点更为紧迫&#xff0c;但…

java实现上传图片代码_Java图片上传实现代码

本文实例为大家分享了java图片上传代码&#xff0c;供大家参考&#xff0c;具体内容如下import java.io.*;import java.net.*;/**发送端*/class picsend{public static void main(String[] args) throws Exception{if(args.length!1){System.out.println("请选择一张.jpg图…

每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感。出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往。...

每个努力奋斗过的人&#xff0c;被不公正的际遇砸了满头包的时候&#xff0c;都有那么一瞬间的代入感。出生就是hard模式的人&#xff0c;早已经历了太多的劳其筋骨饿其体肤&#xff0c;再多的人为考验只会摧毁人对美好的向往。转载于:https://www.cnblogs.com/dj258/p/6805629…

python 利器_Python的爬虫利器之urllib

urllib包urllib是一个包含几个模块来处理请求的库&#xff1a;- urllib.request发送http请求- urllib.error处理请求过程中出现的异常- urllib.parse解析url- urllib.robotparser解析robots.txt文件一般我们爬虫只需要常用的几个&#xff0c;下面只列出比较常用的函数我们使用u…

中国数学相比与西方数学为什么会处于劣势?

来源&#xff1a;数学职业家虽然中国人更习惯【中国数学相比与西方数学为什么会处于劣势&#xff1f;】的视角&#xff0c;但私以为问【西欧数学为何可以独步天下】更合适。因为曾经辉煌过的阿拉伯数学、印度数学都落寞了。也没有其他任何地区的文明能达成西欧的成就。另外&…

java的地位和优势,Java语言之所以能持续占领霸主地位 这些优势功不可没

java作为一个真正面向对象语言&#xff0c;驰骋IT界二十余载&#xff0c;一直独占编程语言排行榜榜首&#xff0c;成为广泛使用的开发编程语言&#xff0c;为什么java就能够持续占领霸主地位呢&#xff1f;有哪些必然的优势呢&#xff1f;这首要的优势就是&#xff1a;既然是真…

WebBrowser,挖坑,跳坑,填坑

最近在 C# Asp.net 平台上的一个项目中用到了 WebBrowser 控件。自然而然就进入了 一连串的坑了。用网络上一同行的话“用WebBrowse&#xff0c;就是在给自己挖坑”。 道术太浅&#xff0c;这个坑我还是跳了。 需求&#xff1a;截取网页中的一部分&#xff0c;生成图片。 咣当咣…

python中用户尝试输入三次_用Python实现登录接口,允许尝试三次

项目需求描述&#xff1a;要求用户输入用户名和密码&#xff0c;认证成功后显示欢迎信息&#xff0c;如果连续输错三次则锁定用户名。逻辑流程图&#xff1a;实现代码&#xff1a;#!/usr/bin/env pythonimport sysaccount_file ‘account.txt‘lock_file ‘lock.txt‘# put a…

你可能会错过的3个重要AI趋势

来源&#xff1a;雷锋网以下3个趋势&#xff0c;目前可能尚未引起注意&#xff0c;但长期来看会产生重大影响。根据Gartner的一项调查&#xff0c;到2020年底&#xff0c;全球48&#xff05;的CIO将部署AI。尽管人们对AI和ML持乐观态度&#xff0c;但我仍然持怀疑态度。在可以预…

php flush nginx,Nginx+phpfastcgi下flush输出问题

最近由于业务需要,需要使用php的flush输出缓存刷新&#xff0c;处理浏览器超时问题.最初的测试代码如下:ob_start();//打开缓冲区for ($i10; $i>0; $i--){echo $i.‘‘;ob_flush();flush();sleep(1);}ob_end_flush();//输出并关闭缓冲die();本以为这样就能1秒钟输出一个数字…

线性代数知识点总结_线性代数导读+笔记

一些学习线性代数的心得和资源分享&#xff0c;供大家参考。资源Introduction to Linear Algebra, 5th Edition​math.mit.edu学线性代数主要的参考书&#xff0c;Strang 教授也算是网红了&#xff0c;讲课讲得十分浅显易懂&#xff0c;网上有配套的video&#xff0c;强烈推荐。…

5G通信网络专题报告:新一轮移动通信网络建设迎来高潮

报告来源&#xff1a;山西证券1. 移动通信网络概述1.1 移动通信网络行业界定异地间人与人、人与物、物与物进行信息的传递和交换称为通信。通信以获取信息为目的&#xff0c;实现信息传输所需的一切设备和传输媒介构成通信系统&#xff0c;通信系统大体包括终端和通信网络两部分…

Oracle 通过字段名查询其所在的表

select owner , table_name , column_name from dba_tab_columns where column_nameLOG_TYPE ;转载于:https://www.cnblogs.com/linnuo/p/6812339.html