[SpringBoot] SpringBoot JDBC访问数据库
创始人
2024-03-31 19:00:40
0

 ✨✨个人主页:沫洺的主页

 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

💖💖如果文章对你有所帮助请留下三连✨✨

🍃Spring Boot JDBC访问数据库 

对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 都默认采用整合 Spring Data 的方式进行统一处理,通过大量自动配置,来简化我们对数据访问层的操作,我们只需要进行简单的设置即可实现对书层的访问。

引入JDBC启动器


org.springframework.bootspring-boot-starter-data-jdbc

数据库驱动

     mysqlmysql-connector-javaruntime

配置数据源application.yml

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db5?useSSL=false&useServerPrepStmts=trueusername: rootpassword: 123456

测试

Spring Boot 提供了一个名为 JdbcTemplate 的轻量级数据访问工具,它是对 JDBC 的封装。Spring Boot 对 JdbcTemplate 提供了默认自动配置,我们可以直接使用 @Autowired 或构造函数将它注入到 bean 中使用。

单元测试

@SpringBootTest
class ApplicationTests {@Autowiredprivate DataSource dataSource;@Autowiredprivate JdbcTemplate jdbcTemplate;@Testvoid contextLoads() throws SQLException {System.out.println("默认数据源:" + dataSource.getClass());System.out.println("数据库连接实例:" + dataSource.getConnection());// 访问数据库Integer i = jdbcTemplate.queryForObject("SELECT count(*) FROM user", Integer.class);System.out.println("user 表中共有" + i + "条数据。");}
}

🍂Spring Boot整合Druid数据源 

Druid 是阿里巴巴推出的一款开源的高性能数据源产品,Druid 支持所有 JDBC 兼容的数据库,包括 Oracle、MySQL、SQL Server 和 H2 等等。Druid 不仅结合了 C3P0、DBCP 和 PROXOOL 等数据源产品的优点,同时还加入了强大的监控功能。通过 Druid 的监控功能,可以实时观察数据库连接池和 SQL 的运行情况,帮助用户及时排查出系统中存在的问题。

使用 Druid Spring Boot Starter 将 Druid 与 Spring Boot 整合

引入 Druid Spring Boot Starter 依赖

com.alibabadruid-spring-boot-starter1.2.9

配置属性

#数据库连接信息配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://localhost:3306/db5druid:initial-size: 10 # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时min-idle: 10 # 最小连接池数量 最小空闲数量maxActive: 200 # 最大连接池数量 最大活跃连接数maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置timeBetweenEvictionRunsMillis: 60000 # 检查空闲连接的频率.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。minEvictableIdleTimeMillis: 300000 # 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间validationQuery: SELECT 1  # 验证数据库服务可用性的sql.用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUALtestWhileIdle: true # 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRuntestOnBorrow: false # 申请连接时直接检测连接是否有效.申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。testOnReturn: false # 归还连接时检测连接是否有效.归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。poolPreparedStatements: true # 开启PSCachemaxPoolPreparedStatementPerConnectionSize: 20 #设置PSCache值connectionErrorRetryAttempts: 3 # 连接出错后再尝试连接三次breakAfterAcquireFailure: true # 数据库服务宕机自动重连机制timeBetweenConnectErrorMillis: 300000 # 连接出错后重试时间间隔asyncInit: true # 异步初始化策略remove-abandoned: true # 是否自动回收超时连接remove-abandoned-timeout: 1800 #  超时时间(以秒数为单位) 超过此值后,druid将强制回收该连接transaction-query-timeout: 6000 # 事务超时时间filters: stat,wall,log4j2connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000stat-view-servlet:enabled: true            #是否开启内置监控页面,默认值为 falseurl-pattern: "/druid/*"    #StatViewServlet 的映射路径,即内置监控页面的访问地址allow: 127.0.0.1    #白名单deny:     #黑名单reset-enable: false       #是否启用重置按钮login-username: admin     #内置监控页面的登录页用户名 usernamelogin-password: admin     #内置监控页面的登录页密码 passwordweb-stat-filter:           enabled: true            #是否开启内置监控中的 Web-jdbc 关联监控的数据url-pattern: "/*"        #匹配路径exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"  #排除路径session-stat-enable: true                             #是否监控session

🍁Spring Boot整合MyBatis

MyBatis 是一个半自动化的 ORM 框架,所谓半自动化是指 MyBatis 只支持将数据库查出的数据映射到 POJO 实体类上,而实体到数据库的映射则需要我们自己编写 SQL 语句实现,相较于Hibernate 这种完全自动化的框架,Mybatis 更加灵活,我们可以根据自身的需求编写 sql 语句来实现复杂的数据库操作。

随着 Spring Boot 越来越流行,越来越多的被厂商及开发者所认可,MyBatis 也开发了一套基于 Spring Boot 模式的 starter:mybatis-spring-boot-starter。

引入依赖

org.mybatis.spring.bootmybatis-spring-boot-starter2.1.4

(jdbc,mysql驱动,druid)

org.springframework.dataspring-data-jdbc

com.alibabadruid-spring-boot-starter1.2.9

mysqlmysql-connector-javaruntime

application.yml配置 MyBatis

#数据库连接信息配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db5?useSSL=false&useServerPrepStmts=trueusername: rootpassword: 123456druid:initial-size: 10 # 初始化时建立物理连接的个数min-idle: 10 # 最小连接池数量maxActive: 200 # 最大连接池数量maxWait: 60000 # 获取连接时最大等待时间,单位毫秒
#映射文件所在位置
mybatis:mapper-locations: classpath:mapper/*Mapper.xml#别名type-aliases-package: com.moming.entity#配置日志级别
logging:level:com.moming: debug

示例

AccountEntity

package com.moming.entity;import lombok.Data;import java.math.BigDecimal;
@Data
public class AccountEntity {private Integer id;private String name;private BigDecimal money;
}

AccountDto

package com.moming.dto;import lombok.Data;import java.math.BigDecimal;@Data
public class AccountDto {private Integer id;private String name;private BigDecimal money;
}

AccountMapper.xml




AccountDao

package com.moming.dao;import com.moming.entity.AccountEntity;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface  AccountDao{List select();}

AccountService

package com.moming.service;import com.moming.dto.AccountDto;import java.util.List;public interface AccountService {List select();
}

AccountServiceImpl

package com.moming.service.impl;import cn.hutool.core.bean.BeanUtil;
import com.moming.dao.AccountDao;
import com.moming.dto.AccountDto;
import com.moming.entity.AccountEntity;
import com.moming.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Overridepublic List select() {List entityList  = accountDao.select();List accountDtoList = BeanUtil.copyToList(entityList, AccountDto.class);return accountDtoList;}
}

AccountController

package com.moming.controller;import com.moming.dto.AccountDto;
import com.moming.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/api/account")
public class AccountController {@Autowiredprivate AccountService accountService;@GetMapping("/select")public List select(){return accountService.select();}
}

补充

启动类@MapperScan

在不使用@MapperScan前,我们需要直接在Mapper/Dao接口类上面添加注解@Mapper,这种方式要求每一个Mapper/Dao接口类都需要添加此注解,非常麻烦,属于重复劳动。通过使用@MapperScan注解,可以让我们不用为每个Mapper/Dao接口类都添加@Mapper注解

package com.moming;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.moming.dao")
public class App2 {public static void main(String[] args) {SpringApplication.run(App2.class, args);}
}
package com.moming.dao;import com.moming.entity.AccountEntity;
import org.apache.ibatis.annotations.Mapperimport java.util.List;//@Mapper
public interface  AccountDao{List select();}

🍀Spring Boot事务 

在spring boot中 要使用事务 直接使用注解@Transactional既可,无需要做其它任何配置。是因为默认已经开启,下图可以看到默认true,这个注解是用来声明这个类或者方法需要开启事务。

@EnableTransactionManagement // 等同于xml配置方式的

这个注解可以放在springboot的启动类上,也可以放在配置类上。他的作用是开启事务管理。他是spring-tx中的注解,不是springboot中的注解。如果你添加的是 spring-boot-starter-jdbc 依赖(mybatis框架也会依赖jdbc),框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。springboot的autoconfigure是默认已经有这个注解的,所以在springboot中不需要再次使用这个注解。

详情可参考:@Transactional事务管理可以不使用@EnableTransactionalManagement开启

所以启动类上不加@EnableTransactionManagement注解,也可以进行事务管理

测试

AccountDao

@Mapper
public interface  AccountDao{@Update("update account set money=money-#{money} where name=#{fromName}")Integer minusMoney(String fromName, BigDecimal money);@Update("update account set money=money+#{money} where name=#{toName}")Integer addMoney(String toName, BigDecimal money);
}

AccountService

public interface AccountService {void transfer();
}

AccountServiceImpl

@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Transactional@Overridepublic void transfer() {accountDao.minusMoney("张三", BigDecimal.valueOf(200));//int a = 1/0;accountDao.addMoney("李四", BigDecimal.valueOf(200));}
}

AccountController

@RestController
@RequestMapping("/api/account")
public class AccountController {@Autowiredprivate AccountService accountService;@GetMapping("/transfer")public String transfer(){accountService.transfer();return "转账成功";}
}

转账异常,事务回滚

​
@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Transactional@Overridepublic void transfer() {accountDao.minusMoney("张三", BigDecimal.valueOf(200));int a = 1/0;accountDao.addMoney("李四", BigDecimal.valueOf(200));}
}​

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...