mysql jdbc驱动_JDBC认识与实践

本文详细介绍了JDBC的基本原理,包括DriverManager、连接和Statement的使用,重点讲解了PreparedStatement在防止SQL注入方面的优势,并通过示例展示了如何在实际项目中应用。此外,还讨论了传统JDBC的局限性及ORM框架的引入背景。
摘要由CSDN通过智能技术生成

一、什么是JDBC?

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

b3ba3d9a842447cc98af043e7698bf22.png
JDBC思维导图

二、JDBC应用流程

以下是我们使用JDBC进行数据访问时的常规步骤,如果感觉理解起来有一点云里雾里也没关系,可以看看后面的代码自己实践体会一下。

1. 加载驱动类

DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 

2. 创建数据库连接

String url = "jdbc:mysql://localhost:3306/databasename"; 
Connection connection = DriverManager.getConnection(url, "username", "password"); 

3. 创建数据库操作通道

Statement statement = connection.createStatement(); 

4. 执行数据操作,返回结果集

ResultSet resultSet = statement.executeQuery("sql statement"); 

5. 解析并处理结果集

resultSet.getInt(1);//获取结果集的第1列(必须能够以int类型接收) 
resultSet.getString(2);//获取结果集的第2列(必须能够以String类型接收) 
resultSet.getDate(3);//获取结果集的第3列(必须能够以Date类型接收) 

6. 关闭数据接口(注意关闭顺序)

resultSet.close(); 
statement.close(); 
connection.close(); 

三、绑定statement的数据访问示例

假定我们新建了一个数据库名为test,里面有一张表user,里面的结构和数据如下图所示:

1a38bdaf47d7835aae6cacf5d16a2247.png

1.使用Statement进行数据访问

废话不多说,直接贴代码:

import java.sql.*;

public class MysqlTest {

    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";
    private static final String DATABASE_NAME = "test";
    private static final String DATABASE_USERNAME = "root";
    private static final String DATABASE_PASSWORD = "root";

    public static void main(String[] args) {
        try {
            //1.注册数据库驱动
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Class.forName("com.mysql.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (Exception e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
            return;
        }

        String url = DATABASE_URL + DATABASE_NAME;
        Connection conn = null;
        try {

            //2.创建并获取数据库连接
            conn = DriverManager.getConnection(url, DATABASE_USERNAME, DATABASE_PASSWORD);

            //3.设置statement对象
            Statement stmt = conn.createStatement();
            System.out.println("创建Statement成功!");

            //4.通过statement执行SQL语句并获取结果
            ResultSet rs = stmt.executeQuery("select id,username from user order by id desc limit 0, 3");
            while (rs.next()) {
                //5.对结果集进行解析处理
                System.out.println(rs.getInt(1) + "," + rs.getString(2));
            }

            //6.释放资源。顺序:ResultSet→Statement→Connection
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != conn) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

具体的逻辑在注释中写的比较清楚了,就不多加赘述了。

运行后结果如下:

5,John
4,Peter
3,Jack

这里有一个小tip:使用Statement无法防止SQL注入攻击。对SQL注入攻击如果感兴趣的话可以走传送门:

sql注入_百度百科​baike.baidu.com
ef4e33ed34b4c559a19080c8b86015d0.png

2.使用PreparedStatement进行数据访问

PreparedStatement是继承了Statement的接口。它与Statement的最大不同之处是,PreparedStatement会对SQL语句先做预编译,以防止SQL注入

//An object that represents a precompiled SQL statement.
public interface PreparedStatement extends Statement {
}

来看看使用PreparedStatement进行数据访问的代码示例,与使用Statement的代码非常相似,小有不同:

import java.sql.*;

public class MysqlTest {

    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";
    private static final String DATABASE_NAME = "test";
    private static final String DATABASE_USERNAME = "root";
    private static final String DATABASE_PASSWORD = "root";

    public static void main(String[] args) {
        try {

            //1.注册数据库驱动
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Class.forName("com.mysql.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (Exception e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
            return;
        }

        String url = DATABASE_URL + DATABASE_NAME;
        Connection conn = null;
        try {

            //2.创建并获取数据库连接
            conn = DriverManager.getConnection(url, DATABASE_USERNAME, DATABASE_PASSWORD);

            //3.设置preparedStatement对象
            PreparedStatement stmt = conn.prepareStatement("select id,username from user order by id desc limit ?,?");
            System.out.println("创建PreparedStatement成功!");

            //4.为preparedStatement绑定参数
            stmt.setInt(1, 0);
            stmt.setInt(2, 3);

            //4.通过preparedStatement执行SQL语句并获取结果
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                //5.对结果集进行解析处理
                System.out.println(rs.getInt(1) + "," + rs.getString(2));
            }

            //6.释放资源。顺序:ResultSet→preparedStatement→Connection
            rs.close();
            stmt.close();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != conn) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

这里运行结果和使用Statement的相同:

5,John
4,Peter
3,Jack

四、传统JDBC存在的问题

通过我们实际的JDBC代码实践,可以体会到以下几点:

1.频繁创建释放连接,系统开销大

2.SQL语句硬编码在Java代码中,不易维护

3.结果集解析复杂

4.……

所以这才引入了我们的ORM框架:

孑辞:STEP5.1 初识MyBatis​zhuanlan.zhihu.com
43b1d3f4545a28c1232ee39cfea25fca.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值