SpringBoot3数据库集成

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,通常涉及三个基础组件:连接池,持久层框架,数据源。

标签:Jdbc.Druid.Mybatis.Plus;

一、简介

项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,而对于这个功能的实现,其组件选型也非常丰富;

通过如下几个组件来实现数据库的整合;

Druid连接池:阿里开源的数据库连接池,并且提供SQL执行的监控能力;

MybatisPlus框架:基于Mybatis框架的增强工具包,可以用于简化持久层开发,显著的提高效率;

MySQL数据库:常用的关系型数据库组件,在案例中使用Druid组件来连接数据库;

二、工程搭建

1、工程结构

1.png

2、依赖管理

Druid连接池使用的是1.2.18版本;在mybatis-plus组件中依赖mybatis框架的3.5.10版本;MySQL本地环境是5.7版本,这里依赖包使用8.0.19版本;

<!-- MySql数据库 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
<!-- Druid组件 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>${druid-spring-boot.version}</version>
</dependency>
<!-- JDBC依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>${spring-boot.version}</version>
</dependency>
<!-- MybatisPlus组件 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
</dependency>

三、Druid连接池

1、配置文件

有关于Druid连接池的可配置参数还有很多,可以参考源码中的描述或者官方案例,此处只提供部分常见的参数配置;

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 数据库
      url: jdbc:mysql://localhost:3306/boot-jdbc
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 连接池-初始化大小
      initial-size: 10
      # 连接池-最大连接数
      max-active: 100
      # 最大等待时间
      max-wait: 60000
      # 连接池-最小空闲数
      min-idle: 10
      # 检测空闲连接
      test-while-idle: true
      # 最小空闲时间
      min-evictable-idle-time-millis: 300000

1.2 配置类

配置两个Bean对象,分别DruidDataSource类和JdbcTemplate类;

@Configuration
public class DruidConfig {
   
   

    @Bean("dataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DruidDataSource dataSource() {
   
   
        return new DruidDataSource();
    }

    @Bean("jdbcTemplate")
    public JdbcTemplate jdbcTemplate() {
   
   
        return new JdbcTemplate(dataSource());
    }
}

四、JDBC操作

1、数据库表

boot-jdbc数据库中添加两张测试表,用户基础信息tb_user表和用户扩展信息tb_user_extd表,脚本文件在工程的resources/sql-script目录下;

CREATE TABLE `tb_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_name` varchar(30) NOT NULL COMMENT '用户名称',
  `email` varchar(50) DEFAULT NULL COMMENT '邮件',
  `phone` varchar(20) NOT NULL COMMENT '手机号',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `state` int(1) DEFAULT '1' COMMENT '状态:1启用,2删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户基础信息';

CREATE TABLE `tb_user_extd` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `city_name` varchar(50) DEFAULT NULL COMMENT '城市名称',
  `school` varchar(200) DEFAULT NULL COMMENT '学校名称',
  PRIMARY KEY (`id`),
  KEY `user_id_index` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户扩展信息';

2、JdbcTemplate

JdbcTemplate是由spring-jdbc组件提供,支持DataSource的注册,是对数据库操作的深层封装,支持一系列数据操作方法;

@Service
public class JdbcService {
   
   

    private static final Logger logger = LoggerFactory.getLogger(JdbcService.class);
    @Resource
    private JdbcTemplate jdbcTemplate ;

    /**
     * 添加数据
     */
    public int addData (User user){
   
   
        return jdbcTemplate.update(
                "INSERT INTO `tb_user` (`user_name`, `email`, `phone`, `create_time`, `update_time`) VALUES (?, ?, ?, ?, ?)",
                user.getUserName(),user.getEmail(),user.getPhone(),user.getCreateTime(),user.getUpdateTime());
    }
    /**
     * 查询全部
     */
    public List<User> queryAll (){
   
   
        return jdbcTemplate.query("SELECT * FROM tb_user WHERE state=1",new BeanPropertyRowMapper<>(User.class));
    }
    /**
     * 修改字段
     */
    public int updateName (Integer id,String name){
   
   
        return jdbcTemplate.update("UPDATE `tb_user` SET `user_name` = ? WHERE `id` = ?",name,id);
    }
    /**
     * 主键删除
     */
    public int deleteId (Integer id){
   
   
        return jdbcTemplate.update("DELETE FROM `tb_user` WHERE `id` = ?",id);
    }
}

五、MybatisPlus框架

