19JDBC初探

一、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
}

来自为知笔记(Wiz)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值