springboot整合postgresql_springboot整合通⽤Mapper简化。
。。
前⾔
数据库访问是web应⽤必不可少的部分。现今最常⽤的数据库ORM框架有Hibernate与Mybatis,Hibernate貌似在传统IT企业⽤的较多,⽽Mybatis则在互联⽹企业应⽤较多。通⽤Mapper是⼀个基于Mybatis,将单表的增删改查通过通⽤⽅法实现,来减少SQL编写的开源框架,且也有对应开源的mapper-spring-boot-starter提供。我们在此基础上加了⼀些定制化的内容,以便达到更⼤程度的复⽤。
框架源码地址
Demo源码地址
在开源mapper-spring-boot-starter的基础上,增加了如下内容:
针对MySQL数据库与PostgreSQL数据库添加了⼀些Java类型与数据库类型的转换处理类,如将List、Map类型与MySQL数据库的json 类型进⾏转换处理
对Domain、Mapper、Service、Controller各层进⾏了封装,将基本的增删改查功能在各层通⽤化
提供了基于druid连接池的⾃动配置
其它⼀些调整,如默认映射复杂类型属性(主要是List、Map类型,其它⾃定义类型需要⾃定义转换处理类),将枚举作为简单类型处理
提供了⼀个parent项⽬,将⼀些常⽤的框架进⾏集成,实际项⽬可继承parent简化依赖配置(持续更新完善)
该框架可⽤于实际基于springboot的项⽬,只需简单配置数据源,即可引⼊druid连接池及通⽤mapper的功能,以及各层基本的增删改查⽅法。
如何使⽤?
下⽂给出使⽤步骤,可参考⽰例
1. 框架Maven部署安装
下载框架源码后,在项⽬根路径下执⾏mvn clean install可安装到本地maven库。如果需要共享,且搭了Nexus私服,则在根路径
nexus-releases
nexus-snapshots
上述指定的repository需要在maven的全部配置⽂件l中有对应账号配置(id需要⼀⼀对应),如
nexus-snapshots
admin
xxx
nexus-releases
admin
xxx
2. l配置
项⽬中引⼊该数据库框架有三种⽅式:
直接引⼊ cn.jboost.springboot:tkmapper-spring-boot-starter(没有连接池)
直接引⼊ cn.jboost.springboot:druid-spring-boot-starter(druid连接池⽀持)
项⽬继承 cn.jboost.springboot:spring-boot-parent(使⽤的是druid连接池)
三种⽅式的l配置如下
#第⼀种⽅式
cn.jboost.springboot
tkmapper-spring-boot-starter
1.2-SNAPSHOT
#第⼆种⽅式
cn.jboost.springboot
druid-spring-boot-starter
1.2-SNAPSHOT
#第三种⽅式
cn.jboost.springboot
spring-boot-parent
1.2-SNAPSHOT
根据情况引⼊mysql或postgresql的驱动依赖(其它数据库暂未做类型转换⽀持,未作测试)
3. 配置数据源
如果使⽤druid连接池,则在l配置⽂件中,加⼊如下数据源配置(推荐)
spring:
datasource:
druid:
driver-class-name: sql.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: Sql=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: sql.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 {
private String name;
@ColumnType(jdbcType = JdbcType.CHAR)
private Gender gender;
private List favor;
private Map 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 {
springboot框架的作用
}
BaseMapper默认实现了单表的增删改查及批量插⼊等功能,如需定义复杂查询,可在该接⼝中定义,然后通过mapper xml⽂件编写实现。
service层定义 UserService,继承了BaseService的通⽤功能(具体可查看源码),同样可在该类中⾃定义⽅法
@Service
public class UserService extends BaseService {
@Transactional
public void createWithTransaction(User user){
create(user);
//⽤于测试事务
throw new RuntimeException("抛出异常,让前⾯的数据库操作回滚");
}
}
controller层定义 UserController,继承了BaseController的通⽤接⼝(具体可查看源码)
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {
}
如上,只需要定义各层对应的接⼝或类,继承基础接⼝或类,便完成了⽤户基本的增删改查功能,不需要写⼀⾏具体的实现代码。
5. 测试、运⾏
⽰例中提供了两个新建⽤户的单元测试,参考SpringbootTkmapperApplicationTests类
6. 总结
本⽂介绍框架基于tk.mybatis:mapper-spring-boot-starter做了⼀些⾃定义扩展,以更⼤程度地实现复⽤。可⽤于实际项⽬开发。以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持脚本之家。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。