写点什么

SpringBoot3 数据库集成

作者:知了一笑
  • 2023-08-12
    浙江
  • 本文字数:3913 字

    阅读完需:约 13 分钟

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类;


@Configurationpublic 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的注册,是对数据库操作的深层封装,支持一系列数据操作方法;


@Servicepublic 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
复制代码


发布于: 2023-08-12阅读数: 20
用户头像

知了一笑

关注

公众号:知了一笑 2020-04-08 加入

源码仓库:https://gitee.com/cicadasmile

评论

发布
暂无评论
SpringBoot3数据库集成_Java_知了一笑_InfoQ写作社区