加载中...
Java_JDBC学习
发表于:2022-03-28 | 分类: 课程
字数统计: 3.2k | 阅读时长: 15分钟 | 阅读量:

JDBC

一、JDBC概述:

JDBC (Java Database Connectivity)指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。

二、JDBC的功能

①加载JDBC驱动程序

②建立与数据库的连接

③使用SQL语句进行数据库的操作并处理结果

④关闭相关连接

三、JDBC的驱动程序和体系结构

3.1、驱动程序

JDBC主要提供两个层次的接口,分别是面向程序开发人员的JDBC APIJDBC应用程序接口)和面向系统底层的JDBC Drive APIJDBC驱动程序接口)

image-20220328194423804

3.2、体系结构

DriverManager :依据数据库的不同,管理JDBC驱动

Connection :负责连接数据库并担任传送数据的任务

Statement Connection 产生、负责执行SQL语句

ResultSet:负责保存Statement执行后所产生的查询结果

image-20220328194631261

3.21、DriverManager

java.sql.DriverManager用来装载驱动程序,并创建新的数据连接。关键方法:

getConnection():

使用给定的url建立一个数据库连接,并返回一个Connection接口对象;

3.22、Connection

java.sql.Connection接口完成对某一指定数据库的连接。关键方法:

createStatement():在本连接上生成一个Statement对象,该对象可对本连接的特定数据库发送SQL语句;

**commit()**:提交数据库上当前的所有待提交的事务;

close():关闭当前的JDBC数据库连接

3.33、Statement

java.sql.Statement接口用于执行 SQL 语句并将数据检索到 ResultSet 中 。关键方法:

executeQuery(String sql):执行一条SQL查询语句,返回查询结果对象;

executeUpdate(String sql):执行一条SQL插入、更新、删除语句,返回操作影响的行数;

execute(String sql):执行一条SQL语句

3.34、ResultSet

java.sql.ResultSet接口用于保存数据库结果集,通常通过执行查询数据库的语句生成

java.sql.ResultSet接口对于给定声明获得结果的存取控制。在这些接口中提供了非常丰富的方法,可以使用这种方法对数据库进行各种操作

四、JDBC访问数据库基本步骤

①导入包

②加载并注册驱动程序

③创建Connection对象

④创建Statemen对象

⑤执行语句

⑥关闭资源

image-20220328195708876

4.1、导入包

直接

1
import java.sql.*;

或者

1
2
3
4
5
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;

4.2、加载并注册驱动程序

JDBC驱动由数据库厂商提供

image-20220328200728666

4.21、JDBC_ODBC桥连方式

在个人开发与测试中使用JDBC-ODBC桥连方式

4.22、纯Java驱动方式

在生产型开发中,推荐使用纯Java驱动方式

JDBC驱动直接访问数据库

优点100% Java,快又可跨平台

缺点:访问不同的数据库需要下载专用的JDBC驱动

image-20220328200921136

4.221、使用纯Java驱动方式进行直连

1、下载数据库厂商提供的驱动程序包

2、将驱动程序包引入工程中(需要加载导入的jar包)

3、编程,通过纯Java驱动方式与数据库建立连接

1
2
3
4
5
6
//SQL Server数据库:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//MySql数据库
Class.forName("com.mysql.jdbc.Driver");
//Oracle数据库
Class.forName(“oracle.jdbc.driver.OracleDriver");
DBMS 类包名 驱动名称 URL地址
SQL Server sqljdbc4.jar com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://localhost:1433;databaseName=数据库名称
MySQL mysql-connector-java-5.0.16-ga-bin.jar com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/数据库名称
ORCLE class12.jar oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@dssw2k01:1521:数据库名称
DB2 db2jcc.jar com.ibm.db2.jdbc.net.DB2Driver jdbc:db2://localhost:6789/数据库名称

食用方法:

1
2
3
4
5
6
7
8
9
//如果加载驱动程序失败将抛出ClassNotFoundException异常,即未找到指定的驱动类,所以需要在加载数据库驱动类时捕捉可能抛出的异常
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
}
catch (ClassNotFoundException e)
{
System.out.println("加载数据库驱动时抛出异常内容如下:");
e.printStackTrace();
}

4.3、创建Connection对象

食用方法:

