fine-sql模块
- 数据库管理
依赖
- pom.xml
xml
<!--fine-sql-->
<dependency>
<groupId>cn.finemap</groupId>
<artifactId>fine-sql</artifactId>
<version>${fine.version}</version>
</dependency>配置
- src/main/resources/application.yml
yaml
# 使用连接池配置
spring:
profiles:
include: sql
datasource:
druid:
username: root
password: finemap@cn
url: jdbc:mysql://127.0.0.1:3306/project?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.cj.jdbc.Driver创建子模块:fine-sql
- 在fine-parent中创建:fine-sql子模块
fine-sql
- 创建子模块:New > Module...
- 添加Mysql数据库驱动依赖
- 添加Druid连接池依赖
- 添加jpa和hibernate连接池依赖
依赖
- fine-sql/pom.xml
xml
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version} </version>
</dependency>
<!-- jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<!-- validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<!-- druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--fine-commons-->
<dependency>
<groupId>cn.finemap</groupId>
<artifactId>fine-commons</artifactId>
<version>${fine.version}</version>
<optional>true</optional>
</dependency>
</dependencies>连接池配置application-sql.yml
- src/main/resources/application-sql.yml
yaml
# druid连接池配置
spring:
jpa:
database: mysql
database-platform: org.hibernate.dialect.MySQLDialect
generate-ddl: true
open-in-view: false
datasource:
druid: # druid连接池配置
initial-size: 5 # 初始化连接池时创建的连接数量
min-idle: 5 # 最小空闲连接数,低于这个值时将会创建新的连接
max-active: 30 # 连接池中允许的最大活动连接数(最大并发量)
max-wait: 60000 # 获取连接时的最大等待时间(毫秒),超过这个时间会抛出异常,-1表示无限等待
jackson:
date-format: yyyy-MM-dd HH:mm:ss #时间戳统一转换为指定格式
time-zone: GMT+8 # 时区修改为东8区多数据源配置
- 数据源配置:
cn.finemap.sql.multi.DataSourceConfig.java,配置主数据源admin+ 动态数据源 - 动态数据源:
cn.finemap.sql.multi.DynamicDataSource.java,动态返回数据源 - 数据源上下文:
cn.finemap.sql.multi.DataSourceContextHolder.java,提供了一种线程安全的方式来管理数据源标识存储 - 数据源工具类:
cn.finemap.sql.multi.DataSourceUtils.java,数据源管理工具类 - AOP:请求结束,清除数据源
常用配置说明
| 配置项 | 默认值 | 描述 |
|---|---|---|
username | - | 连接数据库的用户名 |
password | - | 连接数据库的密码 |
jdbcUrl | - | 数据库连接URL,同DBCP中的jdbcUrl属性 |
driverClassName | 自动识别 | JDBC驱动类名,如果不配置Druid会根据url自动识别dbType并选择相应驱动 |
initialSize | 0 | 初始化时建立物理连接的个数 |
maxActive | 8 | 最大连接池数量,即最大并发连接数 |
maxIdle | 8 | 已不再使用,配置了也没效果 |
minIdle | - | 最小连接池数量 |
maxWait | 60000 | 获取连接时最大等待时间,单位毫秒,超过此时间未获取到连接将抛出异常 |
timeBetweenEvictionRunsMillis | 60000 | 检测连接是否有效的时间间隔,单位毫秒 |
minEvictableIdleTimeMillis | 300000 | 连接在池中的最小生存时间,单位毫秒 |
validationQuery | SELECT 1 FROM DUAL | 用来检测连接是否有效的SQL,要求是一个查询语句 |
testWhileIdle | true | 是否在空闲时检测连接的有效性 |
testOnBorrow | false | 申请连接时执行validationQuery检测连接是否有效 |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效 |
poolPreparedStatements | false | 是否缓存预编译的SQL语句(PreparedStatement) |
maxPoolPreparedStatementPerConnectionSize | 20 | 每个连接可缓存的预编译语句的最大数量 |
filters | 无 | 配置监控统计拦截的filters,例如:stat, wall, log4j等 |
connectionProperties | 无 | 连接属性,例如:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 |
维护父工程:fine-parent
fine-parent
- 添加该子模块
- 在父工程中,管理mysql数据库驱动和Druid连接池的版本参数
pom
- fine-parent/pom.xml
xml
<!-- 版本参数 -->
<properties>
<!-- fine-sql -->
<mysql.version>8.0.33</mysql.version>
<druid.version>1.2.21</druid.version>
</properties>fine-sql使用
数据源操作
- 来源于配置文件中的
spring.datasource.druid数据源为admin主数据源 - 操作主要基于数据源工具类:
DataSourceUtils
| 配置项 | 函数 | 描述 |
|---|---|---|
| 获取主数据库链接 | getAdminUrl() | 获取配置文件中的主数据源链接spring.datasource.druid.url |
| 获取主数据库名称 | getAdminDbName() | 获取配置文件中的主数据源链接中的数据库名称 |
| 获取主数据库名用户名 | getAdminUsername() | 获取配置文件中的主数据库用户名spring.datasource.druid.username |
| 获取主数据库名密码 | getAdminPassword() | 获取配置文件中的主数据库密码spring.datasource.druid.password |
| 添加数据源 | addDataSource() | 添加数据源(动态数据源) |
| 切换数据源 | switchDataSource() | 切换数据源(当前线程使用数据源) |
| 清除数据源 | clearDataSource() | 清除数据源(清除线程使用数据源,使用主数据源) |
| 删除数据源 | removeDataSource() | 删除数据源(彻底删除,不在使用) |
| 获取当前数据源 | getDataSource() | 获取当前线程数据源 |
| 获取当前数据源名称 | getDataSourceName() | 获取当前数据源名称 |
| 获取所有数据源名称列表 | getDataSourceNames() | 获取所有数据源名称列表 |
数据库操作
数据库操作工具类
MysqlDBUtils
| 配置项 | 函数 |
|---|---|
| 是否存在数据库 | MysqlDBUtils.hasDB |
| 创建数据库 | MysqlDBUtils.createDB |
| 删除数据库 | MysqlDBUtils.deleteDB |
数据库文件工具类
MysqlFileUtils
| 配置项 | 函数 |
|---|---|
| 运行sql文件 | MysqlFileUtils.runSQL |
| 备份数据库(结构+数据) | MysqlFileUtils.backupDBSQL |
| 备份数据库结构 | MysqlFileUtils.backupDBStructureSQL |
| 备份表结构 | MysqlFileUtils.backupStructureSQL |
| 备份表(结构+数据) | MysqlFileUtils.backupTableSQL |
数据库查询
EntityManager
- EntityManager 是 Java Persistence API(JPA)中的一个接口,用于管理实体对象的持久化操作。它是用于持久化实体对象到数据库的核心组件之一
- 增删改,需要@Transactional注解
java
@Transactional
public class UserService {
@Autowired
private UserRepository userRepostory;
@PersistenceContext
EntityManager entityManager;
public void add(User user){
entityManager.persist(user);
}
public void findById(){
User user = entityManager.find(User.class, 1);// 不存在放回null
// User user = entityManager.getReference(User.class, 1);// 不存在,报异常
System.out.println(user);
}
public void update(User user) {
entityManager.merge(User); // 不存在则新增
}
public void remove(){
User user = entityManager.find(User.class, 1);
entityManager.remove(book);
}
public void createQuery(){
String hql= " select user from User user";
List<User> userList = entityManager.createQuery(hql, User.class).getResultList();
}
public void createNativeQuery(){
String sql = String.format("CREATE TABLE %s ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键自增',PRIMARY KEY (`id`))", sqlName);
Query nativeQuery = entityManager.createNativeQuery(sql);
//查询
List map = nativeQuery.getResultList();
//数据变更
Integer count = query.executeUpdate();
}
}JdbcTemplate
- Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作,所以自带JdbcTemplate
- 注意防止
sql注入攻击
java
@Transactional
public class UserService {
// 按类型、自动注入了JdbcTemplate对象(jdbcTemplate即已经是有实体的对象了)
// JdbcTemplate对象对象里有增删查改的方法,用来操作数据库
@Autowired
private JdbcTemplate jdbcTemplate;
// 也可以直接使用工具类获取JdbcTemplate
// DataSqlUtils.template
@Override
public void sql(User user) {
// 查询
String query = "SELECT * FROM " + tbName + " WHERE id = " + params.get("id") +" AND valid_isflag = 1 ";
List<Map<String, Object>> list = jdbcTemplate.queryForList();
// 添加、修改、删除
String addsql = "insert into User values(?,?,?)";
Object[] userObj = {book.getUserid(), book.getUsername(), book.getUstatus()};
int update = DataSqlUtils.template.update(addsql,userObj);
}
}