标签分类 技术文章:
当前位置:首页 > Java技术文章 > springboot整合通用Mapper简化单表操作详解

springboot整合通用Mapper单表操作实例

  • 发布时间:
  • 作者:码农之家原创
  • 点击:76

这篇文章主要知识点是关于springboot、Mapper、简化单表操作、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Spring Boot 2企业应用实战
  • 类型:Spring大小:92.99 MB格式:PDF出版:电子工业出版社作者:疯狂软件
立即下载

更多Java相关的学习资源可以参阅 Java电子书程序设计电子书 等栏目。

springboot整合通用Mapper简化单表操作详解

前言

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

框架源码地址

Demo源码地址

在开源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的功能,以及各层基本的增删改查方法。

如何使用?

下文给出使用步骤,可参考示例

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. 测试、运行

示例中提供了两个新建用户的单元测试,参考SpringbootTkmapperApplicationTests类

运行,在主类上直接运行,然后浏览器里打开http://localhost:8080/user 则可列出单元测试中创建的用户(其它接口参考BaseController实现)

6. 总结

本文介绍框架基于tk.mybatis:mapper-spring-boot-starter做了一些自定义扩展,以更大程度地实现复用。可用于实际项目开发。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于Java的全部知识点内容总结,大家还可以在下方相关文章里找到springboot多环境(dev、test、、 Java SDK实现离线签名代码详、 Spring Cloud 使用随机端口实、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:Java封装器的实例用法讲解

下一篇:java中jvm虚拟机栈的作用总结

展开 +

收起 -

学习笔记
网友NO.238455

springboot~ObjectMapper~dto到entity的自动赋值

实体与Dto自动赋值 在开发的过程中,实体之间相互赋值是很正常的事,但是我们一般的方法都通过set和get方法来进行的,如果要赋值的字段少那还行,但是需要赋值的字段超过10个,那就是个灾难,你会看到整屏代码中全是set和get方法。 两个实体属性字段几乎完全相同 两个字体有部分字段相同 源实体只有部分字段赋值,目标实体有完整的值 第一种情况 对于第1点来说,我们用到最多的就是entity和dto之间的转换了,这个我们可以使用Spring的工具类BeanUtils来解决,这里要注意的一点是,==第一个参数是源,第二个参数是目标==。 import org.springframework.beans.BeanUtils;BeanUtils.copyProperties(origin, target); 第二种情况 但是对于第2点来说,就没有那么简单了,再使用BeanUtils已经不能满足我们的需要了。 我们可以使用jackson的ObjectMapper import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.ObjectReader;import com.jd.fastjson.JSON;ObjectMapper objectMapper = new ObjectMapper();//配置该objectMapper在反序列化时,忽略目标对象没有的属性。凡是使用该objectMapper反序列化时,都会拥有该特性。objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//读入需要更新的目标实体ObjectReader objectReader = objectMapper.……

网友NO.405969

Spring Boot集成MyBatis实现通用Mapper的配置及使用

什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。 关于MyBatis,大部分人都很熟悉。MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 不管是DDD(Domain Driven Design,领域驱动建模)还是分层架构的风格,都会涉及到对数据库持久层的操作,本文将会讲解Spring Boot集成MyBatis如何实现通用Mapper。 Spring Boot集成MyBatis 引入依赖 dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId/dependencydependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId/dependencydependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version1.3.1/version/dependencydependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId/dependencydependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId/dependencydependency groupIdcom.zaxxer/groupId artifactIdHikariCP/artifactId/dependency 可以看到如上关于My……

网友NO.758026

Mybatis MapperScannerConfigurer自动扫描Mapper接口生成代理注入到Spring的方法

前言 Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置 MapperFactoryBean来生成Mapper接口的代理。 例如: bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" property name="mapperInterface" value="com.bijian.study.dao" / property name="sqlSessionFactory" ref="sqlSessionFactory" //bean MapperFactoryBean创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime,译者注) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。 上面的配置有一个很大的缺点,就是系统有很多的配置文件时 全部需要手动编写,所以上述的方式已经很用了。 没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer,它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。 要创建 MapperScannerConfigurer,可以在 Spring 的配置中添加如下代码: bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" property name="mapperInterface" value="com.bijian.study.dao" / property name="sqlSessionFactory" ref="sqlSessionFactory" //bean basePackage 属性是让你为映射器接口文件设置基本的包路径。 你可以使用分号或逗号 作为分隔符设置多于一个的包路径。每个映射器将会在指……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明