1.什么是 jdbc?

jdbc 是连接和操作数据库的一种标准 API。
2.jdbc的主要作用
第一个是数据库的连接,第二个是执行 SQL 语句,第三个处理查询结果,第四个事务管理,第五个跨数据库兼容
3.jdbc开发的步骤
a.加载驱动使用DriverManager类
b. 获取连接,返回Connection接口,说明连接上数据库的服务器
执行SQL语句
编写SQL语句
c.获取能执行SQL语句的对象(Statement接口)
d. 如果执行的查询的语句,返回的结果,封装ResultSet接口中,遍历该接口
e. 释放资源(调用close()方法)
4.分别介绍jdbc的开发步骤
DriverManager****类(驱动)
DriverManager是JDBC中管理数据库驱动的核心类,主要负责管理各种数据库驱动的实现类。 它的主要作用有两个: 第一个是加载驱动,通过registerDriver(Driver driver)方法来注册驱动,但直接传入new Driver()这种方式有缺点,一方面会让代码过度依赖具体的驱动实现类,不利于更换数据库;另一方面还会导致驱动的jar包被加载两次。
所以更好的做法Class.forName("com.mysql.jdbc.Driver")这种方式,它会加载驱动类并自动完成注册,避免了上述问题。 第二个是获取数据库连接,通过getConnection(String url, String user, String password)方法实现。
这个方法需要三个参数: 第一个是数据库URL,格式是jdbc:mysql://localhost:3306/数据库名,其中jdbc是主协议,mysql是子协议,localhost是主机名,3306是默认端口号。如果是访问本地数据库,localhost:3306可以省略,简写为jdbc:mysql:数据库名 - 第二个是数据库用户名,通常是root - 第三个是数据库密码
简单来说,DriverManager就是用来管理驱动,并通过加载驱动和获取连接这两个主要功能,让Java程序能够和数据库建立连接。
再结合后面提到的内容总结一下:DriverManager主要负责管理驱动,通过Class.forName("com.mysql.jdbc.Driver")加载驱动,通过getConnection("jdbc:mysql:///day07","root","密码")获取连接;而Connection是连接接口,Statement是能执行SQL语句的接口。
Connection 接口
代表与数据库的连接,是很珍贵的资源,用完必须释放。主要作用有:
- 获取执行 SQL 的对象:
- 通过
createStatement()
得到 Statement 对象 - 通过
prepareStatement(String sql)
得到 PreparedStatement 对象(更安全,能防 SQL 注入)
- 通过
- 管理事务:
setAutoCommit(boolean)
开启事务commit()
提交事务rollback()
回滚事务
Statement 接口
是执行 SQL 语句的对象,主要功能:
- 执行 SQL:
executeQuery(String sql)
:执行查询语句,返回结果集executeUpdate(String sql)
:执行增删改语句,返回影响行数
- 批处理操作:
addBatch(String sql)
:添加 SQL 到批处理clearBatch()
:清空批处理executeBatch()
:执行批处理
ResultSet 接口
封装了查询语句的结果,特点是:
- 用表格形式存储查询结果
- 内部有个游标,默认在第一行数据前
- 调用
next()
方法移动游标,只能向下移动 - 获取数据时,根据字段类型调用对应方法:
- 整数类型用
getInt()
,字符串用getString()
等 - 可以用字段索引(从 1 开始)或字段名获取,常用字段名方式
getObject()
可获取任意类型,需要自己强转
- 整数类型用
资源释放
所有连接相关的对象必须释放,标准做法是:
在 finally 代码块中释放,确保一定会执行,例如:
java
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
5.具体程序
向上提取的思想
package cn.qcby.demo1;
import com.mysql.jdbc.Driver;
import java.sql.*;
/**
* JDBC的入门程序
* 需求:把数据库中所有的数据全部查询出来,显示到控制台
*/
public class JdbcTest1 {
public static void main(String[] args) {
// 数据库连接
Connection conn = null;
// 能执行SQL语句的对象
Statement stmt = null;
// 查询数据,把数据封装到该结果集中,表格
ResultSet rs = null;
try {
// 加载驱动类
DriverManager.registerDriver(new Driver());
//Class.forName("com.mysql.jdbc.Driver");
// 获取到连接 1数据库连接地址(需要编写协议) 2用户名 3密码
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
// 获取到连接,localhost:3306可以省略不写的,访问本地mysql服务器
conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "root");
// 执行SQL语句
// 编写SQL语句
String sql = "select * from t_user";
// 有能执行SQL语句的对象 Statement对象,能执行SQL语句 sql注入问题 不能
stmt = conn.createStatement();
//conn.prepareStatement()
// 执行SQL语句,数据封装到结果集中
rs = stmt.executeQuery(sql);
// 遍历rs结果集
while(rs.next()){
// 获取到数据就OK
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
// 做打印
System.out.println(id+"-"+username+"-"+password+"-"+email);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 总是会执行的,释放的顺序相反
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package cn.qcby.demo1;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 演示增删改的操作
*/
public class JdbcTest2 {
public static void main(String[] args) {
// 测试保存
new JdbcTest2().testInsert();
// 测试修改
// new JdbcTest2().testUpdate();
// 测试删除
// new JdbcTest2().testDelete();
}
/**
* 新增数据
*/
public void testInsert(){
// 连接
Connection conn = null;
// 执行SQL语句
Statement stmt = null;
try {
// 注册驱动
// DriverManager.registerDriver(new Driver());
// 注册驱动,切换一种写法,反射代码。加载com.mysql.jdbc.Driver类,只要该类一加载,static代码块就会执行(注册驱动)
// 编写的是字符串,把com.mysql.jdbc.Driver编写到一个配置文件中去
Class.forName("com.mysql.jdbc.Driver");
// 获取链接
conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");
// 编写SQL语句
String sql = "insert into t_user values (null,'fff','111','ddd@126.com')";
// 获取到stmt对象
stmt = conn.createStatement();
// 执行SQL语句,执行增删改的操作
stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 修改数据
*/
public void testUpdate(){
// 连接
Connection conn = null;
// 执行SQL语句
Statement stmt = null;
try {
// 注册驱动
DriverManager.registerDriver(new Driver());
// 获取链接
conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");
// 编写SQL语句
String sql = "update t_user set username = 'eee' where id = 4";
// 获取到stmt对象
stmt = conn.createStatement();
// 执行SQL语句,执行增删改的操作
stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 删除数据
*/
public void testDelete(){
// 连接
Connection conn = null;
// 执行SQL语句
Statement stmt = null;
try {
// 注册驱动
DriverManager.registerDriver(new Driver());
// 获取链接
conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");
// 编写SQL语句
String sql = "delete from t_user where id = 4";
// 获取到stmt对象
stmt = conn.createStatement();
// 执行SQL语句,执行增删改的操作
stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}