SpringBoot3数据库集成

news2024/12/30 4:03:44

标签:Jdbc.Druid.Mybatis.Plus;

一、简介

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

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

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

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

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

二、工程搭建

1、工程结构

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud 智慧工地源码(PC端+移动端)项目平台、监管平台、大数据平台

智慧工地源码 智慧工地云平台源码 智慧建筑源码 “智慧工地”是利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术&#xff0c;彻底改变传统建筑施工现场参建各方现场管理的交互方式、工作方式和管理模式&#xff0c;实现对人、机、料、法、环的全方位实时监…

uniapp开发公众号,微信开发者工具进行本地调试

每次修改完内容都需要发行之后&#xff0c;再查看效果&#xff0c;很麻烦 &#xff01;&#xff01;&#xff01; 下述方法&#xff0c;可以一边在uniapp中修改内容&#xff0c;一边在微信开发者工具进行本地调试 修改hosts文件 在最后边添加如下内容 修改前端开发服务端口 …

Android 第一行代码学习 -- 聊天界面小练习

前言&#xff1a;最近在学习安卓&#xff0c;阅读入门书籍第一行代码&#xff0c;以后更新的知识可能大部分都会和安卓有关。 实现聊天界面 1.编写主界面 个人觉得界面编写刚开始学可能看着很乱&#xff0c;但是其中最重要的是层次&#xff0c;看懂了其中的层次&#xff0c;就…

论element-ui表格的合并行和列(巨细节)

论element-ui表格的合并行和列 0、前言 ​ 作为一个后端来写前端属实是痛苦、讲真的、刚开始我是真不想用饿了么的这个合并行和列、因为太语焉不详了、看着头疼、后来发现好像我没得选、只好硬着头皮上了。 1、element - ui 的合并行和列代码 效果图&#xff1a; 代码&…

SpringSecurity环境搭建

AOP思想&#xff1a;面向切面编程 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

【算法题】螺旋矩阵II (求解n阶Z形矩阵)

一、问题的提出 n阶Z形矩阵的特点是按照之(Z)字形的方式排列元素。n阶Z形矩阵是指矩阵的大小为nn&#xff0c;其中n为正整数。 题目描述 一个 n 行 n 列的螺旋(Z形)矩阵如图1所示&#xff0c;观察并找出填数规律。 图1 7行7列和8行8列的螺旋(Z形)矩阵 现在给出矩阵大小 n&…

异步电机模型预测转矩控制MPTC关键技术(1、一拍延迟补偿)

导读&#xff1a;本期文章主要介绍异步电机模型预测转矩控制MPTC中的一拍延迟补偿的内容。先进性一拍延迟补偿原理的介绍&#xff0c;之后进行仿真验证补偿的有效性。 如果需要文章中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;留言获取。 一…

Vue输入框或者选择框无效,或者有延迟

问题剖析 使用Vue这种成熟好用的框架&#xff0c;一般出现奇奇怪怪的问题都是因为操作不当导致的&#xff0c;例如没有合理调用组件、组件位置不正确、没有合理定义组件或者变量、样式使用不当等等... 解决方案 如果你也出现了输入框输入东西&#xff0c;但是没有效果…

Qt扫盲-Qt Model/View 理论总结 [下篇]

Qt Model/View 理论总结 [下篇] 一、处理I tem view 中的选择1. 概念1. 当前项目和已选项目 2. 使用选择 model1. 选择项目2. 读取选区状态3. 更新选区4. 选择 model 中的所有项 二、创建新 model1. 设计一个 model2. 只读示例 model1. model 的尺寸2. model 头和数据 3. 可编辑…

视频号产业带服务商申请详细指南!

在各大电商平台中&#xff0c;产业带服务商是一个不可或缺的角色。他们是在商家背后提供支持的群体&#xff0c;也是电商平台生态中不可或缺的一环。 近日&#xff0c;视频号对产业带服务商进行了新一轮的公示&#xff0c;新增补录共9家产业带申请找cmxyci服务商。其中服饰行业…

