JDBC - Java

Maven 依赖

https://mvnrepository.com/artifact/mysql/mysql-connector-java

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>

注册驱动(MySQL 8.0 跳过)

1
2
// MySQL 8.0 以上版本
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
1
2
3
4
5
6
// MySQL 8.0 以下版本
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";



Class.forName(JDBC_DRIVER); // 注册 JDBC 驱动

MySQL 8 以上可以不用注册

实测第一次运行还是得注册,最好加上

DriverManager类中有这样的注释:

1
2
3
* <P>Applications no longer need to explicitly load JDBC drivers using <code>Class.forName()</code>. Existing programs
* which currently load JDBC drivers using <code>Class.forName()</code> will continue to work without
* modification.

所以不用注册也能使用

JDBC4.0版本后,不用再显式注册驱动

连接数据库

1
2
3
4
5
static final String DB_URL = "jdbc:mysql://localhost:3306/DATABASE_NAME?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";

static final String DB_URL = "jdbc:mysql://localhost:3306/DATABASE_NAME";

// IP地址是本机 且端口是3306 可以省略书写: jdbc:mysql:///DATABASE_NAME

useSSL=false 禁用安全链接

打开链接:

1
2
3
4
static final String USER = "root";
static final String PASS = "123456";

connection = DriverManager.getConnection(DB_URL,USER,PASS);

执行

Statement stmt = connection.createStatement(); 获取执行sql的对象

int count = stmt.executeUpdate​(String sql) 返回受影响的行数

释放资源

1
2
statement.close();
connection.close();

Connection

获取执行对象:

Statement createStatement() 获取普通执行SQL对象

PreparedStatement prepareStatement(sql) 预编译SQL的SQL执行对象,防止SQL注入

CallableStatement prepareCall(sql) 执行存储过程的对象(存储过程 并不常用)

事务管理:

对MySQLD 一系列操作,完全执行和不执行,二选一

开启:

setAutoCommit(boolean autoCommit) 参数:true 自动提交;false 手动提交,即开启事务

提交COMMIT:

commit()

回滚ROLLBACK:

rollback()

Statement 执行语句

int executeUpdate(sql); DML DDL 语句(增删改)。
返回受影响的行数,DDL(Data Definition Language)语句执行成功也可能返回0

ResultSet executeQuery(sql); DQL 语句(查询)

ResultSet

封装DQL查询语句的结果

ResultSet 对象的可滚动性

Statement createStatement() 默认不可滚动

Statement createStatement(int rsType, int rsConcurrenty) throws SQLException

rsType参数,添加到ResultSet接口中指示其对象类型:
TYPE_FORWARD_ONLY:(默认)创建不可滚动的结果集
TYPE_SCROLL_INSENSITIVE:指定ResultSet游标能够在两个方向移动。
在处理ResultSet期间对ResultSet底层数据的改变不会反映在ResultSet中,除非程序再次查询数据库
TYPE_SCROLL_SENSITIVE:指定ResultSet游标能够在两个方向移动。
在处理ResultSet期间对ResultSet底层数据的改变会立即反映在ResultSet中

rsConcurrenty参数,用于指定结果集是只读的还是可更新的:
CONCUR_READ_ONLY (默认)指定不能更新ResultSet(即对ResultSet内容的更改不会通过ResultSet的更新方法反映在数据库中)
CONCUR_UPDATABLE 指定能够更新ResultSet(即对ResultSet内容的更改会通过ResultSet的更新方法反映在数据库中)

method

boolean next() 将光标从当前位置(默认在数据行的上一行)向下移动一行
返回 是否为有效行

xxx getXxx(int num, String name) 获取数据,参数是 列的编号(从1开始)、列的名称

last() 可滚动状态下,指针到最后一行

beforeFirst() 指针回到开始位置