一、什么是JDBC
JDBC是Java语言连接数据库的接口规范。
二、JDBC的体系
1、Java官方提供一个操作数据库的抽象接口
抽象接口有很多的接口和抽象类。
例如:Driver、Connection、Statement。
2、各个数据库厂商提供各自的Java实现类
需要各自实现具体的细节。
例如:设计怎么和数据库服务器通信?如何传递SQL语句?如何传递执行结果?
三、JDBC官方常用接口
JDBC的接口所在的包是: java.sql.*
(一)加载驱动实现类
主要目的是指定程序当前要和哪一种数据库通信。
1、基础知识
驱动类的抽象类是:
java.sql.Driver。
MySQL厂商的实现类是:
com.mysql.jdbc.Driver
2、把含有实现类的jar包放入类路径
需要从那些数据库厂商的官网下载jar文件,放入项目的类路径下。
驱动jar文件名字类似"mysql-connection-java-xxx.jar"。
3、加载驱动实现类的方法
第一种:
调用java.sql.DriverManager类的下列方法
public static void registerDriver(Driver 驱动对象)
(以MySQL为案例):
// 构建驱动实现类的对象
Driver temp = new com.mysql.jdbc.Driver();
// 注册到驱动管理器中
DriverManager.registerDriver(temp);
第二种:
用类对象的反射加载。
调用Class类的下列静态方法:
public static Class forName("类的包名.类名")
(以MySQL为案例):
// 加载驱动类
Class.forName("com.mysql.jdbc.Driver")
(二)获得连接对象
Java程序和数据库通信,需要一个连接对象。
连接对象的类:
java.sql.Connection
如何获得连接对象:
1、准备三个信息:
连接的URL地址:描述数据库在哪台计算机上。
数据库账号名:代表用哪个账号连接。
账号的密码:用密码来验证当前程序是不是拥有账号的所有权。
2、调用DriverManager类的下列方法
public static Connection getConnection(
String 地址,
String 账号,
String 密码
)
MySQL的案例:
假设数据库路径是 "jdbc:mysql://127.0.0.1:6666",用户名是"root",密码是"123"。
Connection con = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:6666",
"root",
"123");
说明:
数据库的连接路径规则是
jdbc:数据库类型名字:数据库IP地址或者域名:端口[/默认数据库]
MySQL数据库的类型是"mysql"。
后面可以不接默认数据库。
案例:
// 假设在IP地址是192.168.4.121的计算机上,有一个监听在3306端口的MySQL服务器,它的连接路径如下:
jdbc:mysql://192.168.4.121:3306
连接对象的其他方法:
// 设置是否开启自动事务提交
void setAutoCommit(boolean 值)
// 设置保存点
Savepoint setSavePoint()
// 手动提交事务
void commit()
// 回滚事务
void rollback()
// 回滚到指定的保存点
void rollback(Savepoint 保存点)
(三)创建语句对象
语句对象是为了执行具体的SQL语句。
1、语句类的路径:
java.sql.Statement
2、如何获得语句对象:
调用Connection类型的对象的下列方法:
public Statement createStatement()
案例:
Statement state = con.createStatement();
3、主要的方法
1)用于执行一般的SQL语句:
// 执行SQL语句
boolean execute(String SQL语句)
返回值:
true : 结果是ResultSet结果集对象。
false : 结果是更新的行数,或者没有结果。
相关方法:
// 如果execute执行返回true,需要下列方法获取结果集:
ResultSet getResultSet()
// 如果execute执行返回false,需要下列方法获取更新的记录行数:
int getUpdateCount()
2)用于专门的查询
返回一个ResultSet结果集对象,适合select语句。
方法如下:
ResultSet executeQuery(String SQL语句)
案例:
// 查询user数据表的所有记录
ResultSet rs = state.executeQuery("select * from user");
3)专门的更新操作
返回本次更新的记录行数,适合insert、update、delete三种语句。
方法如下:
int executeUpdate(String SQL语句)
案例:
// 删除user数据表的id为255的记录
int count = state.executeUpdate("delete from user where id = '255' ");
// 打印删除的记录行数
System.out.println("本次执行删除记录个数:" + count);
(四)处理结果集
结果集是把查询的记录放到一个列表集合里,从上到下依次获取。
结果集类:
java.sql.ResultSet
主要方法:
1、跳转行记录
行号从1开始编号。
// 跳转到指定的行,成功返回true
boolean absolute(int 行号)
// 跳转到第一行,成功返回true
boolean first()
// 跳转到最后一行,成功返回true
boolean last()
// 跳转到前一行,成功返回true
boolean previous()
// 跳转到下一行,成功返回true
boolean next()
2、获得一行的字段值
JDBC为每种类型都提供了对应的get方法,方便匹配字段值的类型。
例如: getInt() getFloat() getDouble() getLong() getSring() getTime() getDate()。
第一种:用字段名获取
以获取String类型为例:
String getString(String 字段名)
获取字段名是id的值:
String value = rs.getString("id");
第二种:用字段值所在的列号获取
列是从1开始编号。
1代表第一列,2代表第二列。
以获取String类型为例:
String getString(int 列号)
获取第2列的值:
String value = rs.getString(2);
3、实际的处理逻辑
// 获取结果集对象
ResultSet rs = state.executeUpdate("SQL语句");
// 循环处理,有下一行就继续循环
while(rs.next()){
// 用get方法获得当前行的字段
}
// 关闭结果集
rs.close();
四、注意事项
1、连接用完后及时调用close()方法关闭。
2、结果集获取字段值的方法要和返回的类型匹配。
3、账号权限设计合理,不能获取最高权限。