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版本;

<!-- 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三","[email protected]","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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章