【DB系列】Mybatis+xml整合篇

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

本文将通过实例方式,介绍下如何整合SpringBoot + Mybatis,构建一个支持CRUD的demo工程

查看更多

分享到

【WEB系列】实现后端的接口版本支持(应用篇)

作为一个主职的后端开发者,在平时的工作中,最讨厌的做的事情可以说是参数校验和接口的版本支持了。对于客户端的同学来说,业务的历史包袱会小很多,当出现不兼容的业务变动时,直接开发新的就好;然而后端就没有这么简单了,历史的接口得支持,新的业务也得支持,吭哧吭哧的新加一个服务接口,url又不能和之前的相同,怎么办?只能在某个地方加一个类似v1, v2

那么有没有一种不改变url,通过其他的方式来支持版本管理的方式呢?

本文将介绍一种,利用请求头来传递客户端版本,在相同的url中寻找最适合的这个版本请求的接口的实例case

主要用到的知识点为:

  • RequestCondition
  • RequestMappingHandlerMapping

查看更多

分享到

【SpringSecurity系列】起源篇(零)

本篇为SpringSecurity的第一篇,主要来介绍下什么是SpringSecurity,以及在springboot中如何使用它

查看更多

分享到

【WEB系列】自定义请求匹配条件RequestCondition

在spring mvc中,我们知道用户发起的请求可以通过url匹配到我们通过@RequestMapping定义的服务端点上;不知道有几个问题大家是否有过思考

一个项目中,能否存在完全相同的url?

有了解http协议的同学可能很快就能给出答案,当然可以,url相同,请求方法不同即可;那么能否出现url相同且请求方法l也相同的呢?

本文将介绍一下如何使用RequestCondition结合RequestMappingHandlerMapping,来实现url匹配规则的扩展,从而支持上面提出的case

查看更多

分享到

【DB系列】JPA 错误姿势之环境配置问题

又回到jpa的教程上了,这一篇源于某个简单的项目需要读写db,本想着直接使用jpa会比较简单,然而悲催的是实际开发过程中,发现了不少的坑;本文为错误姿势第一篇,Repository接口无法注入问题

查看更多

分享到

【基础系列】自动配置选择生效

写了这么久的Spring系列博文,发现了一个问题,之前所有的文章都是围绕的让一个东西生效;那么有没有反其道而行之的呢?

我们知道可以通过@ConditionOnXxx来决定一个配置类是否可以加载,那么假设有这么个应用场景

  • 有一个Print的抽象接口,有多个实现,如输出到控制台的ConsolePrint, 输出到文件的 FilePrint, 输出到db的 DbPrint
  • 我们在实际使用的时候,根据用户的选择,使用其中的一个具体实现

针对上面的case,当然也可以使用@ConditionOnExpression来实现,除此之外推荐一种更优雅的选择注入方式ImportSelector

查看更多

分享到

【基础系列】从0到1实现一个自定义Bean注册器(应用篇)

我们知道在spring中可以通过@Component@Service, @Repository 装饰一个类,通过自动扫描注册为bean;也可以通过在配置类中,借助@Bean来注册bean;那么除了这几种方式之外,还有什么其他的方式来声明一个类为bean么?

我们是否可以自定义一个注解,然后将这个注解装饰的类主动声明为bean注册到spring容器,从而实现类似@Component的效果呢?

接下来本文将介绍,如果通过ImportBeanDefinitionRegistrar结合自定义注解来实现bean注册,主要用到的知识点如下:

  • ImportBeanDefinitionRegistrar bean注册的核心类
  • @Import 导入配置
  • ClassPathBeanDefinitionScanner

查看更多

分享到

【DB系列】SpringBoot+Mysql 无法保存emoj表情

尤记得很久以前,想存emoj表情到mysql中,需要额外的将emoj表情转码之后保存,每次读取时,再解码还原成一下;每次这种sb的操作,真心感觉心塞,那么有没有办法直接存呢?

mysql本身可以通过选择编码集(如utfbmb4)来支持emoj表情,然而今天遇到了一个相当鬼畜的问题,表中可以直接写入emoj表情,但是通过spring boot代码塞入的emoj时,却抛出异常:

1
2
3
4
5
6
7
8
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x9D\xE6\xB1...' for column 'nick' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082) ~[mysql-connector-java-5.1.30.jar:na]

接下来演示一下正确的使用姿势,以及导致上面问题的错误case,避免大家重复采坑

查看更多

分享到

【WEB系列】Listener四种注册姿势

javaw web三要素Filter, Servlet前面分别进行了介绍,接下来我们看一下Listener的相关知识点,本篇博文主要内容为SpringBoot环境下,如何自定义Listener并注册到spring容器

查看更多

分享到

【WEB系列】Servlet 注册的四种姿势

前面介绍了java web三要素中filter的使用指南与常见的易错事项,接下来我们来看一下Servlet的使用姿势,本篇主要带来在SpringBoot环境下,注册自定义的Servelt的四种姿势

  • @WebServlet 注解
  • ServletRegistrationBean bean定义
  • ServletContext 动态添加
  • 普通的spring bean模式

查看更多

分享到

【WEB系列】开启GZIP数据压缩

本篇可以归纳在性能调优篇,虽然内容非常简单,但效果可能出乎预料的好;

分享一个真实案例,我们的服务部署在海外,国内访问时访问服务时,响应有点夸张;某些返回数据比较大的接口,耗时在600ms+上,然而我们的服务rt却是在20ms以下,绝大部分的开销都花在了网络传输上

针对这样的场景,除了买云服务商的网络通道之外,另外一个直观的想法就是减少数据包的大小,直接在nginx层配置gzip压缩是一个方案,本文主要介绍下,SpringBoot如何开启gzip压缩

查看更多

分享到

【DB系列】JPA之指定id保存

前几天有位小伙伴问了一个很有意思的问题,使用JPA保存数据时,即便我指定了主键id,但是新插入的数据主键却是mysql自增的id;那么是什么原因导致的呢?又可以如何解决呢?

本文将介绍一下如何使用JPA的AUTO保存策略来指定数据库主键id

查看更多

分享到