JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。它是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够通过执行SQL语句来完成对数据库中数据的查询、更新和删除等操作。
应用程序使用JDBC访问数据库的方式如下图所示:

?
从上图可以看出,应用程序使用JDBC访问特定的数据库时,需要与不同的数据库驱动进行连接。由于不同数据库厂商提供的数据库驱动不同,因此,为了使应用程序与数据库真正建立连接,JDBC不仅需要提供访问数据库的API,还需要封装与各种数据库服务器通信的细节,不同厂商的数据库都有相应的实现。
下面通过一张图来描述JDBC的具体实现细节,如下图:

从上图中可以看出,JDBC的实现包括三部分。
(1)JDBC驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql.DriverManager类实现;
(2)JDBC驱动器API:由Sun公司负责制定,其中最主要的接口是java.sql.Driver接口;
(3)JDBC驱动器:它是一种数据库驱动,由数据库厂商创建,也称为JDBC驱动程序,负责与特定的数据库连接,以及处理通信细节。
JDBC编程步骤
各种不同厂商的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的。
1、注册驱动
在编写代码前,你需要安装MySQL第三方类库,mysql-connector-java-8.0.29-bin.jar包可以在网上下载,或者在MySQL的安装目录下找到。
try {
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
} catch (SQLException e) {
throw new RuntimeException(e);
}
以下是com.mysql.cj.jdbc.Driver类的源代码
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
加载驱动程序也可以通过Class.forName方法,该方法将这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
2、建立连接
String url = "jdbc:mysql://localhost:3306/jdbc"; // 数据库URL
String user = "root"; // 数据库用户名
String password = "123456"; // 数据库密码
Connection conn = null;
try {
conn= = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
throw new RuntimeException(e);
}
3、获取数据库操作对象(预编译对象)
获取数据库操作对象,实现数据库插入操作
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql= "insert into user(id, name, gender, age) values(2, '张三', '男', 18)";
stmt.executeUpdate(sql);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
获取数据库操作对象,实现数据库更新操作
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "update user set name = '张三' where age = 20"; // 修改SQL语句
stmt.executeUpdate(sql);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
获取数据库操作对象,并实现数据库删除操作
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "delete from user where name = '张三'"; // 删除SQL语句
stmt.executeUpdate(sql);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
获取数据库预编译对象,实现数据库插入操作
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
String user = "root";
String password = "123456";
Connection conn = null;
PreparedStatement pre = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
String sql = "insert into user(id, name, gender, age) values (?, ?, ?, ?)";
pre = conn.prepareStatement(sql);
pre.setInt(1,1);
pre.setString(2,"张三");
pre.setString(3,"男");
pre.setInt(4,18);
pre.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
4、处理查询结果集
获取数据库操作对象,实现数据库查询操作,并打印结果集
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String select = "select * from user where name = '张三'";
rs = stmt.executeQuery(select);
while (rs.next()) {
System.out.println(rs.getString("id") + "," + rs.getString("name")
+ "," + rs.getString("gender") + "," + rs.getString("age"));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
获取数据库预编译对象,实现数据库查询操作,并打印结果集
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
String user = "root";
String password = "123456";
Connection conn = null;
PreparedStatement pre = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
String sql = "select * from user where name = ?";
pre = conn.prepareStatement(sql);
pre.setString(1,"藏三");
rs = pre.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("id") + "," + rs.getString("name")
+ "," + rs.getString("gender") + "," + rs.getString("age"));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
5、释放资源
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
Statement和PreparedStatement的异同及优缺点
相同点:两者都是用来执SQL语句的
不同点:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。
PreparedStatement的优点
1、其使用参数设置,可读性好数据库更新操作,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
2、其具有预编译机制,性能比statement更快。
3、其能够有效防止SQL注入攻击。
execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句;2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。
关于JDBC基础介绍就到这里啦,欢迎大家在评论区讨论。
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|