org.springframework.boot
spring-boot-maven-plugin
- mysql数据库驱动依赖。
mysql
mysql-connector-java
runtime
- spring对象jdbc支持(此时会默认帮我们下载HiKariCP连接池)。
org.springframework.boot
spring-boot-starter-jdbc
打开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);
}
}
第一步:在项目中添加单元测试类及测试方法,代码如下:
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调用过程分析,如图所示:
- 类编译错误,DataSource为javax.sql包中的类型,如图所示:
- 连接错误:数据库连接不上,如图所示:
====================================================================
基于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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后,附一张自己面试前准备的脑图:
面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典
- Java核心知识整理
- Spring全家桶(实战系列)
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
最后祝愿各位身体健康,顺利拿到心仪的offer!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
后,附一张自己面试前准备的脑图:**
[外链图片转存中…(img-3baJWwyJ-1711946889600)]
面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典
- Java核心知识整理
[外链图片转存中…(img-MMgL0Wkr-1711946889600)]
- Spring全家桶(实战系列)
[外链图片转存中…(img-6uiH6XoF-1711946889600)]
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
[外链图片转存中…(img-bylooDLV-1711946889601)]
很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
最后祝愿各位身体健康,顺利拿到心仪的offer!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!