JDBC
JDBC全称为java database connectivity,是sun公司指定的java数据库连接技术的简称。
他是sun公司和数据库开发商共同开发出来的独立于DBMS的应用程序接口,它为java程序员进行数据库编程提供了统一的API。
JDBC实际上有两组API,一组面向java应用程序开发人员,另一组是面向数据库驱动程序开发人员的,一般都是数据驱动程序开发人员利用后面一组API开发出供应程序开发人员使用的API。
核心的类和接口
我们需要熟悉包java.sql.*
中定义的类(class),接口(interface),例外(expection),并且能够灵活使用他们,就能够发挥出JDBC强大的功能。
java.sql.DriverManager
用来加载不同数据库厂商的JDBC驱动,并为创建新的数据库连接提供支持java.sql.Driver
指定数据库的驱动入口,DriverManager将通过该类作为连接数据的参数java.sql.Connection
完成针对某指定数据库的连接功能java.sql.Statement
在一个已经建立的连接中,作为SQL语句执行的容器,它有两个子类:java.sql.CallableStatement
用于执行数据库中已经创建好的存储过程。java.sql.preparedStatement
用于执行预编译的SQL语句。
java.sql.ResultSet
用于存储执行特定SQL语句后返回的结果集。
JDBC基本使用过程
如果是增删改, 可不使用ResultSet
-
加载驱动程序类(可省略, 推荐写上),这里加载mysql的jdbc驱动, 即初始化Driver中的静态代码块
class.forName("com.mysql.jdbc.Driver")
-
建立连接
connection conn = DriverManager.getConnection(url,"user","password");
-
通过这个连接连接sql语句执行的容器
Statement statement = conn.createStatement();
-
建立sql语句
String sql = "select * from table1";
-
利用前面的sql容器执行刚建立的sql语句,并把结构返回到结果集对象中。
ResultSet rs = statement.executeQuery(sql);
-
分析获取的查询结果
简单的查询案例
要查询的表 (user):
id (int 主键自增) | name (varchar) | money (double) |
---|---|---|
1 | tom | 5000 |
代码:
/**
* JDBC快速入门程序: 查询jt_db.account表中的所有数据
*/
public class TestJdbc02 {
@Test
public void testFindAll() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
// 1. 注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取数据库连接(导入java.sql.Connection 包)
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jt_db?characterEncoding=utf8",
"root",
"123456");
// 3. 获取传输器
stat = conn.createStatement();
// 4. 执行SQL, 返回结果
String sql = "select * from account";
rs = stat.executeQuery(sql);
// 5. 处理结果(打印到控制台)
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
double money = rs.getDouble("money");
System.out.print(id + ", " + name + ", " + money);
System.out.println();
}
System.out.println("TestJdbc.testFindAll");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6. 释放资源(原则: 越晚获取的越先关闭!)
if (rs != null) { // 如果rs为null, 则不需要关闭, 反之, 不必关闭对象
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
rs = null;
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
stat = null;
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
conn = null;
}
}
}
}
}
注意关闭顺序, 先后循序为: 关闭ResultSet
-> 关闭Statement
-> 关闭Connection
结果:
1, tom, 5000
JDBC工具类
为了简化开发, 我们可以提取一个JDBC的工具类, 方便获取Connection连接对象和关闭操作
代码如下:
/** JDBC工具类 */
public class JdbcUtil {
// 获取连接对象
public static Connection getConn() throws Exception{
Class.forName( "com.mysql.jdbc.Driver" );
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jt_db?characterEncoding=utf-8",
"root",
"123456");
return conn;
}
// 释放资源
public static void close(Connection conn,
Statement stat, ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
rs = null;
}
}
if(stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
stat = null;
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn = null;
}
}
}
}
新增
使用工具雷, 只写核心代码
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConn();
stat = conn.createStatement();
String sql = "insert into account value(null, 'join', 3500)";
int rows = stat.executeUpdate(sql);
System.out.println("影响行数: " + rows);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, stat, rs);
}
修改
Connection conn = null;
Statement stat = null;
try {
conn = JdbcUtil.getConn();
stat = conn.createStatement();
String sql = "update account set money=1500 where name = 'join'";
int rows = stat.executeUpdate(sql);
System.out.println("影响行数: " + rows);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, stat, null);
}
删除
Connection conn = null;
Statement stat = null;
try {
conn = JdbcUtil.getConn();
stat = conn.createStatement();
String sql = "delete from account where name = 'join'";
int rows = stat.executeUpdate(sql);
System.out.println("影响行数: " + rows);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, stat, null);
}