Skip to content

TIP

Java DateBase Connectivity (Java数据库连接, Java语言操作数据库)

JDBC 本质是SUN公司定义的一套操作所有关系型数据库的规则,即 接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,但真正执行的代码是 驱动jar包中的实现类。

JDBC各个类的详解 ​

一、快速入门 ​

我们为什么要使用JDBC ​

284

使用JDBC开发要使用的包 ​

  • java.sql:所有与 JDBC 访问数据库相关的接口和类

  • javax.sql:数据库扩展包,提供数据库额外的功能。如:连接池

  • 数据库的驱动:由各大数据库厂商提供,需要额外去下载,是实现 JDBC 接口的一些类

具体步骤 ​

  1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar

    1. 复制 mysql-connector-java-5.1.37-bin.jar 文件到项目的 libs 目录下

    2. 项目文件夹 右键 --> Add As Library

  2. 注册驱动(让程序知道导入的是哪一个版本的jar包),Class.forName(数据库驱动实现类)

  3. 获取数据库连接对象 Connection (本地java代码和数据库之间的一个桥梁对象)

  4. 定义 sql 语句

  5. 获取执行 sql 语句的对象 Statement (因为 Connection 不能直接执行)

  6. 执行 sql,接受返回结果

  7. 处理结果

  8. 释放资源(避免内存泄露)

代码实现 ​

java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * JDBC快速入门
 */
public class JdbcDemo1 {
    public static void main(String[] args) throws Exception {

        //1. 导入所使用的数据库相对应的驱动jar包
        //2. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
	        /*
	        	Class.forName()
					装载一个类并且对其进行实例化的操作,
					装载过程中使用到的类加载器是当前类。
			*/
        //3. 获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");	
			/*
				DriverManager:驱动管理对象
				Connection:数据库连接对象
				Java DriverManager.getConnection() 方法用于获得试图建立到指定数据库 URL 的连接。 里面的参数为:数据库的url、用户名、密码
			*/
        //4. 定义sql语句
        String sql = "update account set balance = 500 where id = 1";
        //5. 获取一个可执行的sql的对象 Statement
        Statement stmt = conn.createStatement();
	        /*
				Statement:执行sql的对象
			*/
        //6. execute执行sql语句
        int count = stmt.executeUpdate(sql);
        //7. 处理结果
        System.out.println(count);
        //8. 按顺序释放资源
        stmt.close();
        conn.close();
    }
}

二、JDBC 各个类的功能详解 ​

DriverManager:驱动管理对象 ​

注册驱动:告诉程序该使用哪一个数据库驱动 jar ​

驱动包里实现注册驱动的静态方法:

java
static void registerDriver(Driver driver);
//注册与给定的驱动程序 DriverManager 。

而写代码时我们使用的是:

java
Class.forName("com.mysql.jdbc.Driver");

有一些类在加载进内存的时候会自动执行类中的某些方法。

通过查看源码我们可以发现:在 com.mysql.jdbc.Driver 类中存在静态代码块,此代码块实现了DriverManager 中的方法,我们使用的写法只是更加简单而已:

java
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    }catch (SQLException E){
        throw new RuntimeException("Can't register driver!");
    }
}

WARNING

MySQL 5.* 版本开始,注册驱动的步骤可以省去不写,因为驱动包会自动帮我们注册驱动。

当然你写了也没事,注意路径别写错就行。

获取数据库连接 ​

驱动包里的静态方法:

java
static Commection getConnection(String url, String user, String password);

三个参数:

  • url:指定连接的路径

    • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
    • 例子:jdbc:mysql://localhost : 3306/db3
    • 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则ip地址和端口号可以省略不写,即url可以简写为:jdbc:mysql:///数据库名称
  • user:用户名

  • password:密码

Connection:数据库连接对象 ​

获取执行 sql 的对象 ​

java
Statement createStatement( );
    
PrepareStatement prepareStatement(String sql);

管理事务 ​

  • 开启事务:

    java
    void setAutoCommit(boolean autoCommit);  
    //调用该方法设置参数为false,即开启事务
  • 提交事务:

    java
    void commit( );
  • 回滚事物:

    java
    void rollback( );

Statement:执行sql的对象 ​

执行 sql ​

  • 可以执行任意的 sql 的方法。但使用并不多,了解即可:

    java
    boolean execute(String sql);
  • 可以执行DML(insert、update、dalete)语句、DDL(create、alter、drop)语句的方法。

    其返回值代表的是影响的行数,可以通过这个影响的行数来判断DML语句是否执行成功 ,返回值 >0 则执行成功,反之,则执行失败:

    java
    int executeUpdate(String sql);
  • 可以执行DQL语句(select)语句的方法。

    java
    ResultSet executQuery(String sql);

ResultSet:结果集对象,封装查询结果 ​

  • 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true:

    java
    boolean next();
  • 获取数据:

    java
    getXxx(参数)
    • Xxx:代表数据类型 如:int getInt(),String getString()
    • 参数:
      1. int: 代表表中列的编号,从 1 开始 如:getString(1)
      2. String: 代表列名称, 如:getDouble("balance")
  • 使用步骤:

    1. 游标向下移动一行
    2. 判断是否有数据
    3. 获取数据

PreparedStatement:执行 sql 的对象 ​

PreparedStatement 是 Statement的子接口,但功能更加强大

sql 注入的问题 ​

在拼接sql时,有一些sql特殊关键字参与字符串的拼接,会造成安全问题!

随便输入用户,输入密码:a' or 'a' = 'a 即可实现成功登录:

sql
select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'; 
-- password将永远为true

解决 sql 注入的问题:使用 PreparaedStatement 对象 ​

  1. 预编译SQL:参数使用 ? 作为占位符

  2. 步骤:

  3. 导入jar包 mysql-connector-java-5.1.37-bin.jar

  4. 注册驱动

  5. 获取数据库连接对象 Connection

  6. 定义sql:

    注意:sql的参数使用 ? 作为占位符。如:

sql
select * from user where username = ? and password = ?;
  1. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)

  2. 给 ? 赋值,需要两个参数:

java
setXxx(参数1,参数2);

参数1:? 的位置编号,从1开始计数

参数2:? 的值

  1. 执行sql,接受返回结果,不需要传递sql语句。

  2. 处理结果

  3. 释放资源

一般我们都会使用 PreparedStatement 来完成增删改查的所有操作,因为这样可以防止SQL注入,而且效率更高。