DriverManager类的静态方法getConnection(),将返回一个数据库连接(Connection对象

1
Connection connection = DriverManager.getConnection(url,userName,password);

4.4、创建Statement对象

食用方法:

使用JDBC执行SQL命令前,必须先创建Statement对象。调用Connection对象的createStatement( )方法,该方法返回一个Statement对象

1
Statement statement = connection.createStatement();

Statement接口提供了3种执行语句的方法

方法 功能
executeQuery(String sql) 将返回一个ResultSet型的结果集,用来执行SELECT查询语句
executeUpdate(String sql) 用于执行INSERT、UPDATE或DELETE语句。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。
execute(String sql) 返回类型boolean,代表执行此语句是否有resultset 返回,有就是ture。用于执行返回多个结果集、多个更新计数或二者组合的语句

4.5、执行语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//更改
int n=statement.executeUpdate(sql);
System.out.println("更新了"+n+"行");

//查询
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
//通过列的索引检索
//System.out.print("学号:" + resultSet.getString(1) + "\t");
//System.out.print("姓名:" + resultSet.getString(2) + "\t");
//System.out.print("性别:" + resultSet.getString(3) + "\t");
//System.out.print("年龄:" + resultSet.getInt(4) + "\t");
//System.out.print("班级:" + resultSet.getInt(5) + "\t");
//System.out.println();
//通过列名索引
System.out.print("学号:" + resultSet.getString("sno") + "\t");
System.out.print("姓名:" + resultSet.getString("sname") + "\t");
System.out.print("性别:" + resultSet.getString("sex") + "\t");
System.out.print("年龄:" + resultSet.getInt("age") + "\t");
System.out.print("班级:" + resultSet.getInt("sclass") + "\t");
System.out.println();
}

4.6、关闭资源

1
2
3
4
5
6
//食用说明
//打开的资源使用完成后应该关闭
resultSet.close();
statement.close();
connection.close();
//注意:资源关闭的顺序和打开的顺序恰恰相反。

代码实现

