「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」
JDBC我想只要是Java程序员都知道,jdbc 是访问数据库的统一接口框架。今天就来聊聊这么个东西。
1、jdbc是啥
先看下百度百科的解释:
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
通俗解释下来龙去脉,jdbc 是Java语言为了屏蔽具体的具体的数据库操作的细节不同提供的一个框架。
对于关系型数据库的访问是有固定套路的,虽然每家的实现不同,细节不同,但是在大的流程上是一样的。
访问数据库的最初的步骤是:和数据库建立连接 --> 执行sql --> 返回结果 --> 读取结果。
为了统一,Java官方就增加了对流程做了规范,增加了一步加载驱动,也就是加载不同的实现。
2、JDBC的核心类
1.加载驱动Driver
驱动由数据库厂家提供,所以我们可以看到一般在数据库连接的时候就像下面这样。常用的mysql 和 Oracle 如:
加载MySql驱动:Class.forName("com.mysql.jdbc.Driver");
加载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
2.Connection连接
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,知道了底层逻辑一切都是花架子。
点赞,点赞,点赞