1、配置管理

1.1 配置类

在配置类中,添加MapperScan注解用来扫描和注册MyBatis框架的mapper接口,以及设置PaginationInnerInterceptor分页拦截器;

@Configuration
@MapperScan("com.boot.jdbc.mapper")
public class MybatisConfig {
   
   

    /**
     * 分页
     */
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
   
   
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

1.2 配置文件

在日志中输出mybatis框架解析的SQL语句,方便在测试的时候快速发现问题;

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2、Mapper

Mapper接口编写数据库操作方法,Mapper.xml文件中定义数据库执行的SQL语句,在mybatis-plus组件中提供很多单表操作的默认方法实现,也可以自定义方法;

2.1 Mapper接口

public interface UserMapper extends BaseMapper<User> {
   
   

    /**
     * 自定义分页
     */
    IPage<UserModel> queryUserPage(@Param("page") IPage<User> page);
}

2.2 Mapper文件

<mapper namespace="com.boot.jdbc.mapper.UserMapper">
    <select id="queryUserPage" resultType="com.boot.jdbc.entity.UserModel">
        SELECT
            tb1.id userId,
            tb1.user_name userName,
            tb1.email,
            tb1.phone,
            tb1.create_time createTime,
            tb1.update_time updateTime,
            tb1.state,
            tb2.school,
            tb2.city_name cityName
        FROM tb_user tb1
        LEFT JOIN tb_user_extd tb2 ON tb1.id = tb2.user_id
        WHERE tb1.state='1'
        ORDER BY tb1.id DESC
    </select>
</mapper>

3、单元测试

编写UserMapper接口测试,很多默认实现的方法参考BaseMapper接口即可,或者参考IService接口和ServiceImpl实现类,提供了更加丰富的扩展方法;

public class UserMapperTest {
   
   

    @Resource
    private UserMapper userMapper ;

    @Test
    public void testInsert (){
   
   
        List<User> userBatch = Arrays.asList(
                new User(null,"Zhang三","Zhang@qq.com","18623459687",new Date(),new Date(),1));
        userBatch.forEach(userMapper::insert);
    }

    @Test
    public void testUpdate (){
   
   
        User user = userMapper.selectById(1);
        user.setState(2);
        userMapper.updateById(user);
    }

    @Test
    public void testDelete (){
   
   
        userMapper.deleteById(7);
    }

    @Test
    public void testQuery (){
   
   
        List<User> userColumnsList = new LambdaQueryChainWrapper<>(userMapper)
                .select(User::getUserName,User::getPhone,User::getEmail)
                .like(User::getPhone,"189").orderByDesc(User::getId).last("limit 2").list();
        userColumnsList.forEach(System.out::println);
    }

    @Test
    public void testPage (){
   
   
        // 1、默认分页查询
        IPage<User> userPage = new Page<>(2,2) ;
        IPage<User> userPageList = userMapper.selectPage(userPage,new QueryWrapper<>());
        userPageList.getRecords().forEach(System.out::println);

        // 2、自定义查询分页
        IPage<UserModel> userModelPage = userMapper.queryUserPage(userPage);
        userModelPage.getRecords().forEach(System.out::println);
    }
}

六、参考源码

文档仓库:
https://gitee.com/cicadasmile/butte-java-note

源码仓库:
https://gitee.com/cicadasmile/butte-spring-parent
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
50 3
springboot整合springsecurity,从数据库中认证
|
3天前
|
存储 JSON Ubuntu
时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard
本文介绍了如何结合 Thingsboard 和 TDengine 实现设备管理和数据存储。Thingsboard 中的“设备配置”与 TDengine 中的超级表相对应,每个设备对应一个子表。通过创建设备配置和设备,实现数据的自动存储和管理。具体操作包括创建设备配置、添加设备、写入数据,并展示了车辆实时定位追踪和车队维护预警两个应用场景。
18 3
|
9天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
14 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
9天前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
11 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
15天前
|
SQL Java 数据库
Springboot+spring-boot-starter-data-jdbc实现数据库的操作
本文介绍了如何使用Spring Boot的spring-boot-starter-data-jdbc依赖来操作数据库,包括添加依赖、配置数据库信息和编写基于JdbcTemplate的数据访问代码。
15 2
|
15天前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
17 0
Springboot引入jpa来管理数据库
|
24天前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
59 10
|
18天前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
58 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
18天前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
24 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
23天前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。