• SpringBoot3数据库集成


    标签: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版本;

    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>${mysql.version}version>
    dependency>
    
    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druid-spring-boot-3-starterartifactId>
        <version>${druid-spring-boot.version}version>
    dependency>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-jdbcartifactId>
        <version>${spring-boot.version}version>
    dependency>
    
    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
        <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 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 {
    
        /**
         * 自定义分页
         */
        IPage queryUserPage(@Param("page") IPage 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 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 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 userPage = new Page<>(2,2) ;
            IPage userPageList = userMapper.selectPage(userPage,new QueryWrapper<>());
            userPageList.getRecords().forEach(System.out::println);
    
            // 2、自定义查询分页
            IPage userModelPage = userMapper.queryUserPage(userPage);
            userModelPage.getRecords().forEach(System.out::println);
        }
    }
    

    六、参考源码

    文档仓库:
    https://gitee.com/cicadasmile/butte-java-note
    
    源码仓库:
    https://gitee.com/cicadasmile/butte-spring-parent
    
  • 相关阅读:
    【Hack The Box】windows练习-- Bastion
    嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之设备节点 (物联技术666)
    SpringCloudAliBaba篇(八)之gateway ---> 手把手教你搭建服务网关
    SpringBoot SpringBoot 原理篇 2 自定义starter 2.2 IP计数业务功能开发【自定义starter】
    Intel汇编-变量初始赋值
    微博头条文章开放接口报错 auth by Null spi
    3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行
    R语言使用nnet包的multinom函数构建无序多分类logistic回归模型、使用summary函数获取模型汇总统计信息
    Libuv源码解析 - async
    Access denied for user ‘itstar‘@‘%localhost‘ to database ‘sc‘
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/17624936.html