一、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. 【php增删改查实例】第二十六节 - 个人详情页制作

    在一般的系统中,当用户点击头像的时候,就会跳转到对应的个人详情页,在这个页面,他可以查看和修改自己的个人信息,或者更换头像. 本案例中,个人详情页使用bootstrap框架. 首先,我们新建一个htm ...

  2. Quartz.NET 任务调度新教程

    https://www.cnblogs.com/yscit/p/10393867.html

  3. 《React Native 精解与实战》书籍连载「配置 iOS 与 Android 开发环境」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  4. python2.x版本与python3.x版本的区别以及运算符

    python2.x中: 重复代码,语言不统一,不支持中文 py2中除法获取的都是整形 py2中有long(长整形) print 可以加括号也可以不加括号 range 在py2中打印的结果是列表 py2 ...

  5. Python Revisited Day 04 (控制结构与函数)

    目录 4.1 控制结构 4.1.1 条件分支 4.1.2 循环 4.2 异常处理 4.2.1 捕获与产生异常 4.2.2 自定义异常 4.3 自定义函数 Tips 参数默认值为可变时 危险 4.3.1 ...

  6. Shell脚本命令图片

    查看相关文档:shell脚本1  shell脚本2

  7. Redis教程(Linux)

    这里汇总了从简单的安装到较为复杂的配置,由浅入深的学习redis... 一 , 安装 1) redis扩展安装 从官网上下载扩展压缩包 wget http://pecl.php.net/get/red ...

  8. 2 Servlet 细节

    1 Servlet 配置详解 ①  由于客户端在浏览器只能通过URL访问web服务器的资源,所以Servlet程序若想被外界访问,必须把Servlet 程序映射到一个URL 地址上,这个工作在项目we ...

  9. VSC软件快捷键

    Shift + Alt + F  格式化 Ctrl+Shift+P, F1显示命令面板 Ctrl+P快速打开,进入File… Ctrl + Shift + N新窗口/实例 Ctrl + Shift + ...

  10. Netcat实用操作

    写久了web倦了,第n次开始尝试网络开发,于是熟悉一下常用工具. 尝试了一下netcat来测试服务器,或者充当客户端都异常好用.于是记录一下常用的一下命令 1. 充当服务器,或者客户端进行访问 通过n ...