MyBatis

我的开发日记(七)

风流意气都作罢 提交于 2020-08-05 15:34:46
经过一周的开发,项目情况也算是在有序推进,部分模块的功能已经开发完了,剩下的大部分库和表的设计已经完成,只剩下业务接口的开发。趁着周末总结一下,大概有三点体会,有两点是自己的不足,还有一个庆幸的事情。 前期过于乐观 因为疫情原因,一直到6月份,我才去公司办公,但是这个项目提出的时候比较早,早起的需求我也参与了讨论,大概功能心里比较明白,提前想了一些可能遇到的技术难点,再加上我之前也自己写过一些 springboot 的小工程,基本是提供一些测试过程中常用到 数据查询 和 数据修改 的功能,本以为不会遇到太多技术难点。自我感觉对 springboot 这一套开发组件还是有一个基本的认知,即使遇到不会的问题基本都能知道怎么去搜索,也能对搜索结果做一个基本的判断。可惜现实太残酷,正式进入开发之后,各种 啪啪啪 打脸的事情,像之前写过的 mybatis 多表查询,从别的库查询结果结合参数写入,如果在 过滤器 中打印参数,如何设计使用 线程锁 等等。期间多次请教老同事和现同事各种技术类问题,得到了很多帮助。 正式开发的一周内,基本上每天都能遇到1-2个不好搞定的难点,为了解决这些问题,基本上1-2个小时在学习和尝试的过程中,再加上一些需求和接口文档的设计问题,也占用了一些开发时间。很多已经了解过甚至 炒过 Demo的功能,自己写起来还是会遇到很多问题,比如 异步查询

IntelliJ IDEA 常用插件

谁说我不能喝 提交于 2020-08-05 13:42:03
工欲善其事,必先利其器。本文收集 IntelliJ IDEA 常用插件,持续更新中...... Alibaba Java Coding Guidelines 阿里巴巴《Java 开发手册》配套插件,可以实时检测代码中不符合手册规约的地方,助你码出高效,码出质量。 使用: 当我们违反手册规约时,该插件会自动检测并进行提示。 同时提供了一键检测所有代码规约情况和切换语言的功能。 如果你想修改某条规约的检测规则的话,可以通过设置的 Editor -> Inspections 进行修改。 Easy Code EasyCode 用于 代码自动生成 ,支持模板自定义、导入、导出,方便团队之间共享。 介绍: 基于 IntelliJ IDEA 开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。 只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与 java 类型映射关系配置。 支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则由你设置。 具体使用见: IntelliJ IDEA 插件 EasyCode(代码自动生成) Lombok Lombok 为 Java 项目提供了非常有趣的附加功能,使用它的注解可以有效的地解决那些繁琐又重复的代码,例如 Setter、Getter、toString、equals、hashCode

【源码Mybatis系列】——Mybatis源码本地打包编译

╄→гoц情女王★ 提交于 2020-08-05 13:33:22
本文主要记录在本机启动调试Mybatis源码中,本机基于Mybatis master 分支本地打包遇到问题整理。 https://github.com/mybatis/mybatis-3 https://github.com/mybatis/parent (依赖) Mybatis源码依赖于parent工程。需要先编译parent工程在编译mybatis,具体如下 解决parent依赖问题 : 在构建的过程中会出现找不到pom.xml中依赖的父模块mybatis-parent 我们需要将paren工程克隆到本地目录中:git clone https://github.com/mybatis/parent.git ,然后先进入parent工程下进行mvn clean install 将parent工程依赖的包下载下来、并保证parent工程编译通过,这步不会出现问题,在编译的输出信息中我们会看到parent工程的 版本号 ,如图所示: pom.xml文件parent依赖的version标签处,如下文。 接下来修改mybatis工程的pom.xml文件中标识parent依赖的地方: <parent> <groupId>org.mybatis</groupId> <artifactId>mybatis-parent</artifactId> <version>31</version>

解决mybatis不加@Parm注解报错问题

安稳与你 提交于 2020-08-05 09:08:56
<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> <compilerVersion>${maven.compiler.source}</compilerVersion> <showDeprecation>true</showDeprecation> <showWarnings>true</showWarnings> ** <compilerArgument>-parameters</compilerArgument> ** </configuration> </plugin> </plugins> </build> 另外查看: 在8以前的jdk版本的时候,我们利用反射只能获取到参数类型,然后参数名字都是利用arg0,arg1,arg2......所以在使用一些反射编程方面上不是很方便,jdk8开始开辟了这项function,但是我们正常情况下使用jvm不会默认保留参数名字,因为这个可能导致class文件过大或其他问题

[转] Spring Boot 自动配置之@Enable* 与@Import注解

馋奶兔 提交于 2020-08-05 07:49:05
SpringBoot 的自动配置如此强大,比如我们经常使用的@Enable* 注解来开启对某方面的支持。那么@Enable* 注解的原理是什么呢? 一、@Enable* 注解与 @Import 注解之间的关系 @Enable* 举例: @EnableScheduling 开启计划任务的支持 @EnableAsync 开启异步方法的支持 @EnableAspectJAutoProxy 开启对 AspectJ 代理的支持 @EnableTransactionManagement 开启对事务的支持 @EnableCaching 开启对注解式缓存的支持 等等 我们观察这些@Enable* 的源码可以看出,所有@Enable* 注解都是有@Import的组合注解,@Enable* 自动开启的实现其实就是导入了一些自动配置的Bean 看下 Spring Boot Reference Guide原文 You need not put all your @Configuration into a single class. The @Import annotation can be used to import additional configuration classes. 您不需要把所有的 @Configuration 放到一个类中。@Import 注解可以导入额外的配置类。 @Import

