SpringBoot整合JDBC-调用数据库
SpringData
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。
Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目。
数据库相关的启动器 :可以参考官方文档:
https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
SpringBoot整合JDBC
引入相关依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
或者创建项目时,勾选相应的模块依赖:
编写yaml配置文件连接数据库;
配置完这一些东西后,我们就可以直接去使用了,因为SpringBoot已经默认帮我们进行了自动配置;去测试类测试一下
@SpringBootTest class Swgger01ApplicationTests { //DI注入数据源 @Autowired DataSource dataSource; @Test public void contextLoads() throws SQLException { //看一下默认数据源 System.out.println(dataSource.getClass()); //获得连接 Connection connection = dataSource.getConnection(); System.out.println(connection); //关闭连接 connection.close(); } }
结果:我们可以看到他默认给我们配置的数据源为
com.zaxxer.hikari.HikariDataSource
连接为:
com.mysql.cj.jdbc.ConnectionImpl
HikariDataSource 号称 Java WEB 当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀;
查看配置
前面我们已经指定可以整合进来的组件都会和配置文件的属性对应的存在一个配置类,那么这里直接从配置文件的配置字段可以进入配置类查看:
在这个属性类里可以看到所有的可配置属性。
可以使用 spring.datasource.type 指定自定义的数据源类型,值为 要使用的连接池实现的完全限定名。
那么对应也会存在xxxxAutoConfiguratio,在这里即DataSourceAutoConfiguration
搜索一下,确实找到DataSourceAutoConfiguration文件,即数据源自动配置文件
有了数据库连接,显然就可以 CRUD 操作数据库了。但是我们需要先了解一个对象 JdbcTemplate
JDBCTemplate
1、有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
2、即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate。
3、数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
4、Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用
5、JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 JdbcTemplateConfiguration 类
JdbcTemplate主要提供以下几类方法:
-
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
-
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
-
query方法及queryForXXX方法:用于执行查询相关语句;
-
call方法:用于执行存储过程、函数相关语句。
测试
编写一个Controller,注入 jdbcTemplate,编写测试方法进行访问测试;
@RestController @RequestMapping("/cat") public class TestCatConttoller { /** * Spring Boot 默认提供了数据源,默认提供了 org.springframework.jdbc.core.JdbcTemplate * JdbcTemplate 中会自己注入数据源,用于简化 JDBC操作 * 还能避免一些常见的错误,使用起来也不用再自己来关闭数据库连接 */ @Autowired JdbcTemplate jdbcTemplate; //查询所有 //List 中的1个 Map 对应数据库的 1行数据 //Map 中的 key 对应数据库的字段名,value 对应数据库的字段值 @GetMapping("/list") public List<Map<String, Object>> catList(){ String sql = "select * from test_cat"; List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); return maps; } //新增 @GetMapping("/add") public String addCat(){ String sql = "insert into test_cat(cat_name, cat_age,cat_color)" + " values ('橘子',2,'灰色')"; jdbcTemplate.update(sql); return "addOk"; } //修改 @GetMapping("/update/{catId}") public String updateCat(@PathVariable("catId") int catId){ //插入语句 String sql = "update test_cat set cat_name=?,cat_age=? where cat_id="+catId; //数据 Object[] objects = new Object[2]; objects[0] = "橘猫"; objects[1] = "20"; jdbcTemplate.update(sql,objects); //查询 return "updateOk"; } //删除 @GetMapping("/delete/{catId}") public String delCat(@PathVariable("catId") int catId){ //插入语句 String sql = "delete from test_cat where cat_id=?"; jdbcTemplate.update(sql,catId); //查询 return "deleteOk"; } }
访问测试:
查询
增加
修改catId为1的猫的age为4,名字为橘猫:
http://localhost:8080/cat/update/1
测试请求,结果正常;
到此,CURD的基本操作,使用 JDBC 就搞定了。