1、JDBC(Java DataBase Connectivity)概述
Sun公司推出的java访问数据库标准规范(接口)。
(1)、JDBC是一种用于执行SQL语句的java API
(2)、JDBC可以为多种关系数据库提供统一访问入口。
(3)、JDBC有一组java工具类和接口组成。
2、JDBC原理
JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!
3、JDBC开发步骤
(1)、注册驱动
(2)、获得连接
(3)、获得语句执行者
(4)、执行SQL语句
(5)、处理结果集
(6)、释放资源
1)、注册驱动:
代码:Class.forName(“com.mysql.jdbc.Driver”);
步骤分析:
A)JDBC规范定义驱动接口:java.sql.Driver
mysql驱动包提供了实现类:com.mysql.jdbc.Driver
B)DriverManager工具类,提供注册驱动的方法registerDriver(),方法参数是java.sql.Driver,所以我们可以通过如下语句进行注册
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
但是不推荐用此方法注册,原因:
a、硬编码,以后不易于程序扩展和维护
b、驱动被注册两次
C)通常开发我们使用Class.forName()加载一个使用字符串描述的驱动类。
如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。
通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”讲自己进行了注册
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
.....
}
2)、获得连接:
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”root”);
获取连接需要方法DriverManager.getConnection(url,username,password),三个参数分别表示,
url需要连接数据库的位置(网址)、user用户名、 password密码
url比较复杂,下面试mysql的url:
jdbc:mysql://localhost:3306/mydb1
解释:
JDBC规定url格式有三个部分组成,每个部分中间使用逗号隔开。
第一部分是jdbc,这是固定的;
第二部分是数据库名称,那么连接mysql数据库,第二部分就是mysql了;
第三部分是有数据库厂商规定,我们需要了解每个数据库厂商的需求,mysql的第三个部分分别由数据库服务器的IP地址(localhost)、端口号(3306)、以及database名称(mysql)组成。
扩展:url参数
jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8
useUnicode参数:指定这个连接数据库的过程中,使用的字节集是Unicode字节集;
characterEncoding参数:指定java程序连接数据库的过程中,使用的字节集编码为UTF-8编码,注意:mysql中指定UTF-8编码是给出的是UTF8,而不是UTF-8。
3)、获得语句执行者:
Statement stmt = con.createStatement();
常用方法:
● 执行SQL语句:
■ Int executeUpdate(String sql);——执行insert、update、delete语句。(DML语句) 其实这个方法也可以执行create table、alter table,以及drop table等语句,但我们很 少会使用JDBC来执行这些语句;
■ ResultSet executeQuery(String sql)——执行select语句。(DQL语句)
■ Boolean execute(String sql)——执行select返回true,执行其他语句返回false
◆ 如果返回true,需要使用getTesultSet()获取查询结果
◆ 如果返回false,需要使用getUpdateCount()获得影响行数
● 执行批处理(可选)
■ AddBatch(String sql);
■ clearBatch();
■ executeBatch;
PreparedStatement pstmt = con.prepareStatement(sql);
常用方法同上,方法没有参数,用setXXX(int i,String obj)设置占位符的值,i值从一开始
4)、处理结果集
可以通过next()方法使ResultSet的游标向下移动,当游标移动到你需要的行时,就需要来获取该行的数据了,ResultSet提供了一系列的获取列数据的方法:
- String getString(int columnIndex):获取指定列的String类型数据;
- int getInt(int columnIndex):获取指定列的int类型数据;
- double getDouble(int columnIndex):获取指定列的double类型数据;
- boolean getBoolean(int columnIndex):获取指定列的boolean类型数据;
- Object getObject(int columnIndex):获取指定列的Object类型的数据。
上面方法中,参数columnIndex表示列的索引,列索引从1开始,而不是0,这第一点与数组不同。如果你清楚当前列的数据类型,那么可以使用getInt()之类的方法来获取,如果你不清楚列的类型,那么你应该使用getObject()方法来获取。
ResultSet还提供了一套通过列名称来获取列数据的方法:
- String getString(String columnName):获取名称为columnName的列的String数据;
- int getInt(String columnName):获取名称为columnName的列的int数据;
- double getDouble(String columnName):获取名称为columnName的列的double数据;
- boolean getBoolean(String columnName):获取名称为columnName的列的boolean数据;
- Object getObject(String columnName):获取名称为columnName的列的Object数据;
5)、释放资源:
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.colse();