JAVA(idea)连接mysql数据库知识整合1(JDBC)


前言

JDBC(Java Database Connectivity)在Java生态系统中扮演着非常重要的角色。它是一个Java API,用于连接和执行数据库操作,允许Java程序与各种数据库进行交互。同时JDBC定义了访问数据库的规范,非常值得我们进行深入的学习。


一、JDBC的基本流程介绍

1、JAVA连接mysql数据库的步骤

1注册驱动(三种方式)

1Class.forName(com.mysql.cj.jdbc.Driver);
2DriverManager.registerDriver(com.mysql.cj.jdbc.Driver)
3System.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最基本的使用,而后续我们还有很多新的东西要继续探讨,欢迎大家积极留言,让我们一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剑啸神州镜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值