一、JDBC常用类和接口

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。

JDBC与数据库驱动的关系:接口与实现类的关系。

 

二、JDBC常用类和接口

JDBC有关的类:都在java.sql 和 javax.sql 包下.

接口在Java中是用来定义 `行为规范的`.   接口必须有实现类.

 

JDBC规范(四个核心对象):

DriverManager:用于注册驱动

Connection: 表示与数据库创建的连接

Statement: 操作数据库sql语句的对象

ResultSet: 结果集或一张虚拟表

 
特别注意:
Mysql驱动8版本之后的driverClass 和url 的写法
com.mysql.cj.jdbc.Driver
 
jdbc:mysql://localhost:3306/day04?serverTimezone=UTC&characterEncoding=utf-8
	// JDBC 初体验
@Test
public void demo01() throws SQLException {
// 1. 装载驱动
DriverManager.registerDriver(new Driver());
// 2. 建立连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "111");
// 3. 操作数据
String sql = "select * from user;";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " : " + username + " : " + password + " : " + email);
}
// 4. 释放资源
rs.close();
stmt.close();
conn.close();
}
 
 
 
 
 
 
 
 
 
1
// JDBC 初体验
2
    @Test
3
public void demo01() throws SQLException {
4
// 1. 装载驱动
5
DriverManager.registerDriver(new Driver());
6
// 2. 建立连接
7
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "111");
8
// 3. 操作数据
9
String sql = "select * from user;";
10
Statement stmt = conn.createStatement();
11
ResultSet rs = stmt.executeQuery(sql);
12
while (rs.next()) {
13
int id = rs.getInt("id");
14
String username = rs.getString("username");
15
String password = rs.getString("password");
16
String email = rs.getString("email");
17
System.out.println(id + " : " + username + " : " + password + " : " + email);
18
}
19
// 4. 释放资源
20
rs.close();
21
stmt.close();
22
conn.close();
23
}
24

 
 
 
JDBC工具类的提取()
 
方式一、
--src下放连接数据库的配置文件
    |--properties
 // 配置文件的名字     jdbc.properties

#mysql
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
user=root
password=111
 
 
 
1
 
 
 
 
 
1
 // 配置文件的名字     jdbc.properties
2

3
#mysql
4
driverClass=com.mysql.jdbc.Driver
5
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
6
user=root
7
password=111
8

 
 
--util包
    |--JDBCUtils 类   
    |
public class JDBCUtils {

