文章目录
前言
JDBC(Java Database Connectivity)在Java生态系统中扮演着非常重要的角色。它是一个Java API,用于连接和执行数据库操作,允许Java程序与各种数据库进行交互。同时JDBC定义了访问数据库的规范,非常值得我们进行深入的学习。
一、JDBC的基本流程介绍
1、JAVA连接mysql数据库的步骤
1注册驱动(三种方式)
1:Class.forName(“com.mysql.cj.jdbc.Driver”);
2:DriverManager.registerDriver(com.mysql.cj.jdbc.Driver)
3:System.setProperty(“jdbc.drivers”,“driver1:driver2”)
三种驱动程序注册方式的对比
第一种使用反射机制来加载数据库驱动类,不依赖于具体的数据库实现类,具有较高的通用性。它也不需要显示地注册驱动,JDBC 驱动程序管理器会自动发现并加载合适的驱动程序。我们推荐使用这种方式,它更符合 Java 的平台无关性,不会对具体的驱动类产生依赖,避免了驱动类硬编码的问题。通常来说,Class.forName() 已经成为标准的做法。
第二种方式会显式地将驱动注册到 DriverManager 中,可能导致多个相同驱动的注册(如果程序中多次调用注册函数),并且强烈依赖于具体的驱动类。这种方式不推荐使用,它会对特定的驱动程序产生较强的耦合,因此不适用于动态加载驱动或在多环境中使用。
第三种方式通过系统属性来指定 JDBC 驱动类。虽然它不会对驱动程序产生直接依赖,但它会使得 DriverManager 在启动时查找并加载指定的驱动。即使它不会导致代码中的强依赖,但设置起来并不如 Class.forName() 直观,且不支持动态加载多个驱动。配置不够灵活和方便,使用不广泛。
综上,大家在注册驱动程序时,推荐使用 Class.forName() 方式,因为它无需显式注册,且不依赖具体的数据库实现类,能够更好地适应不同的数据库环境。
2、建立连接(Connection)
Connection conn =DriverManager.getConnection(url, user,password);
//这里的三个参数
url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&...
比如:jdbc:mysql://localhost:3306/MyData?
其他参数如:(采用字符集编码格式),补充到后面即可,
eg:useUnicode=true&characterEncoding=UTF-8;
剩下的两个参数:User,password可以用“属性名=属性值”方式告诉数据库;
3、创建执行SQL语句:(Prepared)Statement
执行SQL代码一共有两种方式(可以自行对比优劣)
//在建立好数据库连接后,获得连接的对象conn
//1.使用Statement执行静态的sql语句
//获得执行器(我们的sql代码都是通过对象st来执行)
Statement st= conn.createStatement();
//执行语句(这里的sql是你写好的sql语句的字符串形式)
st.executeQuery(sql);
//2.使用PreparedStatement(这里的?是占位符,用来通配)
String sql= "select * from table where sname=?";
//获得执行器(这里的sql代码都是通过对象ps来执行动态sql代码)
PreparedStatement ps =conn.preparedStatement(sql);
//给第一个(占位符)?处标记为 value
ps.setString(1,"value");
ps.executeQuery();
//至此sql语句就执行完了,JDBC最基本的操作就这些了(是不是很简单)
//我们还可以进一步处理执行结果,我们要先获取结果集,一般结果集主要是针对查询操作
//eg:
ResultSet rs = statement.executeQuery(sql);
//对rs进行一系列处理...
//最后使用完资源要释放资源:即关闭数据库资源
con.close();
//这里JDBC操作告一段落
其实,针对上述两种执行sql代码的方法,我们更倾向于使用第二种,它有以下三个优点:
1)提升访问数据库的性能(没必要解释)
2)数据库和驱动能够优化PreparedStatement
3)防止sql注入
针对后两点我们解释下,
//eg:
String sql= "select * from table where sname=?";
PreparedStatement ps =conn.preparedStatement(sql);
在执行sql语句时会到 ps缓存中寻找 sql这个语句,如果没有找到,它会把这条语句编译后存放在ps缓存中,然后发送给数据库,下次再来执行这条语句时,缓存命中,就不会再把语句发送给数据库,只把相关的值发送给数据库,大大提高了数据库语句执行效率,避免了sql注入。
这里补充一点:数据库效率其实分为两个部分
1.sql编译(占10%)
2.建立连接(80-90%),(后面使用连接池时再说)
二、JDBC代码实例分析(连接并实现增删改查)
eg:实现简单的对数据库数据的增删改查
1.简单的代码设计
①创建一个数据库表格
CREATE TABLE tecpro (
product_id INT AUTO_INCREMENT PRIMARY KEY, -- 产品ID,整数类型,自动递增,主键
product_name VARCHAR(255) NOT NULL, -- 产品名称,字符串类型,不为空
applicable_field VARCHAR(255) NOT NULL -- 适用的领域,字符串类型,不为空
);
②给表格中添加几条数据
INSERT INTO tecpro (product_name, applicable_field) VALUES
('人工智能处理器', '人工智能'),
('量子计算机', '量子计算'),
('大数据分析平台', '大数据');
这是我们创建的表的数据
③编写我们的idea代码
package jdbc;
//这里需要在idea项目结构的库中导入数据库连接的驱动
import java.sql.*;
public class TestCRUD {
//主方法测试增删改查
public static void main(String[] args) throws SQLException, ClassNotFoundException {
create();// 增
delete();// 删
update();// 改
select();// 查
}
// 类加载时初始化静态常量,路径设置不使用安全套接层,并指定MySQL服务器的时区为协调世界时
static String url = "jdbc:mysql://localhost:3306/library1?useSSL=false&serverTimezone=UTC";
static String user = "root"; // 你自己的数据库用户名
static String password = "123456"; // 你自己的数据库密码
// 创建
static void create() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
Statement st = conn.createStatement();
st.executeUpdate("insert into tecpro(product_name,applicable_field)values ('人工智能处理器2.0','人工智能新领域') ");
System.out.println("添加成功");
conn.close(); // 完成后关闭连接
}
// 删除
static void delete() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
Statement st = conn.createStatement();
st.executeUpdate("delete from tecpro where product_id=3 ");
System.out.println("删除成功");
conn.close(); // 完成后关闭连接
}
// 修改
static void update() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
Statement st = conn.createStatement();
st.executeUpdate("update tecpro set product_name='人工智能处理器3.0'where product_id=1 ");
System.out.println("更新成功");
conn.close(); // 完成后关闭连接
}
// 查询
static void select() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
Statement st = conn.createStatement();
// rs相当与一个游标,可以根据它获取当前行的数据元素
ResultSet rs = st.executeQuery("select * from tecpro ");
// 游标下移一位
while (rs.next()) {
// 获得结果集中每行中的各个列的值
System.out.println(rs.getInt(1) + rs.getString("product_name") +
rs.getObject("applicable_field"));
}
System.out.println("查询成功");
conn.close(); // 完成后关闭连接
}
}
2.程序运行结果
查看并更新数据库中表的信息,也已发生变化,说明测试成功
总结
以上就是今天汇总的内容,本文仅仅简单介绍了JDBC最基本的使用,而后续我们还有很多新的东西要继续探讨,欢迎大家积极留言,让我们一起进步。