JDBC简介

JDBC是使用Java操作关系型数据库的一套API。原则上来说只需要利用JDBC提供的接口就可以实现对所有关系数据库的操作,而不用修改Java代码,只需在替换底层数据库时替换对应数据库的驱动(jar包)即可。

下面是对JDBC中API的介绍。

API

这部分是对JDBC中的一些API的说明以及示例代码。

DriverManager类需要注意的是两个功能:一是注册驱动,二是获取连接。

首先是注册驱动:

1
2
3
4
5
6
7
8
9
10
11
// 使用以下代码注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

// 以下为Driver类源码中的一块静态代码块, 通过调用DriverManager的registerDriver方法来注册驱动
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}

MySQL 5之后的驱动包可以省略注册驱动的步骤

然后是获取连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
* 参数解释
* url:
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?键值对1&键值对2...
* 实例:jdbc:mysql://localhost:3306/db1
* 解释:如果连接的是本机的mysql服务器,并且mysql服务器默认端口是3306则url
* 可以简写为:jdbc:mysql:///数据库名称?参数键值对
* 配置useSSL = false 参数,禁用安全连接方式,解决警告提示
* user:用户名
* password:密码
*/
static Connection getConnection(String url, String username, String password)

Connection类(数据库连接对象)的主要作用是获取执行SQL语句的对象和管理实务。

获取执行SQL的对象:

1
2
3
4
5
6
7
8
// 普通执行SQL对象
Statement createStatement()

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

// 执行存储过程的对象
CallableStatement prepareCall(sql)

事务管理:

  • mysql事务管理:
    • 开启事务:BEGIN; / START TRANSACTION;
    • 提交事务:COMMIT;
    • 回滚事务:ROLLBACK;

mysql默认自动提交事务

  • JDBC事务管理:Connection接口中定义了三个对应的方法
    • 开启事务:setAutoCommit(boolean autoCommit):true为自动提交服务;false为手动提交服务,即开启事务
    • 提交事务:commit()
    • 回滚事务:rollback()

Statement类的作用就是执行SQL语句。

补充一下,SQL语句有如下3种:

  • DDL:对库和表进行增删改查的操作
  • DQL:对数据的查询操作
  • DML:对数据的增删改操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
*
* 描述:执行DML、DDL语句
* 返回值:1. DML语句影响的行数;2.DDL语句执行后,执行成功可能返回0
*
**/

int executeUpdate(sql)

/**
* 描述:执行DQL语句
* 返回值:ResultSet结果集对象
*
**/

ResultSet executeQuery(sql)

ResultSet结果对象集的作用是存储了DQL查询语句返回的查询结果的集合,该类封装了如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 描述:移动结果对象集的指针使之指向下一个结果并且返回一个boolean值。
* 返回值:false表示结果无效,true表示结果有效
**/
boolean next();

/**
* 描述:从当前结果行中获取param所在列的数据,xxx为数据类型(int,string...)
* 参数:param有两种取值:int or string,其中int从1开始
* 返回值:结果行中param对应列的值。
**/
xxx getXxx(param);

PreparedStatement继承自Statement对象,用于执行预编译的SQL语句,以达到预防SQL注入的问题。

PrepareStatement使用参照以下散布喵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// sql语句中的参数值使用占位符?替代
String sql = "select * from tableName where name = ? and password = ?";

// 获取PrepareStatement对象;
PrepareStatement pstmt = conn.prepareStatement(sql);

// 设置占位符所在的数据
/**
* 描述:为占位符所在的设置对应类型的参数
* 参数描述:param1表示?的位置(1,2,...);param2表示设置的参数的值;
*
**/
pstmt.setXXX(param1, param2);

// 执行SQL语句,根据语句类型二选一即可
ResultSet result = pstmt.excuteQuery();
int result = pstmt.excuteUpdate();

数据库连接池

数据库连接池是一个用来管理和分配数据库连接的容器。

在之前的编码中,我们每一次对数据库的操作都涉及对数据库的连接和释放连接的操作;事实上建立数据库连接需要消耗许多资源,为了减少资源消耗,提高效率,我们需要数据库连接池技术实现对数据库连接资源的管理和分配,其有着如下的好处:

  • 资源重用
  • 提高系统的响应速度
  • 避免数据库的连接遗漏

以下与数据库连接池相关的代码都是使用的阿里的Druid,算是性能最好的数据库连接池项目了。

API