	// 属性
private static String driverClass;
private static String url;
private static String username;
private static String password; // 什么时候加载外部配置文件最合适 ???
// 特点1 : 随着类的加载而加载.
// 特点2 : 静态代码块只在类加载的被执行一次. 仅一次.
static {
Properties prop = new Properties(); try {
prop.load(new FileReader("jdbc.properties")); // 如果程序执行到这里, 说明外部资源文件加载成功, 需要给我们的静态属性赋值
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password"); // 直接执行加载驱动
loadDriver(); } catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("文件资源加载失败!");
}
} // 加载驱动
public static void loadDriver() {
try {
// 1. 加载驱动
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
// e.printStackTrace();
// 驱动加载失败!
throw new RuntimeException("驱动加载失败!");
}
} // 建立连接
public static Connection getConnection() throws SQLException {
// 2. 建立连接
return DriverManager.getConnection(url, username, password);
} // 释放资源
public static void release(Connection conn, Statement stmt, ResultSet rs) {
// 4. 释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
// 将 rs 清空
rs = null;
}
// 直接调用
release(conn, stmt);
}
public static void release(Connection conn, Statement stmt) {
// 4. 释放资源
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
 
 
 
 
 
 
 
 
 
1
public class JDBCUtils {
2

3
// 属性
4
private static String driverClass;
5
private static String url;
6
private static String username;
7
private static String password;
8

9
//  什么时候加载外部配置文件最合适 ???   
10
// 特点1 : 随着类的加载而加载.
11
// 特点2 : 静态代码块只在类加载的被执行一次. 仅一次.
12
static {
13
Properties prop = new Properties();
14

15
try {
16
prop.load(new FileReader("jdbc.properties"));
17

18
// 如果程序执行到这里, 说明外部资源文件加载成功, 需要给我们的静态属性赋值
19
driverClass = prop.getProperty("driverClass");
20
url = prop.getProperty("url");
21
username = prop.getProperty("username");
22
password = prop.getProperty("password");
23

24
// 直接执行加载驱动
25
loadDriver();
26

27
} catch (IOException e) {
28
e.printStackTrace();
29
throw new RuntimeException("文件资源加载失败!");
30
}
31
}
32

33
// 加载驱动
34
public static void loadDriver() {
35
try {
36
// 1. 加载驱动
37
Class.forName(driverClass);
38
} catch (ClassNotFoundException e) {
39
// e.printStackTrace();
40
// 驱动加载失败!
41
throw new RuntimeException("驱动加载失败!");
42
}
43
}
44

45
// 建立连接
46
public static Connection getConnection() throws SQLException {
47
// 2. 建立连接
48
return DriverManager.getConnection(url, username, password);
49
}
50

51
// 释放资源
52
public static void release(Connection conn, Statement stmt, ResultSet rs) {
53
// 4. 释放资源
54
if (rs != null) {
55
try {
56
rs.close();
57
} catch (SQLException e) {
58
e.printStackTrace();
59
}
60
// 将 rs 清空
61
rs = null;
62
}
63
// 直接调用
64
release(conn, stmt);
65
}
66
public static void release(Connection conn, Statement stmt) {
67
// 4. 释放资源
68
if (stmt != null) {
69
try {
70
stmt.close();
71
} catch (SQLException e) {
72
e.printStackTrace();
73
}
74
stmt = null;
75
}
76
if (conn != null) {
77
try {
78
conn.close();
79
} catch (SQLException e) {
80
e.printStackTrace();
81
}
82
conn = null;
83
}
84
}
85
}
86

 
 
	@Test
public void test_update() {
Connection conn = null;
Statement stmt = null;
try {
// 2. 建立连接
conn = JDBCUtils.getConnection();
// 3. 操作数据
String sql = "update user set username = 'zhaoliu', password = '123', email = 'zhaoliu@youjian.cn' where id = 4;";
stmt = conn.createStatement();
int affectedRowNum = stmt.executeUpdate(sql);
System.out.println(affectedRowNum);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 释放资源
JDBCUtils.release(conn, stmt);
}
} @Test
public void test_delete() {
Connection conn = null;
Statement stmt = null; try {
// 1. 建立连接
conn = JDBCUtils.getConnection();
// 2. 操作数据
String sql = "delete from user where id = 5;";
stmt = conn.createStatement();
int affectedRowNum = stmt.executeUpdate(sql);
System.out.println(affectedRowNum);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 释放资源
JDBCUtils.release(conn, stmt);
}
} @Test
public void test_insert() { Connection conn = null;
Statement stmt = null;
try {
// 1. 建立连接
conn = JDBCUtils.getConnection();
// 2. 操作数据
String sql = "insert into user values(null, 'xiaoqi', '123', 'xiaoqi@youjian.cn');";
stmt = conn.createStatement();
int affectedRowNumber = stmt.executeUpdate(sql);
System.out.println(affectedRowNumber);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 释放资源
JDBCUtils.release(conn, stmt);
}
} // 以上使用时 在进行查询的操作时 有可能会出现 sql注入问题
// 解决SQL注入:使用PreparedStatement 取代 Statement
// PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示
// select * from user where username = ? and password = ? ;
// 将带有?的SQL 发送给数据库完成编译 (不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数
// PreparedStatement 可以将? 代替参数 发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的 /************ JDBC 数据库连接操作 ***************/
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null; try {
// 1. 建立连接
conn = JDBCUtils.getConnection();
// 2. 操作数据
String sql = "select * from user where username = ? and password = ?;";
stmt = conn.prepareStatement(sql);
// 设置sql语句的参数
stmt.setString(1, username);
stmt.setString(2, password);
// 执行sql语句
rs = stmt.executeQuery();
// 判断返回的结果
if (rs.next()) {
// 登录成功
int id = rs.getInt("id");
String u_name = rs.getString("username");
String u_pwd = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email);
System.out.println("登录成功!");
} else {
// 登录失败
System.out.println("登录失败! 用户名或密码错误!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 3. 释放资源
JDBCUtils.release(conn, stmt, rs);
}
}
}
 
 
 
x
110
 
 
 
 
 
1
@Test
2
public void test_update() {
3
Connection conn = null;
4
Statement stmt = null;
5
try {
6
// 2. 建立连接
7
conn = JDBCUtils.getConnection();
8
// 3. 操作数据
9
String sql = "update user set username = 'zhaoliu', password = '123', email = 'zhaoliu@youjian.cn' where id = 4;";
10
stmt = conn.createStatement();
11
int affectedRowNum = stmt.executeUpdate(sql);
12
System.out.println(affectedRowNum);
13
} catch (SQLException e) {
14
e.printStackTrace();
15
} finally {
16
// 4. 释放资源
17
JDBCUtils.release(conn, stmt);
18
}
19
}
20

21
@Test
22
public void test_delete() {
23
Connection conn = null;
24
Statement stmt = null;
25

26
try {
27
// 1. 建立连接
28
conn = JDBCUtils.getConnection();
29
// 2. 操作数据
30
String sql = "delete from user where id = 5;";
31
stmt = conn.createStatement();
32
int affectedRowNum = stmt.executeUpdate(sql);
33
System.out.println(affectedRowNum);
34
} catch (SQLException e) {
35
e.printStackTrace();
36
} finally {
37
// 4. 释放资源
38
JDBCUtils.release(conn, stmt);
39
}
40
}
41

