02-SpringBoot工程中JDBC应用实践

org.springframework.boot

spring-boot-maven-plugin

添加项目依赖


  1. mysql数据库驱动依赖。

mysql

mysql-connector-java

runtime

  1. spring对象jdbc支持(此时会默认帮我们下载HiKariCP连接池)。

org.springframework.boot

spring-boot-starter-jdbc

配置HikariCP连接池


打开application.properties配置文件,添加如下内容(必写)。

spring.datasource.url=jdbc:mysql:///db-system?serverTimezone=GMT%2B8&characterEncoding=utf8

spring.datasource.username=root

spring.datasource.password=root

hikariCP 其它额外配置(可选),代码如下(具体配置不清晰的可自行百度):

spring.datasource.type=com.zaxxer.hikari.HikariDataSource

spring.datasource.hikari.minimum-idle=5

spring.datasource.hikari.maximum-pool-size=15

spring.datasource.hikari.auto-commit=true

spring.datasource.hikari.idle-timeout=30000

spring.datasource.hikari.pool-name=DatebookHikariCP

spring.datasource.hikari.max-lifetime=1800000

spring.datasource.hikari.connection-timeout=30000

spring.datasource.hikari.connection-test-query=SELECT 1

创建项目启动类


package com.cy;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class JdbcApplication {//Application.class

public static void main(String[] args) {//Main Thread

SpringApplication.run(JdbcApplication .class, args);

}

}

HikariCP 连接池测试


第一步:在项目中添加单元测试类及测试方法,代码如下:

package com.cy.pj.common.datasource;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest

public class DataSourceTests {

@Autowired

private DataSource dataSource;

@Test

public void testConnection() throws Exception{

System.out.println(dataSource.getConnection());

}

}

在当前测试类中我们需要:

  • 掌握单元测试类、测试方法编写规范。

  • 理解DataSource的设计规范及规范的实现。

  • 分析在测试类中dataSource属性指向的对象是谁?

  • 分析在测试类中DataSource的实现类对象由谁创建和管理?

  • 思考基于DataSource接口获取连接的基本过程是怎样的?

第二步:API调用过程分析,如图所示:

在这里插入图片描述

测试BUG分析


  • 类编译错误,DataSource为javax.sql包中的类型,如图所示:

在这里插入图片描述

  • 连接错误:数据库连接不上,如图所示:

在这里插入图片描述

JDBC基本操作实践

====================================================================

业务分析


基于HikariCP,借助JDBC技术访问公告表中的数据。

业务原型设计


公告列表页面,如图所示:

在这里插入图片描述

代码设计及实现


基于JDBC技术操作表中数据,并进行单元测试。

第一步:定义单元测试类,关键代码如下:

package com.cy.pj.sys.dao;

import org.junit.jupiter.api.Test;

import javax.sql.DataSource;

import java.sql.*;

/**

  • 通过此单元测试类获取数据源对象,并且通过数据对象获取数据库连接

  • @SpringBootTest 注解描述的类

  • 为springboot中的单元测试类

  • 说明:

  • 1)springboot中的单元测试类必须放在启动类所在包

  • 或子包中

  • 2)springboot中的单元测试类必须使用@SpringBootTest注解描述

*/

@SpringBootTest

public class JdbcTests {//is a Object

@Autowired

private DataSource dataSource;//HikariDataSource (类)

}

第二步:在单元测试类中添加向表中写入数据的方法,关键代码如下:

@Test

void testSaveNotice01()throws SQLException{

//1.建立连接 (负责与数据库进行通讯)

Connection conn= dataSource.getConnection();

//2.创建statement(sql传送器->负责与将sql发送到数据库端)

String sql="insert into sys_notices " +

" (title,content,type,status,createdTime,createdUser,modifiedTime,modifiedUser) " +

" values (‘维护通知’,‘2020-02-02 19:00 系统维护’,‘1’,‘0’,now(),‘tony’,now(),‘tony’) ";

//这种方式Statement的创建,适合sql中不需要动态传入值的方式。

Statement stmt=conn.createStatement();

//3.发送sql

stmt.execute(sql);

//4.处理结果

//5.释放资源(后续释放资源要写到finally代码块中)

stmt.close();

conn.close();//将连接返回池中

}

