jdbc—JDBC 常用接口介绍
jdbc—JDBC 常用接口介绍
1.什么是 JDBC
-1.JDBC(Java Database Connection)为 Java 开发者使用数据库提供了统一的编程接口,它由一组 Java 类和接口组成。是 Java 程序与数据库通信的标准 API。
JDBC API 使得开发人员可以使用纯 Java 的方式来连接数 据库,并执行操作。
-2.sun 公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此,sun 公司自己提供了一套 API,只要数据库想要和 Java 连接的,
数据库厂商必须自己实现 JDBC 这套接口。而数据库厂商的 JDBC 实现,我们就叫它此数据库的驱动。
2.JDBC 访问数据库流程
1. 加载 JDBC 驱动程序
2. 建立与数据库的连接
3. 发送 SQL 语句
4. 得到 SQL 执行结果
3.Java 程序和数据库连接的时候,其实就是 Socket 连接。
4.JDBC 常用接口
Driver 接口
- Driver 接口由数据库厂家提供,对于 Java 开发者而言,只需要使用 Driver 接口就可以了。
- 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。
- 驱动:就是各个厂商实现 Sun 公司提出的 JDBC 接口。即对 Connection 等接口的实现类的 jar 文件。
- 装载 mysql 驱动:Class.forName("com.mysql.jdbc.Driver");
- 装载 oracle 驱动:Class.forName("com.jdbc.driver.OracleDriver");
DriverManager 接口
- DriverManager 接口是 JDBC 的管理层,作用于用户和驱动程序之间。
- DriverManager 跟踪可用的驱动程序,并在数据库和相应的驱动之间建立连接。
Connection 接口
- Connection 与特定数据库的连接 (会话),在连接上下文中执行 SQL 语句并返回结果。
- DriverManager 的 getConnection() 方法建立在 JDBC URL 中定义的数据库 Connection 连接上
-Mysql
Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
-Oracle
Connection con = DriverManager.getConnection("jdbc:oracle:thin@host:port/database", "user", "password");
Statement 接口
- 用于执行静态 SQL 语句并返回它所生成结果的对象。
- 三种 Statement 类:
- Statement:
由 createStatement 创建,用于发送简单的 SQL 语句(不带参数)
- PreparedStatement:
- 继承自 Statement 接口,有 preparedStatement 创建,用于发送含有一个或者多个输入参数的 SQL 语句。PreparedStatement 对象
比 Statement 对象效率更高,并且是防止 SQL 注入。我们一般都使用 PreparedStatement。
- CallableStatement:
- 继承自 preparedStatement。由方法 prePareCall 创建,用于调用存储过程。
- 常用的 Statement 方法
- execute():运行语句,返回是否有结果集。
- executeQuery():运行 select 语句,返回 ResultSet 结果节
- executeUpdate():运行 insert/update/delete 操作,返回更新的行数。
- 例子:
[
](javascript:void(0)😉
package com.yf.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试执行SQL语句和SQL注入问题
* @author yangf
*
*/
public class Demo02 {
public static void main(String[] args) {
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得connection对象 建立与数据库连接
/*
* 连接对象内部其实包含了Socket对象,是一个远程连接。比较耗时!这是Connection对象管理的一个要点。
* 后面通过连接池来做
*/
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
Statement stmt = con.createStatement();
String sql = "insert into t_user (username,pwd,regTime) values ('yyy',123123,now())";
stmt.execute(sql);
String sql1 = "delete from t_user where id = 4";
stmt.execute(sql1);
// 测试SQL注入
// 由于是外部传入参数,所以可以任意修改DB,造成SQL注入,所以我们不适用Statement
String id = "5 or 1 = 1";
String sql2 = "delete from t_user where id = " + id;
stmt.execute(sql2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
[
](javascript:void(0)😉
[
](javascript:void(0)😉
package com.yf.jdbc.test;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 测试PreparedStatement的基本用法
* @author yangf
*
*/
public class Demo03 {
public static void main(String[] args) {
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得connection对象 建立与数据库连接
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
String sql = "insert into t_user (username,pwd,regTime) values (?,?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "yangf");
ps.setInt(2, 888888);
ps.setDate(3, new Date(System.currentTimeMillis()));
ps.execute();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
[
](javascript:void(0)😉
ResultSet 接口
- Statement 执行 SQL 语句时返回 Result 结果集。
- ResultSet 提供的检索不同类型字段的方法,常用的有:
- getString():获得在数据库里是 varchar,char 等数据类型的对象。
- getFloat():获得数据库里是 Float 类型的对象
- getDate():获得数据库里是 Date 类型的对象
- getBoolean():获得数据库里是 Boolean 类型的数据
- 依序关闭使用的对象和连接
Result->Statement->Connection
[
](javascript:void(0)😉
/**
* 测试ResultSet的用法
* @author ibm
*
*/
public class Demo04 {
public static void main(String[] args) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得connection对象 建立与数据库连接
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
String sql = "select * from t_user where id > ?";
ps = con.prepareStatement(sql);
ps.setInt(1, 2);
// 内部就是个迭代器
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + "--" + rs.getString(2) + "--" + rs.getInt(3) + "--" + rs.getDate(4));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
[
](javascript:void(0)😉
批处理
- batch
- 对于大量的批处理,建议使用 Statement,因为 PreparedStatement 的预编译空间有限,数据量特别大时,会发生异常。
[
](javascript:void(0)😉
package com.yf.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试批处理
* @author yangf
*
*/
public class Demo05 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得connection对象 建立与数据库连接
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
// jdbc中事物是自动提交的,我们设为手动提交
con.setAutoCommit(false);
long start = System.currentTimeMillis();
stmt = con.createStatement();
for (int i = 0; i < 20000; i++) {
stmt.addBatch("insert into t_user (username,pwd,regTime) values ('yangf "+ i + "', 6666 , now())");
}
stmt.executeBatch();
con.commit();
long end = System.currentTimeMillis();
System.out.println("插入20000万条数据耗时:" + (end - start) + "毫秒");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
[
](javascript:void(0)😉

浙公网安备 33010602011771号