• SpringBoot 使用JDBC


    SpringBoot 使用JDBC

    我超,又要开始了。太久不写,全忘完了,就当 Remake 了!

    1. 使用JDBC

    SringBoot 对数据层进行访问,无论是 SQL(关系型数据库)还是 NoSQL(非关系型数据库),其底层都是采用 Spring Data 的方式进行处理的。

    按照之前的笔记,创建 SpringBoot-05-Data 项目,然后添加数据相关的依赖,先只添加基础的 JDBC API 和 MySQL Driver,学习一下。

    进入项目,查看 pom.xml 文件,可以看到依赖

    
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
        
            mysql
            mysql-connector-java
            runtime
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    然后在 resources 目录下创建 application.yaml 文件(自带 properties 文件,但这里我们使用 yaml 文件),添加连接数据库的信息

    spring:
      datasource:
        username: root
        password: '0723'
        # serverTimezone=UTC 解决时区问题
        url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
        # mysql8 以上使用 cj
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    因为 SpringBoot 自动装配的特性,导入 JDBC 的依赖且在 yaml 中配置好对应的后,它就会直接为我们生成对应的对象,在 test 中直接输出查看一下

    @SpringBootTest
    class SpringBoot05DataApplicationTests {
    
        // 自动装配数据源
        @Autowired
        DataSource dataSource;
    
        @Test
        void contextLoads() {
            // 查看默认的数据源 :class com.zaxxer.hikari.HikariDataSource
            System.out.println(dataSource.getClass());
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    然后尝试利用数据源创建连接,同时查看一下连接

    @SpringBootTest
    class SpringBoot05DataApplicationTests {
    
        // 自动装配数据源
        @Autowired
        DataSource dataSource;
    
        @Test
        void contextLoads() throws SQLException {
            // 查看默认的数据源 :class com.zaxxer.hikari.HikariDataSource
            System.out.println(dataSource.getClass());
            // 获得数据库连接
            Connection connection = dataSource.getConnection();
            // 查看获得的连接 HikariProxyConnection@354350463 wrapping com.mysql.cj.jdbc.ConnectionImpl@10895b16
            // 是 JDBC 的连接!
            System.out.println(connection);
            connection.close();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这里遇到了一个逆天问题,即使用 yaml 文件连接数据库的话,纯数字密码要带上单引号,否则会连接失败。上面的 yaml 文件是修改后的,小折磨了一下。

    如此,在 SpringBoot 中就成功获取到 JDBC 的连接了!就可以通过 JDBC 连接操作数据库了······都到 SpringBoot 了谁还用 JDBC!

    但这还不够,再去小小地看一下源码,从 yaml 的配置属性如 username 点进去,进到了 DataSourceProperties 类!其中可以看到数据源可以配置的所有属性

    @ConfigurationProperties(
        prefix = "spring.datasource"
    )
    public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
        private ClassLoader classLoader;
        private boolean generateUniqueName = true;
        private String name;
        private Class type;
        private String driverClassName;
        private String url;
        private String username;
        private String password;
        private String jndiName;
        
        ...
            
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    回忆一下,在 SpringBoot 中,有 xxxProperties 类,就会有与之对应的 xxxAutoConfiguration 类!使用 Ctrl+N 全局搜索,可以搜索到 DataSourceAutoConfiguration 类!

    @Configuration(
        proxyBeanMethods = false
    )
    // 自动配置
    @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
    @ConditionalOnMissingBean(
        type = {"io.r2dbc.spi.ConnectionFactory"}
    )
    // 绑定了 DataSourceProperties 
    @EnableConfigurationProperties({DataSourceProperties.class})
    // 导入...忘了
    @Import({DataSourcePoolMetadataProvidersConfiguration.class, InitializationSpecificCredentialsDataSourceInitializationConfiguration.class, SharedCredentialsDataSourceInitializationConfiguration.class})
    public class DataSourceAutoConfiguration {
        
        ...
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    呃,到这里就回忆起点东西来了,不过源码就不继续深入了。总之,通过在 yaml 文件中对数据源 datasource 进行配置,SpringBoot 就能获取到这些配置然后创建数据源,当然,不要忘记导入相关的包。

    2. JDBCTemplate

    有了数据源(Hikari)后,可以获取到数据库连接(JDBC Connection),就可以使用原生的 JDBC 对数据库进行操作了。即使不使用额外的数据库操作框架如 MyBatis,SpringBoot 也对原生的 JDBC 进行了轻量的封装,从而产生了 JDBCTemplate。

    JDBCTemplate 的自动配置依赖于 org.springframework.boot.autoconfigure.jdbc 下的 JdbcTemplateConfiguration 类。

    @Configuration(
        proxyBeanMethods = false
    )
    @ConditionalOnMissingBean({JdbcOperations.class})
    class JdbcTemplateConfiguration {
        JdbcTemplateConfiguration() {
        }
    
        @Bean
        @Primary
        JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {
            ...
            return jdbcTemplate;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    数据库操作的 CRUD 方法都封装在了 JDBCTemplate 中,且 SpringBoot 已经将其配置好放入容器中,我们只需要获取然后使用即可!

    在 com.qiyuan 下创建 controller 包,并在其中创建 JDBCController 类使用一下 JDBCTemplate。此处出错:之前创建项目的时候忘记加入 web 相关的包了,导致 SpringMVC 注解无法使用。

    // 复习:返回 JSON 字符串,不经过视图解析器
    @RestController
    public class JDBCController {
    
        // 已经配置好了,直接拿过来用
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        // 查询数据库的所有信息
        // 还没写实体类,怎么获取数据库中的对象?使用 Map!
        @GetMapping("/userList")
        public List> userList(){
            // 查询 user 表的所有信息
            String sql = "select * from user";
            List> list_maps = jdbcTemplate.queryForList(sql);
            return list_maps;
        }
    
        @GetMapping("/addUser")
        public String addUser(){
            String sql = "insert into mybatis.user(id,name,pwd) values (4,'qiyuanb','123456')";
            jdbcTemplate.update(sql);
            return "add-ok";
        }
    
        // 用一下 RestFul 风格
        @GetMapping("/updateUser/{id}")
        public String updateUser(@PathVariable("id")int id){
            // 预编译,需要传参数
            String sql = "update mybatis.user set name=?,pwd=? where id="+id;
            Object object[] = new Object[2];
            object[0]="qiyuanc";
            object[1]="0823";
            jdbcTemplate.update(sql,object);
            return "update-ok";
        }
        @GetMapping("/deleteUser/{id}")
        public String deleteUser(@PathVariable("id")int id){
            String sql = "delete from mybatis.user where id=?";
            jdbcTemplate.update(sql,id);
            return "delete-ok";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    测试完全成功,到这里简单的 SpringBoot 使用 JDBC 操作就结束了!同时复习了控制器 Controller 的操作、RestFul 风格、预编译 SQL 等知识。

    3. 总结

    由于 SpringBoot 将 JDBC 的操作封装了起来成为 JDBCTemplate,使得我们即使直接使用 JDBC 对数据库进行操作也没有以前那么麻烦了。不过既然有更好用的 MyBatis,还是要用更好的。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【网络】详解http协议
    数据库学习之数据类型
    Win11 Windows聚焦不更新了怎么解决?聚焦锁屏图片不更换怎么办
    达梦数据冲刺科创板:拟募资24亿 冯裕才曾为华科教授
    AGI之MFM:《多模态基础模型:从专家到通用助手》翻译与解读之视觉理解、视觉生成
    面向对象12:什么是多态
    C语言第三十弹---自定义类型:结构体(上)
    【线性代数】【一】1.5 矩阵的逆
    结构型设计模式学习笔记
    ioDraw:与 GitHub、gitee、gitlab、OneDrive 无缝对接,绘图文件永不丢失!
  • 原文地址:https://blog.csdn.net/iijik55/article/details/126114244