nextjs中使用image图片

使用nextjs的组件&#xff1a; import Image from "next/image";<Image src"xxx" alt"图片" width{300} height{300} />加入允许跨域&#xff1a; 在next.config.js中加入 const nextConfig {images: {domains: ["images.doc.ceo&q…

spring-自定义AOP面向切面注解--统一切面处理-登陆信息采集

2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09;or2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 1. 先写一个登陆记录注解&#xff08;//记录&#xff1a;XXX时间&#xff0c;XXX姓名&#xff0c;XX…

Python + ttkbootstrap 制作全网小说下载神器

前言 ttkbootstrap是一个基于Python的开源库&#xff0c;用于创建漂亮且交互式的GUI应用程序。它是在Tkinter框架之上构建的&#xff0c;提供了一系列的Widget组件和样式&#xff0c;可以帮助开发者快速构建现代化的用户界面。 今天做的是这个东西&#xff0c;蓝色的是进度条…

[管理与领导-10]:IT基层管理者 - 目标、责任、落实 - 如何把管理者的高高在上的目标,落地、落实到团队实施

目录 前言&#xff1a; 情形1&#xff1a;下属不知如何下手 情形2&#xff1a;下属不敢承诺 情形3&#xff1a;下属能力不够 情形4&#xff1a;奖罚机制失效&#xff0c;干活的动力不够 补充&#xff1a;目标与落实过节的进一步分析 1. 目标分解出了问题&#xff1a;目…

abbitmq启动访问不了http://localhost:15672 通过修改服务登录admin

abbitmq默认的对Administration授权&#xff0c;而我的用户不是默认的Administration&#xff0c;所以后来打开服务&#xff0c;找到rabbitmq服务&#xff0c;属性&#xff0c;登陆&#xff0c;将本地系统账户修改为此账户&#xff0c;修改完成之后再重启服务&#xff0c;这时候…

“探索计算机世界:进程的基本概念与功能“

文章目录 前言什么是进程如何描述进程进程的属性1. 进程标识符2. 内存指针3. 文件描述符表4. 进程的状态5. 优先级6. 上下文7. 记账信息 内存分配并行和并发 前言 作为程序员&#xff0c;理解计算机的组成以及计算机是怎样运行的是很重要的&#xff0c;因为只有了解计算机我们…

SQL-每日一题【1517. 查找拥有有效邮箱的用户】

题目 表: Users 编写一个解决方案&#xff0c;以查找具有有效电子邮件的用户。 一个有效的电子邮件具有前缀名称和域&#xff0c;其中&#xff1a; 前缀 名称是一个字符串&#xff0c;可以包含字母&#xff08;大写或小写&#xff09;&#xff0c;数字&#xff0c;下划线 _ &…

解决MySQL与Redis缓存一致性的问题

背景 考试系统中&#xff0c;教师会在后台发布一场考试&#xff0c;考试会存储在MySQL和Redis里面&#xff0c;考试有时候是会出错的&#xff0c;我们需要后台修改&#xff0c;如果多个教师在后台并发修改&#xff08;概率不大&#xff09;&#xff0c;可能会出现数据库缓存不…

【mysql】MySQL CUP过高如何排查?

文章目录 一. 问题锁定二. QPS激增会导致CPU飘高三. 慢SQL会导致CPU飘高四. 大量空闲连接会导致CPU飘高五. MySQL问题排查常用命令 一. 问题锁定 通过top命令查看服务器CPU资源使用情况&#xff0c;明确CPU占用率较高的是否是mysqld进程&#xff0c;如果是则可以明确CUP飘高的原…

Java类和对象(一文读懂)

文章目录 类、对象是什么&#xff1f;创建类构造器 创建对象 类、对象是什么&#xff1f; 类&#xff1a;类是一个模板&#xff0c;它描述一类对象的行为和状态。类可以看成是创建 Java 对象的模板。 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#x…