JDBC即Java DataBase Connectivity,是SUN公司为了使JAVA程序灵活的访问各种不同的关系型数据库而提供的规则。使用JDBC能够降低JAVA操作数据库的难度和复杂度,并且使得JAVA程序能够灵活的进行移植。JDBC的体系结构如下图所示。
JDBC是一个标准的数据访问接口,能够访问各种不同的关系型数据库,它是一套类和接口,是Java的一部分。通过JDBC可以屏蔽下层不同的数据库具体实现。使得下层的各种数据库操作均统一映射到JDBC中,从而增强项目的可移植性。
JDBC为java语言提供了一个调用级接口,主要完成3个方面的功能:建立与数据库的连接;向数据库发送SQL语句;处理数据库的返回结果。JDBC API调用流程关系如下图所示。
首先通过一段代码简单说明JDBC API的使用:
//1.注册数据库驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());//这种方式不好!
//Class.forName("com.mysql.jdbc.Driver");//通常使用这行代码
//2.取得与mysql数据库连接的桥梁,注意导入的是java.sql.Connection;
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/academic", "root", "1234");
//测试是否取得连接
System.out.println(conn!=null?"Success":"Fail");
//3.创建封装sql命令的对象
String sql = "select * from author";
Statement stmt = conn.createStatement();//导入java.sql.Statement
//4.执行sql命令,并返回符合条件的记录集合
ResultSet rs = stmt.executeQuery(sql);
//5.处理结果集合
while(rs.next()){
Object obj = rs.getObject("author_name"); //指定列名
Object obj1 = rs.getObject("author_email");
System.out.println(obj+" | "+obj1);
}
//6.依次关闭所用过的连接对象,最先开的最后关闭
rs.close();
stmt.close();
conn.close();
下面介绍主要一些类的功能:
DriverManager类:驱动管理器 -- see detail in Java API
--- 务必要注册驱动
该类主要用来处理驱动程序的加载,建立和管理应用程序与驱动程序之间的连接。
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
com.mysql.jdbc.Driver --implements-- java.sql.Driver 接口
底层的具体实现过程如下:
首先 boolean acceptsURL(String url)
//查询驱动程序是否认为它可以打开到给定 URL 的连接
然后 Connection connect(String url, Properties info)
//试图创建一个到给定 URL 的数据库连接
注意:上述代码会向DriverManager注册二次相同的MySQL驱动,其中一次在Driver实现类中
***项目中推荐使用以下代码间接注册数据库驱动:
Class.forName("com.mysql.jdbc.Driver");//替换上面代码中的第一个步骤!!!
优点:
a)只注册一次
b)无需导入与具体数据库驱动相关的包
数据库URL
用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库
jdbc:mysql:[]://localhost:3306/test
协议:子协议:主机:端口:数据库
本地数据库可简写为 jdbc:mysql:///test
Connection接口
表示数据库的链接,是数据库编程中最重要的一个对象
客户端与数据库所有交互都是通过connection对象完成的
常用方法:
createStatement():创建向数据库发送sql的statement对象
prepareStatement():创建向数据库发送预编译的sql的prepareStatement对象
Statement接口
用于向数据库发送sql语句
executeQuery(String sql):只能向数据库发送select语句
executeUpdate(String sql):只能向数据库发送insert,update,delete语句
ResultSet接口
用于代表sql语句的执行结果。封装的结果类似于表格的形式。通过游标指向下一行。
获取任意类型的数据
getObject(int indext); //列号,不提倡使用
getObject(string columnName); //建议使用列名,mysql中大小写不敏感,string中大小写无所谓
getObject("NAME") ==== getObject("name")
获取指定类型的数据
etString(int index);
getString(String columnName);
流的关闭:先开的后关 即按 rs -> stmt -> conn 顺序关闭流
创建任何一个JDBC应用程序,都需要遵守以下6个步骤:
1.加载一个JDBC驱动程序
2.建立与数据库的连接对象
3.建立一个语句对象
4.执行SQL语句
5.处理结果集
6.关闭所有JDBC对象
显然,这种操作异常的繁琐,每次执行sql语句都需要编写大量重复的代码。因此可以通过将公用的代码抽出来组成工具类的形式来简化数据库操作。这里演示一个简化版的JDBC工具类,代码如下:
公用参数抽出来组成一个db.properties文件,这样便于修改可能出现的变动
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/academic
user = root
pwd =1234
JDBC工具类代码:
//JDBC工具类:关闭流和取得连接,使用了final
public final class JdbcUtil {
private static String driver;
private static String url;
private static String user;
private static String password;
//静态块:加载文件
static{
Properties props = new Properties();
InputStream is = Demo3.class.getClassLoader().getResourceAsStream("cn/myseu/web/jdbc/db.properties");
try {
props.load(is);
} catch (Exception e) {
e.printStackTrace();
}
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
}
//静态块:注册驱动
static{
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//取得连接
public static Connection getMySqlConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url,user,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//关闭连接
public static void close(ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void close(Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这样,但在此访问数据库时,我们可以将代码简化为:
public class Demo3 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "select * from user";
try {
conn= JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
}