数据库实现了数据的持久化,但我们最终要在程序里处理数但我们最终要在程序里处理数据啊,那java代码中怎么去访问数据库读写数据呢?
这就要用到sun公司设定的一套数据库标准了,这套标准就是JDBC(Java Database Connectivity)。但它只是规范,不做具体实现。于是数据库厂商又根据JDBC标准,实现自家的驱动Driver。如:mysql驱动com.mysql.cj.jdbc.Driver,Oracle的驱动oracle.jdbc.OracleDriver。有了这套解决方案,java就可以对数据库进行操作了。
Java中提倡面向接口开发,而最经典的接口设计莫过于JDBC数据库接口。
Connection链接、Statement语句、PreparedStatement预处理语句、CallableStatement存储过程、ResultSet结果集。
调用方式有三种:
推荐使用第二种PreparedStatement,防止SQL注入,其也是预编译性能高。
mysql官网地址:https://www.mysql.com
jdbc下载地址:https://dev.mysql.com/downloads/connector/j/
解压JDBC压缩包,放在项目的lib(自己创建)文件夹下
解压后文件中的jar包添加到依赖中
import java.sql.*;
public class TestJDBC {
public static void main(String[] args)
throws ClassNotFoundException, SQLException {
//通过java访问mysql数据库
//这个对象获取数据库链接
//注册驱动,输入链接地址,用户名,密码
String driver = "com.mysql.cj.jdbc.Driver";
//访问本机的mysql数据库,格式 jdbc:数据库://本地端口3306/数据库名?跨时区参数
String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
Class.forName(driver);
//获取到数据库链接
Connection connection = DriverManager.getConnection(url, username, password);
//创建一个Statement语句对象
Statement stat = connection.createStatement();
//执行SQL语句
String sql = "select * from student";
//把查询的结果(表记录)存放到ResultSet对象中,结果集
ResultSet resultSet = stat.executeQuery(sql);
}
}
mysql 8.0(oracle)把驱动包路径改了 驱动包(driver)地址:
8.0 之前。com.mysql.jdbc.Driver
8.0 之后。com.mysql.cj.jdbc.Driver
核心代码也改了,在数据库后面增加参数
时区参数:"?serverTimezone=Asia/Shanghai"
可以通过对象DriverManager
或者DataSource
中的getConnection()
方法拿到Connection
对象,获取到数据库链接。
创建方式:
Connection connection = DriverManager.getConnection(url,user,pass);
Connection connection = DataSource.getConnection();
JDBC1.0使用DriverManager类来产生一个对数据源的连接,相对于DriverManager,
JDBC2.0提供的DataSource接口是一个更好的连接数据源的方法。无需硬性编码驱动,对连接池的支持
静态执行对象创建createStatement
Statement createStatement()
创建一个 Statement 对象来将 SQL 语句发送到数据库。
-
Statement createStatement(int resultSetType, int resultSetConcurrency)
创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
-
Statement createStatement(int resultSetType, int resultSetConcurrency, int
resultSetHoldability)
创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
动态执行对象创建prepareStatement
PreparedStatement prepareStatement(String sql)
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
-
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。
-
PreparedStatement prepareStatement(String sql, int[] columnIndexes)
创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
-
PreparedStatement prepareStatement(String sql, String[] columnNames)
创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
-
PreparedStatement prepareStatement(String sql, int resultSetType, int
resultSetConcurrency)
创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
-
PreparedStatement prepareStatement(String sql, int resultSetType, int
resultSetConcurrency, int resultSetHoldability)
创建一个 PreparedStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
Statement对象常用方法:
方法 | 内容 |
---|---|
executeQuery(String sql) | 用于向数据发送查询语句。 |
executeUpdate(String sql) | 用于向数据库发送insert、update或delete语句 |
execute(String sql) | 用于向数据库发送任意sql语句 |
addBatch(String sql) | 把多条sql语句放到一个批处理中。 |
executeBatch() | 向数据库发送一批sql语句执行。 |
Jdbc中的ResultSet封装了Sql语句的执行结果集。Resultset封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的指针。初始的时候,索引值是从1开始(数据库要求)指针指向第一个数据。调用ResultSet.next() 方法,使指针指向下一个数据,可以判断下个数据是否为空,或者可以调用getObject(int index)、getString(int index)等方法来获取指向的数据。
ResultSet提供了对结果集进行指针的方法:
方法 | 内容 |
---|---|
next() | 移动到下一行 |
Previous() | 移动到前一行 |
absolute(int row) | 移动到指定行 |
beforeFirst() | 移动resultSet的最前面。 |
afterLast() | 移动到resultSet的最后面。 |
ResultSet封装的数据通过get方法取出:
方法 | 内容 |
---|---|
getObject(int index) | 通过下标获取任意类型的数据 |
getObject(string columnName) | 通过列名获取任意类型的数据 |
getString(int index) | 通过下标获取指定类型的数据 |
getString(String columnName) | 通过列名获取指定类型的数据 |
支持事务的数据库一般都有自动提交,提交、回滚、保存点、事务隔离级别这几个基本属性。
boolean getAutoCommit()
获取此 Connection 对象的当前自动提交模式。
void commit()
使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。
void rollback()
取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。
void rollback(Savepoint savepoint)
取消所有设置给定 Savepoint 对象之后进行的更改。
void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。
void setTransactionIsolation(int level)
试图将此 Connection 对象的事务隔离级别更改为给定的级别。
int getTransactionIsolation()
获取此 Connection 对象的当前事务隔离级别。
Savepoint setSavepoint()
在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。
Savepoint setSavepoint(String name)
在当前事务中创建一个具有给定名称的保存点,并返回表示它的新 Savepoint 对象。
void releaseSavepoint(Savepoint savepoint)
从当前事务中移除指定的 Savepoint 和后续 Savepoint 对象。
Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。后创建的对象先关闭,先关闭Statement对象再关闭Connection对象。