第三步:在类中定义向表中写入数据的另一种方式,关键代码如下:

@Test

void testSaveNotice02()throws SQLException{

//1.建立连接 (负责与数据库进行通讯)

Connection conn= dataSource.getConnection();

//2.创建statement(sql传送器->负责与将sql发送到数据库端)

String sql="insert into sys_notices " +

" (title,content,type,status,createdTime,createdUser,modifiedTime,modifiedUser) " +

" values (?,?,?,?,?,?,?,?) ";//?表示占位符

PreparedStatement stmt=conn.prepareStatement(sql);//预编译方式创建Statement对象

//3.发送sql

//3.1为sql中的?号赋值

stmt.setString(1,“升级通知”);

stmt.setString(2,“2021年3月18号 系统升级”);

stmt.setString(3,“1”);

stmt.setString(4,“0”);

stmt.setTimestamp(5,new Timestamp(System.currentTimeMillis()));

stmt.setString(6,“jason”);

stmt.setTimestamp(7,new Timestamp(System.currentTimeMillis()));

stmt.setString(8,“tony”);

//3.2 发送sql

stmt.execute();

//4.处理结果

//5.释放资源(后续释放资源要写到finally代码块中)

stmt.close();

conn.close();//将连接返回池中

}

}

第四步,添加查询通知的单元测试方法,关键代码如下:

@Test

void testSelectNotices01()throws SQLException{

//1.建立连接

Connection conn=dataSource.getConnection();

//2.创建Statement

String sql=“select id,title,content,status,type,createdTime from sys_notices where id>=?”;

PreparedStatement pstmt=conn.prepareStatement(sql);

//3.发送sql(发送到数据库)

pstmt.setInt(1,2);

boolean flag=pstmt.execute();

//4.处理结果

ResultSet rs=null;

if(flag){//true表示查询,有结果集

//获取结果集(二维表结构)

rs=pstmt.getResultSet();

List<Map<String,Object>> list=new ArrayList<>();

while(rs.next()){//一行记录应为一个map对象 (行映射)

//构建map,用于存储当前行记录

Map<String,Object> map=new HashMap();

//将取出类的数据存储到map (key为字段名,值为字段value)

map.put(“id”,rs.getInt(“id”));

map.put(“title”,rs.getString(“title”));

map.put(“content”,rs.getString(“content”));

map.put(“status”,rs.getString(“status”));

map.put(“type”,rs.getString(“type”));

map.put(“createdTime”,rs.getTimestamp(“createdTime”));

//…

//将每行记录对应的map对象存储到list集合

System.out.println(map);

list.add(map);

}

}

//5.释放资源

rs.close();

pstmt.close();

conn.close();

}

第五步,通过元数据让查询映射更加灵活,关键代码如下:

@Test

void testSelectNotices02()throws SQLException{

//1.建立连接

Connection conn=dataSource.getConnection();

//2.创建Statement

String sql=“select id,title,content,status,type,createdTime from sys_notices where id>=?”;

PreparedStatement pstmt=conn.prepareStatement(sql);

//3.发送sql(发送到数据库)

pstmt.setInt(1,2);

boolean flag=pstmt.execute();

//4.处理结果

ResultSet rs=null;

if(flag){//true表示查询,有结果集

//获取结果集(二維表結構)

rs=pstmt.getResultSet();

List<Map<String,Object>> list=new ArrayList<>();

//获取结果集中的元shuju (表名,字段名)

ResultSetMetaData rsmd=rs.getMetaData();

while(rs.next()){//一行记录应为一个map对象 (行映射)

Map<String,Object> map=new HashMap();

//将取出类的数据存储到map (key为字段名,值为字段value)

for(int i=1;i<=rsmd.getColumnCount();i++){

//getColumnCount();獲取列的數量

map.put(rsmd.getColumnLabel(i),rs.getObject(rsmd.getColumnLabel(i)));

//rsmd.getColumnLabel(i) 获取第i列的名字

}

//将每行记录对应的map对象存储到list集合

System.out.println(map);

list.add(map);

}

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

部分内容截图:


《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

[外链图片转存中…(img-YGdFxTrS-1712079618109)]

部分内容截图:

[外链图片转存中…(img-iEVOKIg0-1712079618110)]

[外链图片转存中…(img-k6FJLTxS-1712079618110)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值