掘金 后端 ( ) • 2022-01-26 15:41

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

JDBC我想只要是Java程序员都知道,jdbc 是访问数据库的统一接口框架。今天就来聊聊这么个东西。

1、jdbc是啥

先看下百度百科的解释:

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

通俗解释下来龙去脉,jdbc 是Java语言为了屏蔽具体的具体的数据库操作的细节不同提供的一个框架。

对于关系型数据库的访问是有固定套路的,虽然每家的实现不同,细节不同,但是在大的流程上是一样的。

访问数据库的最初的步骤是:和数据库建立连接 --> 执行sql --> 返回结果 --> 读取结果。

为了统一,Java官方就增加了对流程做了规范,增加了一步加载驱动,也就是加载不同的实现。

image.png

2、JDBC的核心类

1.加载驱动Driver

驱动由数据库厂家提供,所以我们可以看到一般在数据库连接的时候就像下面这样。常用的mysql 和 Oracle 如:

加载MySql驱动:Class.forName("com.mysql.jdbc.Driver");

加载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

2.Connection连接

image.png   Connection是Java程序和数据库系统建立的连接,可以理解为打通电话了,基于安全的考虑,在拨打电话的时候需要提供用户名和密码,如果不对的话对方可是拒绝接通电话,

连接MySql数据库:

Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

连接Oracle数据库:

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

3.Statement语句

用于执行静态SQL语句并返回它所生成结果的对象。

三种Statement类:

  • Statement:由createStatement创建,可以直接发送sql 语句。

  • PreparedStatement :继承自Statement接口,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,做了一些参数的检查和设置,也是最常用的。

  • CallableStatement:继承自PreparedStatement接口,用于调用存储过程。   常用Statement方法:

  • execute(String sql):运行语句,返回是否有结果集

  • executeQuery(String sql):运行select语句,返回ResultSet结果集。

  • executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。

  • addBatch(String sql) :把多条sql语句放到一个批处理中。

  • executeBatch():向数据库发送一批sql语句执行。

4.ResultSet结果集

ResultSet从名字可以看出主要是表示查询的返回结果,读取数据的一些常用的方法有,一种是根据索引,一种是根据列名:

getString(int index)、getString(String columnName):读取varchar、char等类型的数据对象。

getFloat(int index)、getFloat(String columnName):读取Float类型的数据对象。

getDate(int index)、getDate(String columnName):读取Date类型的数据。

getBoolean(int index)、getBoolean(String columnName):读取Boolean类型的数据。

getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

ResultSet还提供了对结果集进行滚动的方法:

next():移动到下一行

Previous():移动到前一行

absolute(int row):移动到指定行

beforeFirst():移动resultSet的最前面。

afterLast() :移动到resultSet的最后面。

3、使用步骤

加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet

完整代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
 
public class DbUtil {
 
    public static final String URL = "jdbc:mysql://localhost:3306/gamedb";
    public static final String USER = "root";
    public static final String PASSWORD = "root";
 
    public static void main(String[] args) throws Exception {
        //1.加载mysql驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
        //3.操作数据库,实现增删改查
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM player");
        //如果有数据,rs.next()返回true
        while(rs.next()){
            System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
        }
    }
}

4、事务

Connection与事务有关的三个方法:

  • setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了; con.setAutoCommit(false) 表示开启事务。
  • commit():提交结束事务。
  • rollback():回滚结束事务。
try{
     con.setAutoCommit(false);//开启事务
     ......
     con.commit();//try的最后提交事务      
} catch() {
    con.rollback();//回滚事务
}

事务并发导致的问题。 脏读:读到另一个事务的未提交新数据,即读取到了脏数据; 不可重复读:对同一记录的两次读取不一致,因为另一事务对该记录做了修改; 幻读:对同一张表的两次查询不一致,因为另一事务插入了一条记录。 JDBC设置 隔离级别

con.setTransactionIsolation(int level) :参数可选值如下:

Connection.TRANSACTION_READ_UNCOMMITTED;
Connection.TRANSACTION_READ_COMMITTED;
Connection.TRANSACTION_REPEATABLE_READ;
Connection.TRANSACTION_READ_SERIALIZABLE。

总结

JDBC的重要性不言而喻,是整个Java的访问数据库的最底层的技术,不管新技术多么花哨,最终落实到数据库还是得用jdbc,知道了底层逻辑一切都是花架子。

点赞,点赞,点赞