一文搞定JDBC!

151 阅读4分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍JDBC的基本概念和使用,以及JDBCUtils的基本范例。

JDBC

  1. JDBC的基本概念

JDBC(Java DataBase Connectivity) 实际上是一套操作所有关系型数据库的规则,即接口。各个数据库厂商提供对应的数据库驱动jar包来提供接口的实现类实现具体操作。

  1. JDBC的基本使用流程

    1. 导入对应的数据库驱动jar包。
    2. 注册驱动。
    3. 获取数据库连接对象Connection。
    4. 定义sql语句。
    5. 获取执行sql语句的对象Statement。
    6. 执行sql语句,接收返回结果。
    7. 处理返回结果。
    8. 释放资源。

使用JDBC要先学习以下几个类。

1. DriverManager

DriverManager类的功能:

  1. 注册驱动。

    1. Class.forName("com.mysql.cj.jdbc.Driver");
    2. DriverManager.registerDriver(new Driver());
    

实际上两者没有什么区别,前者实际上调用了后者(调用代码如下),mysql5之后可以省略注册驱动的步骤。

static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
 }
  1. 获取数据库连接。
public static Connection getConnection(String url,String user, String password)
    
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?serverTimezone=Asia/Shanghai&useSSL=false", "root", "123456");

参数解释:

  • url:指定连接的路径。

    eg:"jdbc:mysql://localhost(ip地址):3306(端口号)/db_test(数据库名称)?serverTimezone=Asia/Shanghai(设置时区)&useSSL=false(不使用SSL)"

  • user:数据库用户名。

  • password:用户密码。

2. Connection

Connection类的功能:

  1. 获取执行sql语句的对象

    Statement statement = connection.createStatement();
    
  2. 管理事务

    1. 开启事务 setAutoCommit(boolean autoCommit),参数为false则为开启事务。

    2. 提交事务 commit()

    3. 回滚事务 rollback()

3. Statement

Statement类的功能:

执行sql语句

boolean execute(String sql) 
        执行给定的SQL语句,这可能会返回多个结果。  
int executeUpdate(String sql) 
        执行给定的SQL语句,这可能是 INSERTUPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。 返回值是影响的行数。
ResultSet executeQuery(String sql) 
        执行给定的SQL语句,该语句返回单个 ResultSet对象。

4. ResultSet

保存数据库的查询结果表。

ResultSet对象保持一个游标指向其当前的数据行。 最初,游标标位于第一行之前,即表头行。使用next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。

boolean next() 
        将光标从当前位置向前移动一行。  
boolean first() 
        将光标移动到此 ResultSet对象中的第一行。

获取每一列数据,根据列的数据类型使用相对应get方法。

boolean getBoolean(int columnIndex) 
        检索当前行中指定列的值 ,当前列是boolean类型。编号从1开始。
boolean getBoolean(String columnLabel) 
        检索当前行中指定列的值 当前列是boolean类型。  

遍历resultSet。

【实例展示】

resultSet = statement.executeQuery(sql);
while(resultSet.next()){
    int id = resultSet.getInt(1);
    String name = resultSet.getString("name");
    System.out.println(id +"----"+name);
}
//最后关闭资源
if(resultSet!=null){
    try {
        resultSet.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

5. JDBCUtils工具类

import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Objects;
import java.util.Properties;
​
public class JdbcUtils {
    private static String url;
    private static String user;
    private static String password;
​
    /*
      读取资源文件
     */
    static{
        //创建Properties集合
        Properties properties = new Properties();
        try {
            String path = Objects.requireNonNull(JdbcUtils.class.getClassLoader().getResource("jdbc.properties")).getPath();
            //加载文件
            properties.load(new FileReader(path));
            //获取数据
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            String driver = properties.getProperty("driver");
            Class.forName(driver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
    /**
     * 数据库连接
     * @return 返回数据库连接对象
     * @throws SQLException 抛出sql异常
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }
​
    /**
     * 释放资源
     * @param statement 执行sql语句的对象
     * @param connection 数据库连接对象
     */
    public static void close(Statement statement, Connection connection){
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
​
    /**
     * 释放资源
     * @param resultSet 数据库结果集
     * @param statement 执行sql语句的对象
     * @param connection 数据库连接对象
     */
    public static void close(ResultSet resultSet, Statement statement, Connection connection){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        close(statement, connection);
    }
}

jdbc.properties

url=jdbc:mysql://localhost:3306/db_test?serverTimezone=Asia/Shanghai&useSSL=false
user=root
password=123456
driver=com.mysql.cj.jdbc.Driver

6. PreparedStatement

PreparedStatement是Statement的子接口,能有更安全的sql,有效的防止sql注入,并且效率更高,实际开发中常使用此接口。 ​

在原sql语句中,使用?占位符来代替实际参数。 String sql = "select * from user where username = ? and password= password(?)";

【实例展示】

preparedStatement = connection.prepareStatement(sql);
//给占位符赋值,第一个参数代表占位符位置,第二个参数代表占位符的值。
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//和Statement的sql执行语句不同的是,不需要再使用参数。
resultSet = preparedStatement.executeQuery();    

7. 使用JDBC操控事务

使用Connection对象来管理事务。

  1. 开启事务 connection.setAutoCommit(boolean auotCommit):设置参数为false,即为开启事务,在进行sql语句执行之前调用。
  2. 提交事务 connection.commit(),在执行完所有的sql语句后调用。
  3. 回滚事务 rollback(),在catch中调用。

小结

以上就是关于JDBC的一些基本概念和基本使用,以及JDBCUtils的小范例,希望对读者有所帮助,如有不正之处,欢迎留言指正。