MySQL MyBatis如何实现批量插入数据时如果存在就更新或者忽略

坚强是说给别人听的谎言 提交于 2020-08-05 06:35:25
需求:项目需要调用别人的接口,读取的数据实时的对话记录,我这边需要读取并保存到数据库,然后需要用数据写一些接口; 由于数据是实时更新的,所以我这边就写了一个定时任务配置类,如下图 如果直接添加,insert的话这样会有相同的数据重复添加,如何避免呢 首先,需要实现更新或忽略的数据的判别字段必须是主键或存在唯一索引(可以是单列或多列)。 比如要根据id判断是否重复,那么id必须是主键或者存在唯一索引。 比如要根据rid + type + date判断是否重复,那么要建立3个字段联合的唯一索引。 2.然后就是修改SQL了,如下: 存在就更新: REPLACE INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...), (值1, 值2, ...); 存在就忽略: INSERT IGNORE 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...), (值1, 值2, ...); 这样就可以简单地对数据进行批量操作。 来源: oschina 链接: https://my.oschina.net/u/4340499/blog/4275255

10w行级别数据的Excel导入优化记录

99封情书 提交于 2020-08-05 06:16:40
需求说明 项目中有一个 Excel 导入的需求:缴费记录导入 由实施 / 用户 将别的系统的数据填入我们系统中的 Excel 模板,应用将文件内容读取、校对、转换之后产生欠费数据、票据、票据详情并存储到数据库中。 在我接手之前可能由于之前导入的数据量并不多没有对效率有过高的追求。但是到了 4.0 版本,我预估导入时Excel 行数会是 10w+ 级别,而往数据库插入的数据量是大于 3n 的,也就是说 10w 行的 Excel,则至少向数据库插入 30w 行数据。因此优化原来的导入代码是势在必行的。我逐步分析和优化了导入的代码,使之在百秒内完成(最终性能瓶颈在数据库的处理速度上,测试服务器 4g 内存不仅放了数据库,还放了很多微服务应用。处理能力不太行)。具体的过程如下,每一步都有列出影响性能的问题和解决的办法。 导入 Excel 的需求在系统中还是很常见的,我的优化办法可能不是最优的,欢迎读者在评论区留言交流提供更优的思路 声明:本文首发于博客园,作者:后青春期的Keats;地址: https://www.cnblogs.com/keatsCoder/ 转载请注明,谢谢! 一些细节 数据导入:导入使用的模板由系统提供,格式是 xlsx (支持 65535+行数据) ,用户按照表头在对应列写入相应的数据 数据校验:数据校验有两种: 字段长度、字段正则表达式校验等

mybatis缓存之一级缓存(二)

孤者浪人 提交于 2020-08-05 06:05:49
这篇文章介绍下mybatis的一级缓存的生命周期 一级缓存的产生 一级缓存的产生,并不是看mappper的xml文件的select方法,看下面的例子 mapper.xml <select id="getById" resultType="entity.TempEntity"> select * from temp where id = #{id} </select> test @Test public void testSelectAsUpdate() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); sqlSession.update("dao.Temp03Dao.getById", 1); sqlSession.update("dao.Temp03Dao.getById", 1); } 执行结果 2020-06-26 17:33:27,899 DEBUG [dao.Temp03Dao.getById] -

Mybatis之BatchExecutor.doUpdate返回Integer.MIN_VALUE + 1002

北城余情 提交于 2020-08-05 05:20:58
Mybatis版本是3.4.4 之前没注意,但是一个偶然机会发现BatchExecutor.doUpdate方法返回一个固定值Integer.MIN_VALUE + 1002,即源码中的org.apache.ibatis.executor.BatchExecutor#BATCH_UPDATE_RETURN_VALUE,为什么返回这个值而不是返回-1或其它? 本着对技术的好奇心搜了下Google,得到如下图1 图1 觉得不过瘾,感觉还是没有解决疑惑,为什么不返回Integer.MIN_VALUE呢,为什么要加上个1002?  所以我又给mybatis提了个 issue 问这个,但是得到的结果还是图1中的邮件内容,好吧! 图1中Eduardo是mybatis的作者之一,有兴趣的可以去github上搜他。从邮件内容可以看出,因为批量更新无法得知更新了多少条记录,作者想要个负数,接近于负无穷的数,所以猜测当时写了Integer.MIN_VALUE + 1002这个固定值,但是为什么不返回Integer.MIN_VALUE呢,对吧,相比较之下,难道Integer.MIN_VALUE不是更接近与负无穷么,不得而知了,也许1002是他的Luck number呢,哈哈,天知...... 来源: oschina 链接: https://my.oschina.net/u/2518341/blog

关于 MyBatis,我死磕了 10 种超好用的写法!

旧城冷巷雨未停 提交于 2020-08-05 04:52:29
用来循环容器的标签forEach,查看例子 foreach元素的属性主要有item,index,collection,open,separator,close。 item:集合中元素迭代时的别名, index:集合中元素迭代时的索引 open:常用语where语句中,表示以什么开始,比如以'('开始 separator:表示在每次进行迭代时的分隔符, close 常用语where语句中,表示以什么结束, 在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况: 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list . 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array . 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key. 针对最后一条,我们来看一下官方说法: 注意 你可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候