一、更改Update

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TestUpdate {
public static void main(String[] args) {
/*
* 导入包
* 加载并注册驱动程序
* 创建Connection对象
* 创建Statement对象
* 执行语句
* 关闭资源
* */
String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8";
//?useUnicode=true&characterEncoding=UTF-8"; 是为了解决从应用程序向数据库写入数据时候出现中文乱码
String userName="root";
String password="root";
Connection connection=null;
Statement statement=null;
try {
//加载并注册驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建Connection对象
try {
connection = DriverManager.getConnection(url,userName,password);
//创建Statement对象
statement = connection.createStatement();
//执行SQL语句
String sql="delete from student where sname='张三丰'";
//插入 sql="insert into student values('000000','张六','男',20,1)";
//更新 sql="update student set sname='张三丰' where sname='张三'";
//删除 sql="delete from student where sname='张三丰'";
int n=statement.executeUpdate(sql);
//关闭资源(这个方式如果SQL语句出错,则这个两个资源将无法关闭,所以放在finally中)
/*statement.close();
*connection.close();
*/
System.out.println("更新了"+n+"行");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("创建连接失败,检查url,userName,password以及SQL语句");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("加载驱动失败,检查驱动字符串,以及是否导入jar包");
}finally {
if(statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

二、查询Query

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package Test;

import javax.xml.transform.Result;
import java.sql.*;

public class TestQuery {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8";
String userName = "root";
String password = "root";
Statement statement = null;
Connection connection = null;
ResultSet resultSet=null;

try {
Class.forName("com.mysql.jdbc.Driver");
try {
connection = DriverManager.getConnection(url, userName, password);
statement = connection.createStatement();
String sql = "select * from student";
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
//通过列的索引检索
// System.out.print("学号:" + resultSet.getString(1) + "\t");
// System.out.print("姓名:" + resultSet.getString(2) + "\t");
// System.out.print("性别:" + resultSet.getString(3) + "\t");
// System.out.print("年龄:" + resultSet.getInt(4) + "\t");
// System.out.print("班级:" + resultSet.getInt(5) + "\t");
// System.out.println();
//通过列名索引
System.out.print("学号:" + resultSet.getString("sno") + "\t");
System.out.print("姓名:" + resultSet.getString("sname") + "\t");
System.out.print("性别:" + resultSet.getString("sex") + "\t");
System.out.print("年龄:" + resultSet.getInt("age") + "\t");
System.out.print("班级:" + resultSet.getInt("sclass") + "\t");
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("创建连接失败,检查url,userName,password以及SQL语句");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("加载驱动失败,检查驱动字符串,以及是否导入jar包");
} finally {
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

三、封装

image-20220328205546730

路径:

  • JDBC
  • src
    • TestUtil
  • Util
    • DBUtil
    • db.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//封装类
package Util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;



public class DBUtil {

private static String driverClass;
private static String url;
private static String userName;
private static String password;
static {
Properties p = new Properties();
//加载读取文件
try {
FileInputStream is = new FileInputStream(new File("src/Util/db.properties"));
try {
p.load(is);
driverClass=p.getProperty("driver");
url=p.getProperty("url");
userName=p.getProperty("user");
password=p.getProperty("pwd");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection conn=null;
try {
conn=DriverManager.getConnection(url,userName,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(ResultSet rs,Statement st,Connection conn) {
try {
if(rs!=null) {
rs.close();
}
if(st!=null) {
st.close();
}
if(conn!=null) {
conn.close();
}
}
catch (SQLException e) {
e.printStackTrace();
}

}
public static void main(String[] args) {
Connection conn=DBUtil.getConnection();
System.out.println(conn);
DBUtil.close(null,null, conn);

}
}
1
2
3
4
5
//封装文件db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8
user=root
pwd=root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import Util.DBUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestUtil {
public static void main(String[] args) {
Statement statement = null;
ResultSet resultSet = null;
Connection connection = DBUtil.getConnection();
try {
statement = connection.createStatement();
String sql="select * from student";
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
//通过列的索引检索
// System.out.print("学号:" + resultSet.getString(1) + "\t");
// System.out.print("姓名:" + resultSet.getString(2) + "\t");
// System.out.print("性别:" + resultSet.getString(3) + "\t");
// System.out.print("年龄:" + resultSet.getInt(4) + "\t");
// System.out.print("班级:" + resultSet.getInt(5) + "\t");
// System.out.println();
//通过列名索引
System.out.print("学号:" + resultSet.getString("sno") + "\t");
System.out.print("姓名:" + resultSet.getString("sname") + "\t");
System.out.print("性别:" + resultSet.getString("sex") + "\t");
System.out.print("年龄:" + resultSet.getInt("age") + "\t");
System.out.print("班级:" + resultSet.getInt("sclass") + "\t");
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.close(resultSet,statement,connection);
}

}
}

四、Statement处理静态SQL

PreparedStatement 就是带有占位符的SQL 语句,数据库对他们事先进行编译,因此,客户端需要做的只是传送占位符位置所需要的数据。

而普通StatementSQL语句,只有在程序运行时才对他们进行编译,因此PreparedStatement运行的速度更快

Statement处理静态的SQL语句主要分为3种对象:

Statement: 基本语句

PreparedStatement: 预编译语句

CallableStatement:存储过程

image-20220328205358309

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//使用封装好的Util
package Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


import Util.DBUtil;

public class TestPrepare {

public static void main(String[] args) {
Connection conn =null;
PreparedStatement pt =null;
ResultSet rs =null;
try {
conn=DBUtil.getConnection();
//String sql="insert into student values(?,?,?,?,?)";
//String sql="update student set age=? where sname=?";
String sql="select * from student where age=?";
pt = conn.prepareStatement(sql);
pt.setObject(1, 20);
rs = pt.executeQuery();
while(rs.next()) {
System.out.print("学号:"+rs.getString("sno")+"\t");
System.out.print("姓名:"+rs.getString("sname")+"\t");
System.out.print("性别:"+rs.getString("sex")+"\t");
System.out.print("年龄:"+rs.getInt("age")+"\t");
System.out.print("班级:"+rs.getInt("sclass")+"\t");
System.out.println();
}
/*pt.setObject(1, "9999");
pt.setObject(2, "李虎");
pt.setObject(3, "男");
pt.setObject(4, 30);
pt.setObject(5, 10);*/
/*pt.setObject(1, 40);
pt.setObject(2, "李虎");
int n = pt.executeUpdate();
System.out.println("更新了"+n+"行");*/
DBUtil.close(rs,pt, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
上一篇:
eclipse创建jsp文件的默认编码修改
下一篇:
攻防世界Web
本文目录
本文目录