42
@Test
43
public void test_insert() {
44

45
Connection conn = null;
46
Statement stmt = null;
47
try {
48
// 1. 建立连接
49
conn = JDBCUtils.getConnection();
50
// 2. 操作数据
51
String sql = "insert into user values(null, 'xiaoqi', '123', 'xiaoqi@youjian.cn');";
52
stmt = conn.createStatement();
53
int affectedRowNumber = stmt.executeUpdate(sql);
54
System.out.println(affectedRowNumber);
55
} catch (SQLException e) {
56
e.printStackTrace();
57
} finally {
58
// 4. 释放资源
59
JDBCUtils.release(conn, stmt);
60
}
61
}
62

63

64
// 以上使用时 在进行查询的操作时 有可能会出现 sql注入问题
65
// 解决SQL注入:使用PreparedStatement 取代 Statement 
66
// PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示
67
// select * from user where username = ? and password = ? ;
68
// 将带有?的SQL 发送给数据库完成编译 (不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数
69
// PreparedStatement 可以将? 代替参数 发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的 
70

71

72

73
/************ JDBC 数据库连接操作 ***************/
74
Connection conn = null;
75
PreparedStatement stmt = null;
76
ResultSet rs = null;
77

78
try {
79
// 1. 建立连接
80
conn = JDBCUtils.getConnection();
81
// 2. 操作数据
82
String sql = "select * from user where username = ? and password = ?;";
83
stmt = conn.prepareStatement(sql);
84
// 设置sql语句的参数
85
stmt.setString(1, username);
86
stmt.setString(2, password);
87
// 执行sql语句
88
rs = stmt.executeQuery();
89
// 判断返回的结果
90
if (rs.next()) {
91
// 登录成功
92
int id = rs.getInt("id");
93
String u_name = rs.getString("username");
94
String u_pwd = rs.getString("password");
95
String email = rs.getString("email");
96
System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email);
97
System.out.println("登录成功!");
98
} else {
99
// 登录失败
100
System.out.println("登录失败! 用户名或密码错误!");
101
}
102
} catch (SQLException e) {
103
e.printStackTrace();
104
} finally {
105
// 3. 释放资源
106
JDBCUtils.release(conn, stmt, rs);
107
}
108
}
109
}
110

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

19JDBC初体验的更多相关文章

  1. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  2. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  3. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  4. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  5. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  6. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  7. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  8. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  9. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

随机推荐

  1. 深入浅出Tomcat/2 - Tomcat启动和停止

    Tomcat启动和停止 很明显,我们启动或停止Tomcat,一般调用的是bin下的startup.sh或shutdown.sh(以Linux为例,以下涉及到平台,若无特殊说明,一般都指Linux).我 ...

  2. List对象去重碎碎念之神叨叨

    前言 List集合操作去除重复数据的这种情况经常会碰到,博客园里面也有很多大神们做过,在这里主要是借鉴然后自己整理了一下,主要是为了方便自己,以后再次碰到这种去重问题,直接打开自己的链接拿起键盘就是干 ...

  3. Windows Community Toolkit 3.0 - Gaze Interaction

    概述 Gaze Input & Tracking - 也就是视觉输入和跟踪,是一种和鼠标/触摸屏输入非常不一样的交互方式,利用人类眼球的识别和眼球方向角度的跟踪,来判断人眼的目标和意图,从而非 ...

  4. python爬虫随笔(2)—启动爬虫与xpath

    启动爬虫 在上一节中,我们已经创建好了我们的scrapy项目,看着这一大堆文件,想必很多人都会一脸懵逼,我们应该怎么启动这个爬虫呢? 既然我们采用cmd命令创建了scrapy爬虫,那就得有始有终有逼格 ...

  5. Python-SMTP发送邮件(HTML、图片、附件)

    前言: SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. 一.Python发送HTML ...

  6. A+B大数运算

    基础加法大数运算: [https://vjudge.net/problem/HDU-1002] 题目: 输入两个长度不超过1000的整数求出sum. 思路: 由于数字很大不能直接加,用字符串形式输入, ...

  7. PS调出水彩画效果古装人物照片

    首先在PS里操作: 1.磨皮液化 磨皮液化就不细说啦~常规操作. 2.背景调色 分析:想塑造油画般的感觉,背景颜色想要蓝绿色 1.用可选颜色工具里面的中性色改变整体颜色,把皮肤和头发颜色用蒙版擦出来: ...

  8. hadoop和java 配置环境变量的的tar

    第一步:打开工具上传tar包 如下图 第二步:在文件路径下查看是否上传成功 第三步:解压tar包               tar -zxvf hadoop.2.6.5.tar.gz 第四步:配置环 ...

  9. CRM系统设计方案

    CRM系统设计方案 - 百度文库https://wenku.baidu.com/view/a34eebeb0242a8956bece473.html 服务支持http://www.uf-crm.com ...

  10. Azure系列2.1.1 —— BlobContainerPermissions

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...