JDBC
概述
概念
-
Java 数据库连接,全称 Java DataBase Connectivity ,简称 JDBC ,是 Sun 公司定义的操作关系型数据库的一套 API 。要通过 Java 语言操作关系型数据库中的数据,就要使用相应数据库厂商的 JDBC 驱动( JDBC 接口实现类 ),自己则是面向接口编程。
-
使用 JDBC 的好处:
- 各数据库厂商使用相同的接口,Java 代码不需要针对不同数据库分别开发;
- 可随时替换底层数据库,访问数据库的 Java 代码基本不变。
基本步骤
-
将驱动 jar 包导入工程中,在代码中注册驱动:
Class.forName("com.mysql.jdbc.Driver"); // 以 MySQL 为例
之所以这样能注册驱动(就是把实现类对象加到集合里),是因为
com.mysql.jdbc.Driver
中在静态代码块中写了注册驱动的程序,因此只要用反射将它加载一下,就会自动执行其静态代码块中的内容,也就是自动注册了驱动:static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
-
获得与数据库的一个连接对象(
Connection
):Connection conn = DriverManager.getConnection(url, username, password);
-
获得 SQL 语句执行对象(
Statement
):Statement stmt = conn.createStatement();
-
执行 SQL 语句:
stmt.executeUpdate(sql); // String sql = "update..." ;
-
处理返回结果:
...
-
释放资源:
stmt.close(); conn.close();
常用 API
DriverManager 类
-
数据库驱动管理器
DriverManager
的常用作用:-
注册驱动;
-
建立与数据库的连接。
-
-
常用方法:
方法名 说明 static void registerDriver(Driver driver) 注册驱动 static Connection getConnection(String url, String user, String password) 建立一个连接,并返回该连接对象 -
其中
Driver
接口的完整名为java.sql.Driver
,是所有数据库驱动类必须实现的接口。 -
MySQL 5 之后的驱动包,可以省略注册驱动的步骤,会自动加载 jar 包中
META-INF/services/java.sql.Driver
文件中的驱动类。 -
url 的语法格式:(以 MySQL 为例)
jdbc:mysql://ip地址(或域名):端口号/数据库名称?参数键值对1&参数键值对2…
-
Connection 接口
-
数据库连接对象
Connection
的作用:-
获取执行 SQL 的对象;
-
事务管理。
-
-
常用方法:
方法名 说明 Statement createStatement() 返回一个能发送普通非预编译 SQL 到数据库执行的对象 PreparedStatement prepareStatement(String sql) 返回一个能发送预编译 SQL 到数据库进行预编译机制执行的对象 void setAutoCommit(boolean autoCommit) 设置此连接的事务自动提交模式为给定的状态,true 自动 | false 手动 void commit() 使上次提交或回滚以来所做的所有更改持久化,
并释放此连接对象持有的所有数据库锁void rollback() 撤销当前事务中所有的更改,并释放此连接对象持有的所有数据库锁 void close() 关闭资源 其中,使用事务的一般模式是:
try { conn.setAutoCommit(false); // 开启事务 ... // 执行SQL,数据操作 conn.commit(); // 提交事务 } catch () { conn.rollback(); // 回滚事务 }
Statement 接口
-
普通 SQL 执行对象
Statement
用来执行普通的非预编译 SQL 语句。 -
常用方法:
方法名 说明 int executeUpdate(String sql) 执行 DML 或 DDL 语句,返回受影响的行数 ResultSet executeQuery(String sql) 执行 DQL 语句,返回结果集合 void close() 关闭资源
PreparedStatement 接口
-
预编译 SQL 执行对象
PreparedStatement
用来执行预编译 SQL 语句。首先要让 MySQL 开启预编译功能:在代码中编写 url 时需要加上以下参数:
useServerPrepStmts=true
-
常用方法:
方法名 说明 void setXxx(int paraIdx, xxx val) 给预编译 SQL 中的占位符 ?
赋值:xxx
代表某数据库数据类型,paraIdx
为位置编号(从 1 开始),val
为值int executeUpdate() 执行 DML 或 DDL 语句,返回受影响的行数 ResultSet executeQuery() 执行 DQL 语句,返回结果集合 其中,调用 “” 方法时,不需要再传递 SQL 语句(因为获取 SQL 语句执行对象时就已经让数据库对该 SQL 语句进行过预编译了)。
ResultSet 接口
-
结果集合对象
ResultSet
用于封装 SQL 查询语句的结果。 -
常用方法:
用于从
ResultSet
对象中获取我们想要的数据。方法名 说明 boolean next() 将游标向后移动一行,再判断所指向的行是否为有效行(有数据)(起始:第一行的前一行) xxx getXxx(String columnLabel) xxx
代表某数据库数据类型,columnLabel
为列名xxx getXxx(int columnIndex) xxx
代表某数据库数据类型,columnIndex
为列的序号(从 1 开始)void close() 关闭资源
DataSource 接口
数据库连接池
-
概念与作用
-
数据库连接池是个容器,负责分配、管理数据库连接(
Connection
)对象。 -
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
-
它会释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
-
-
原理:
连接池是在一开始就创建好了一些连接对象存储起来。用户需要连接数据库时,不需要自己创建连接,而只需要从连接池中获取一个连接进行使用,使用完毕后再将连接对象归还给连接池。这样就可以起到资源重用,也节省了频繁创建连接销毁连接所花费的时间,从而提升了系统响应的速度。
-
常用 API :
方法名 说明 Connection getConnection() 从数据库连接池中获取一个连接对象
Druid
-
常见的数据库连接池有 DBCP 、C3P0 、Druid 等,此处以 Druid(德鲁伊)为例。
-
使用步骤:
-
导入 jar 包,配置依赖。
-
定义配置文件
druid.properties
:driverClassName=数据库驱动类全名 url=jdbc:mysql:地址:端口/数据库名?参数键值对 username=用户名 password=密码 # 初始化连接数量 initialSize=数字 # 最大连接数 maxActive=数字 # 最大等待时间 maxWait=数字(毫秒为单位)
-
加载配置文件:
Properties prop = new Properties(); prop.load(new FileInputStream(配置文件 druid.properties 的路径字符串));
-
获取数据库连接池对象:
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
-
从数据库连接池获取数据库连接:
Connection connection = dataSource.getConnection();
-