SpringBoot 使用JDBC_風栖祈鸢的博客-程序员秘密_springboot使用jdbc

技术标签: spring boot  java  mysql  SpringBoot  

SpringBoot 使用JDBC

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

1. 使用JDBC

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

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

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

<dependencies>
    <!-- JDBC -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- MYSQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

然后在 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

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

@SpringBootTest
class SpringBoot05DataApplicationTests {
    

    // 自动装配数据源
    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() {
    
        // 查看默认的数据源 :class com.zaxxer.hikari.HikariDataSource
        System.out.println(dataSource.getClass());
    }

}

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

@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();
        // 查看获得的连接 [email protected] wrapping [email protected]
        // 是 JDBC 的连接!
        System.out.println(connection);
        connection.close();
    }

}

这里遇到了一个逆天问题,即使用 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<? extends DataSource> type;
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    private String jndiName;
    
    ...
        
}

回忆一下,在 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 {
    
    
    ...
    
}

呃,到这里就回忆起点东西来了,不过源码就不继续深入了。总之,通过在 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;
    }
}

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

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

// 复习:返回 JSON 字符串,不经过视图解析器
@RestController
public class JDBCController {
    

    // 已经配置好了,直接拿过来用
    @Autowired
    JdbcTemplate jdbcTemplate;

    // 查询数据库的所有信息
    // 还没写实体类,怎么获取数据库中的对象?使用 Map!
    @GetMapping("/userList")
    public List<Map<String,Object>> userList(){
    
        // 查询 user 表的所有信息
        String sql = "select * from user";
        List<Map<String, Object>> 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";
    }
}

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

3. 总结

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43560701/article/details/122550387

智能推荐

python3.7+opencv3.4.1_weixin_30932215的博客-程序员秘密

https://solarianprogrammer.com/2016/09/17/install-opencv-3-with-python-3-on-windows/https://www.cnblogs.com/yuanzm/p/4089856.html pip installhttps://blog.csdn.net/qq_41670196/article/details/793...

linux 3.10 kernel src 编译,linux内核编译详解_weixin_39765057的博客-程序员秘密

一、内核简介内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linu...

Postgresql AutoVacuum系统自动清理进程_siwluxuefeng的博客-程序员秘密

《PostgreSQL数据库内核分析》第2章PostgreSQL的体系结构,本章从宏观上对PostgreSQL的控制和处理流程进行了简要介绍,说明了各个模块之间是如何协同工作,以使得整个数据库系统能够稳定、正确地处理用户的各种操作和请求的。至于每个模块是如何各司其职,其内部具体是如何运作的,将会在后续的章节进行专门的介绍。本节为大家介绍AutoVacuum系统自动清理进程。AD:51CTO

Android自定义属性百分比布局_胡逸枫的博客-程序员秘密

概述 平时android开发时,头疼不已的也就是界面了,各式各样的控件组合在一个小小的屏幕上面,就会发现自己写出来的界面在不同像素的设备上面,会出现错乱不堪的布局,是不是很头痛?控件的大小不好控制,布局时如果用LinearLayout权重布局,也可以解决这一问题,但是有时候权重也比较坑,况且布局不全用LinearLayout吧,再说LinearLayout嵌套多了,资源也很浪费。所以也就研究了重

Unity 2d/3d 拖拽_fanfan_hongyun的博客-程序员秘密

using System.Collections;using System.Collections.Generic;using UnityEngine;//接口引用的事件系统命名空间using UnityEngine.EventSystems;public class Test_2d : MonoBehaviour, IDragHandler,IPointerClickHandl...

django对接mongodb实现数据库查询操作_Q893448322的博客-程序员秘密

最近再给客户做一个数据展示的后台操作界面,给的数据是mongo的,要知道django对mongo不是很友好,网上有说views层操作mongo数据库和操作mysql大体差不多,但是例如mysql的查询语句是下面这样查询所有的:all = models.send.objects.all().values('party_id','party_name','party_img')很遗憾,mongo可是做不到,他没有all(),没有value(),所以用操作mysql的方法来操作mongo是不切实际的。补充

随便推点

搭建属于自己的云盘服务_weixin_34032779的博客-程序员秘密

  前言  最近在整理硬盘中的一些视频文档,虽然之前进行了分类,但时间一长,还是有点乱,找个东西得翻找半天。于是乎,就有了下面这个小玩意,自建云盘服务。  软硬清单  外接硬盘一枚(用于挂载)  宽带、路由器(家中常备)  SSH连接工具(SecureCRT,Xshell)  Nginx、PHP、owncloud、ngrok  装好系统的树莓派 3B+ 一只(充电器、CPU散热风扇等)  配置环境...

#115 二维数组数据行列互换_Fish_in_UESTC的博客-程序员秘密

题目描述:编写函数,使其能将二维数组(5*3)中的数据进行行列互换。(参考函数原型:void tran(int array[5][3], int out_array[3][5]))输入输出格式要求: out_array是用于保存行列交换之后的结果的数组 碰到异常情况输出error(参数为null) 例如:array[5][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}}调用tran函数之后out_array[3][5] = {{1

pytorch 多GPU 问题记录_星云舰长的博客-程序员秘密

使用NAS,网络太大,一块放不下,所以尝试用ddp玩一个多gpu训练。(py36torch15) [email protected]:~/wang/FasterCrowdCountingNAS/FBNetBranch$ python main.py /home//anaconda3/envs/py36torch15/lib/python3.6/site-packages/pytorch_lightning/utilities/distributed.py:23: UserWarning: You requested

剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)_码莎拉蒂 .的博客-程序员秘密

1 问题判断二叉树是不是对称(递归和非递归实现)如下二叉树,就是对称的二叉树 2 3 3 1 4 4 1 如下二叉树,就是非对称的二叉树 2 3 3 1 ...

[Leetcode][python]Set Matrix Zeroes/矩阵置零_蛮三刀酱的博客-程序员秘密

题目大意如果矩阵中存在0,那么把0所在的行和列都置为0。要求在所给的矩阵上完成操作。 注意:最好的空间复杂度是常数空间解题思路参考: https://www.hrwhisper.me/leetcode-set-matrix-zeroes/ https://shenjie1993.gitbooks.io/leetcode-python/073%20Set%20Matrix%20Zeroes.ht

c 读书心得_hyiwei16的博客-程序员秘密

<br />养成一个好的习惯------<br />声明变量的同时进行初始化

推荐文章

热门文章

相关标签