Spring Boot从入门到实战:整合通用Mapper简化单表操作

数据库访问是web应用必不可少的部分。现今最常用的数据库ORM框架有Hibernate与Mybatis,Hibernate貌似在传统IT企业用的较多,而Mybatis则在互联网企业应用较多。通用Mapper(https://github.com/abel533/Mapper) 是一个基于Mybatis,将单表的增删改查通过通用方法实现,来减少SQL编写的开源框架,且也有对应开源的mapper-spring-boot-starter提供。我们在此基础上加了一些定制化的内容,以便达到更大程度的复用。

框架源码地址:https://github.com/ronwxy/base-spring-boot (持续更新完善中,欢迎follow,star)
Demo源码地址:https://github.com/ronwxy/springboot-demos/tree/master/springboot-tkmapper

在开源mapper-spring-boot-starter的基础上,增加了如下内容:

  1. 针对MySQL数据库与PostgreSQL数据库添加了一些Java类型与数据库类型的转换处理类,如将List、Map类型与MySQL数据库的json类型进行转换处理
  2. 对Domain、Mapper、Service、Controller各层进行了封装,将基本的增删改查功能在各层通用化
  3. 提供了基于druid连接池的自动配置
  4. 其它一些调整,如默认映射复杂类型属性(主要是List、Map类型,其它自定义类型需要自定义转换处理类),将枚举作为简单类型处理
  5. 提供了一个parent项目,将一些常用的框架进行集成,实际项目可继承parent简化依赖配置(持续更新完善)

该框架可用于实际基于springboot的项目,只需简单配置数据源,即可引入druid连接池及通用mapper的功能,以及各层基本的增删改查方法。

如何使用?
下文给出使用步骤,可参考示例:https://github.com/ronwxy/springboot-demos/tree/master/springboot-tkmapper

1. 框架Maven部署安装

下载框架源码后,在项目根路径下执行mvn clean install可安装到本地maven库。如果需要共享,且搭了Nexus私服,则在根路径pom.xml文件中添加distributionManagement配置,指定Nexus仓库分发地址,使用mvn clean deploy安装到远程maven仓库,如

<distributionManagement>
     <repository>
         <id>nexus-releases</id>
         <url>
             http://ip:port/repository/maven-releases/
         </url>
     </repository>
     <snapshotRepository>
         <id>nexus-snapshots</id>
         <url>
             http://ip:port/repository/maven-snapshots/
         </url>
     </snapshotRepository>
 </distributionManagement>

上述指定的repository需要在maven的全部配置文件settings.xml中有对应账号配置(id需要一一对应),如

 <servers>
   <server>
     <id>nexus-snapshots</id>
     <username>admin</username>
     <password>xxx</password>
   </server>
<server>
     <id>nexus-releases</id>
     <username>admin</username>
     <password>xxx</password>
   </server>
 </servers>

2. pom.xml配置

项目中引入该数据库框架有三种方式:

  1. 直接引入 cn.jboost.springboot:tkmapper-spring-boot-starter(没有连接池)
  2. 直接引入 cn.jboost.springboot:druid-spring-boot-starter(druid连接池支持)
  3. 项目继承 cn.jboost.springboot:spring-boot-parent(使用的是druid连接池)

三种方式的pom.xml配置如下

#第一种方式
<dependency>
   <groupId>cn.jboost.springboot</groupId>
   <artifactId>tkmapper-spring-boot-starter</artifactId>
   <version>1.2-SNAPSHOT</version>
</dependency>

#第二种方式
<dependency>
   <groupId>cn.jboost.springboot</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2-SNAPSHOT</version>
</dependency>

#第三种方式
<parent>
   <groupId>cn.jboost.springboot</groupId>
   <artifactId>spring-boot-parent</artifactId>
   <version>1.2-SNAPSHOT</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>

根据情况引入mysql或postgresql的驱动依赖(其它数据库暂未做类型转换支持,未作测试)

3. 配置数据源

如果使用druid连接池,则在application.yml配置文件中,加入如下数据源配置(推荐)

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
      username: root
      password:
      # 自定义配置
      initialSize: 2  # 初始化大小
      minIdle: 1   # 最小连接
      maxActive: 5 # 最大连接
      druidServletSettings:
        allow: 127.0.0.1
        deny:
        loginUsername: admin
        loginPassword: Passw0rd
        resetEnable: true
      druidFilterSettings:
        exclusions: ‘*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*‘
      maxWait: 60000   # 配置获取连接等待超时的时间
      timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最小生存的时间,单位是毫秒
      validationQuery: SELECT ‘x‘
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true # 打开PSCache,并且指定每个连接上PSCache的大小
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat #,wall(添加wall代码里不能直接拼接sql,druid有sql注入校验) # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall‘用于防火墙
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      useGlobalDataSourceStat: true # 合并多个DruidDataSource的监控数据

如果不使用连接池,则配置相对简单,如下

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
    username: root
    password:
    driver-class-name: com.mysql.jdbc.Driver

4. 定义相应domain,mapper,service,controller各层对象

以demo为例(demo数据库脚本见resources/schema.sql),domain定义一个User类,

@Table(name = "user")
@Getter
@Setter
@ToString
public class User extends AutoIncrementKeyBaseDomain<Integer> {
    private String name;
    @ColumnType(jdbcType = JdbcType.CHAR)
    private Gender gender;
    private List<String> favor;
    private Map<String, String> address;

    public enum Gender{
        M,
        F
    }
}

需要添加@Table注解指定数据库表名,可通过继承AutoIncrementKeyBaseDomain来实现自增主键,或UUIDKeyBaseDomain来实现UUID主键,如果自定义其它类型主键,则继承BaseDomain

该框架Service层通用方法实现BaseService只支持单列主键,不支持组合主键(也不建议使用组合主键)

框架默认对List、Map等复杂类型属性会映射到mysql的json类型或postgresql的jsonb类型,如果某个属性不需要映射,可添加@Transient注解;枚举类型需添加@ColumnType指定jdbcType。

dao层定义UserMapper

@Repository
public interface UserMapper extends BaseMapper<User> {
}

BaseMapper默认实现了单表的增删改查及批量插入等功能,如需定义复杂查询,可在该接口中定义,然后通过mapper xml文件编写实现。

service层定义 UserService,继承了BaseService的通用功能(具体可查看源码),同样可在该类中自定义方法

@Service
public class UserService extends BaseService<Integer, User> {

    @Transactional
    public void createWithTransaction(User user){
        create(user);
        //用于测试事务
        throw new RuntimeException("抛出异常,让前面的数据库操作回滚");
    }
}

controller层定义 UserController,继承了BaseController的通用接口(具体可查看源码)

@RestController
@RequestMapping("/user")
public class UserController extends BaseController<Integer, User> {
}

如上,只需要定义各层对应的接口或类,继承基础接口或类,便完成了用户基本的增删改查功能,不需要写一行具体的实现代码。

5. 测试、运行

  1. 示例中提供了两个新建用户的单元测试,参考SpringbootTkmapperApplicationTests
  2. 运行,在主类上直接运行,然后浏览器里打开 http://localhost:8080/user 则可列出单元测试中创建的用户(其它接口参考BaseController实现)

6. 总结

本文介绍框架基于tk.mybatis:mapper-spring-boot-starter做了一些自定义扩展,以更大程度地实现复用。可用于实际项目开发,使用过程中如果遇到问题,可关注公众号留言反馈。

我的个人博客地址:http://blog.jboost.cn
我的头条空间: https://www.toutiao.com/c/user/5833678517/#mid=1636101215791112
我的github地址:https://github.com/ronwxy
我的微信公众号:jboost-ksxy

————————————————————————————————————————


欢迎关注我的微信公众号,及时获取最新分享

原文地址:https://www.cnblogs.com/spec-dog/p/11080741.html

时间: 2024-08-29 06:39:50

Spring Boot从入门到实战:整合通用Mapper简化单表操作的相关文章

Spring Boot从入门到实战(十):异步处理

原文地址:http://blog.jboost.cn/2019/07/22/springboot-async.html 在业务开发中,有时候会遇到一些非核心的附加功能,比如短信或微信模板消息通知,或者一些耗时比较久,但主流程不需要立即获得其结果反馈的操作,比如保存图片.同步数据到其它合作方等等.如果将这些操作都置于主流程中同步处理,势必会对核心流程的性能造成影响,甚至由于第三方服务的问题导致自身服务不可用.这时候就应该将这些操作异步化,以提高主流程的性能,并与第三方解耦,提高主流程的可用性. 在

微服务的入门级微框架Spring Boot快速入门

详情请交流  QQ  709639943 00.微服务的入门级微框架Spring Boot快速入门 00.基于java的微信公众号二次开发视频教程 00.leetcode 算法 面试 00.北风网 零基础到数据(大数据)分析专家-首席分析师 00.快速上手JMeter 00.Jmeter 00.2017年Java web开发工程师成长之路 00.R语言速成实战 00.R语言数据分析实战 00.Python+Django+Ansible Playbook自动化运维项目实战 00.Java深入微服务

Spring Boot 企业级应用开发实战

Spring Boot 企业级应用开发实战[下载地址:https://pan.baidu.com/s/1SbB-auGkUN6r2i6dtv7t_w ] Spring Boot是目前Spring技术体系中炙手可热的框架之一,既可用于构建业务复杂的企业应用系统,也可以开发高性能和高吞吐量的互联网应用.Spring Boot框架降低了Spring技术体系的使用门槛,简化了Spring应用的搭建和开发过程,提供了流行的第三方开源技术的自动集成. Spring Boot是由Pivotal团队提供的全新框

Spring Boot快速入门(二):http请求

原文地址:https://lierabbit.cn/articles/4 一.准备 postman:一个接口测试工具 创建一个新工程 选择web 不会的请看Spring Boot快速入门(一):Hello Spring Boot 二.开始 新建java类RequestCtrl 1.添加一个all方法,使用@RequestMapping注解,可以处理所有的http请求 @RestController//这是一个控制器并只返回数据不寻找视图 public class RequestCtrl { @R

Spring Boot从入门到进阶教程系列 -- 集成Freemarker配置

步骤1. 我们可先配置application.properties的Freemarker基本配置,可参考第一篇教程[Spring Boot从入门到进阶教程系列 -- 外部Tomcat多方式启动,加密解密配置数据] 核心配置 ######################################################## ### freemarker ######################################################## spring.fr

Spring Boot构建的Web项目如何在服务端校验表单输入

本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC应用,来读取用户输入并使用validation注解来检查,并且当用户输入错误时,应用需要再屏幕上显示错误信息提示用户重新输入. 首先构建Maven项目,该项目的pom文件内容如下: <?xml version="1.0" encoding="UTF-8"?>

Spring Boot 从入门到精通(十)整合 MongoDB 实现读写非关系型数据库

来源:素文宅博客 地址:https://blog.yoodb.com/yoodb/article/detail/1578 MongoDB是一个开源的NoSQL文档数据库.它可以存储多种数据结构,类似JSON的BSON,可以存储复杂数据类型. Spring Boot为使用MongoDB提供了很多便利,包括spring-boot-starter-data-mongodb 'Starter POM'.本文学习一下Spring Boot中整合MongoDB数据库,来实现以不同方法读写MongoDB数据库

Spring Boot应用监控的实战教程

概述 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖后, Spring Boot 会默认配置一些通用的监控,比如 jvm 监控.类加载.健康监控等. 我们之前讲过Docker容器的可视化监控,即监控容器的运行情况,包括 CPU使用率.内存占用.网络状况以及磁盘空间等等一系列信息.同样利用SpringBoot作为微服务单元的实例化技术选型时,我们不可避免的要面对的一个问题就是如何实时监控应用的运行状况数据,比如:健康度.运行指标.日志信

Spring Boot 快速入门

什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合适). 使用spring boot有什么好处 其实就是简单.快速.方便!平时如果我