Skip to content

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并选择相应驱动
initialSize0初始化时建立物理连接的个数
maxActive8最大连接池数量,即最大并发连接数
maxIdle8已不再使用,配置了也没效果
minIdle-最小连接池数量
maxWait60000获取连接时最大等待时间,单位毫秒,超过此时间未获取到连接将抛出异常
timeBetweenEvictionRunsMillis60000检测连接是否有效的时间间隔,单位毫秒
minEvictableIdleTimeMillis300000连接在池中的最小生存时间,单位毫秒
validationQuerySELECT 1 FROM DUAL用来检测连接是否有效的SQL,要求是一个查询语句
testWhileIdletrue是否在空闲时检测连接的有效性
testOnBorrowfalse申请连接时执行validationQuery检测连接是否有效
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效
poolPreparedStatementsfalse是否缓存预编译的SQL语句(PreparedStatement)
maxPoolPreparedStatementPerConnectionSize20每个连接可缓存的预编译语句的最大数量
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);
    }
}