JDBC编程方法及细节

JDBC(Java Database Connectivity)是Java编程语言用于连接和操作数据库的API(Application Programming Interface)。它为开发人员提供了一组Java类和接口,用于与各种关系型数据库进行通信。使用JDBC,开发人员可以轻松地执行数据库操作,如查询、插入、更新和删除数据。

JDBC提供了一种标准的方式来连接数据库,并通过执行SQL语句与数据库进行交互。它允许开发人员使用Java代码来创建数据库连接、发送SQL语句并处理结果。通过JDBC,开发人员可以跨不同的数据库系统,如MySQL、Oracle、SQL Server等,使用相同的编程接口进行数据库操作。

1. 引入JDBC驱动包

要想使用JDBC编程要先引入MySQL的JDBC驱动包,JDBC驱动包就是Java对于数据库原生接口的封装,这种驱动包属于第三方库并不包含在JDK中 ,所有需要把它下载下来并且引入项目中。

1.1 下载方法

打开网站:https://mvnrepository.com/

点击上方的搜索框,输入 mysql 然后点击 Search

然后点击如下图第二个搜索结果

然后来到如下界面,向下找到对应自己的MySQL版本,然后点击版本号进去

然后点击如图所示的jar即可下载

1.2 引入项目

  1. 先创建一个项目
  1. 右键图中的.idea然后点检 新建 / 目录

命名可任意,一般命名为lib

  1. 将下载好的jdbc驱动包复制然后粘贴到新建的目录中
  1. 右击目录 点击添加到库 然后点击确定即可

2. JDBC编程步骤

2.1 创建数据源

数据库是服务器,服务器可能可能在这台主机上,也可能在其他主机上,我们要明确这个服务器的位置才能对其进行操作

数据源就是描述你要操作的数据库在哪里

这里Java是通过 IP地址 + 端口号 + 数据库名 来定位数据库位置的

解释:

  • IP地址: IP地址是描述一台主机在网络上的位置的机制,通常由一串数字组成
  • 端口号:一台主机上有很多服务程序,使用端口号区分不同的服务程序

注意:

127.0.0.1 是一个特殊的IP地址,叫做环回IP(loopback)表示本机

MySQL默认的端口号为3306

代码:

java 复制代码
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
//解释,DataSource 是Java JDBC 中原生的API接口,MysqlDataSource 是我们安装的驱动包中的内容
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");

解释:

  1. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");

  2. jdbc:mysql://:表示使用JDBC连接到MySQL数据库。

  3. 127.0.0.1:表示数据库服务器的IP地址,这里为本地主机。

  4. 3306:表示MySQL数据库服务器的端口号,一般情况下默认为3306。

  5. java1124:表示要连接的具体数据库名称。

  6. ?characterEncoding=utf8&uesSSL=false:表示额外的连接参数。characterEncoding=utf8:指定字符编码为UTF-8,确保正确处理中文等特殊字符。useSSL=false:禁用SSL连接

  7. ((MysqlDataSource)dataSource).setUser("root");

这行代码设置了数据库连接的用户名。同样是将dataSource转换为MysqlDataSource类型,然后调用setUser()方法,将数据库连接的用户名设置为root,这是一个常见的MySQL数据库的默认用户名,拥有所有权限

  1. ((MysqlDataSource)dataSource).setPassword("123456");

这行代码设置了数据库连接的密码。同样是将dataSource转换为MysqlDataSource类型,然后调用setPassword()方法,将数据库连接的密码设置为123456,这是与用户名对应的数据库连接密码,即我们安装MySQL时自己设置的密码

2.2 和数据库服务器建立连接

java 复制代码
//2.和数据库服务器建立连接 
Connection connection = dataSource.getConnection();
//注意这里的Connection要使用java.sql包下的Connection
//使用getConnection()方法会抛出一个SQLException异常记得捕获或者抛出这个异常

2.3 构建一个SQL语句

  1. 创建一个字符串类型的SQL语句
java 复制代码
 //注意末尾不需要加";" 
String sql = "insert into student values(1, 'Ting')";

2 .将String类型的SQL语句转化为语句对象

java 复制代码
//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);

注意:还有一个 Statement接口也可以完成该操作,但是他们有一些区别如下:

  1. 创建方式:

    • Statement: 通过Connection对象的createStatement()方法创建。
    • preparedStatement:通过Connection对象的preparedStatement()方法创建,需要传入SQL语句作为参数。
  2. 预编译:

    • Statement:不进行预编译,每次执行SQL语句时都会将SQL语句发送给数据库进行解析和编译。
    • preparedStatement:在创建时进行了预编译,即SQL语句被发送到数据库进行解析和编译,并生成可复用的执行计划。这样,在后续的执行过程中,只需要传递参数即可,无需重新解析和编译SQL语句,提高了执行效率。
  3. 参数设置:

    • Statement:执行SQL语句时,无法使用参数化查询,所有的参数值都必须通过字符串拼接的方式直接嵌入SQL语句中。
    • preparedStatement:支持参数化查询,可以使用占位符(如?)代替具体的参数值,然后通过调用setXXX()方法设置参数的值。
  4. 防止SQL注入:

    • Statement:由于无法参数化查询,容易受到SQL注入攻击。因为参数值直接嵌入到SQL语句中,如果参数值未经过正确的处理,可能会导致安全漏洞。
    • preparedStatement:使用参数化查询,可以有效预防SQL注入攻击。参数值在设置时会被正确处理,不会直接嵌入到SQL语句中,从而提高了安全性。

2.4 把构造好的SQL语句发送给服务器执行

增删改操作使用 :executeUpdate() 方法 返回值为int类型 即为影响的行数。

查询操作使用:executeQuery() 方法 返回值为 ResultSet 为一个结果集

java 复制代码
int n = statement.executeUpdate();
System.out.println(n);

2.5 释放资源

Connection connection 和 PreparedStatement statement 是需要释放资源的,

因为它们占据了一些计算机重要的软/硬件资源

DataSource dataSource 不需要释放,因为它只储存了 一些信息

使用close() 方法释放资源

java 复制代码
//注意释放顺序要与创建顺序相反
statement.close();
connection.close();

2.6 问题

在 2.3 中我们发现我们的SQL语句是写死的 如果要插入其他内容又需要重新修改代码,显然这样是不科学的

解决方案:

  1. 字符串拼接

在构造SQL语句时我们使用字符串拼接的方式来构造

java 复制代码
String sql = "insert into student values(" + id + ", '" + name + "')";

这样就把插入的内容改为可由用户输入了,避免了修改代码

但是这样写任然存在一些问题

1.出的代码太过冗余杂乱

2.有sql注入攻击的风险

例如:用户在输入时 输入 " ');drop database;"

  1. 使用 preparedStatement 提供的占位符
java 复制代码
String sql = "insert into student values(?, ?)";
//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);//把第一个 ? 设置为 id
statement.setString(2, name);//把第二个 ? 设置为 name

2.7 查询

构造查询语句与增删改略有不同,注意查询结果的打印方式即可

java 复制代码
    public static void main(String[] args) throws SQLException {
        //构造数据源
        DataSource datasource = new MysqlDataSource();
        ((MysqlDataSource)datasource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)datasource).setUser("root");
        ((MysqlDataSource)datasource).setPassword("123456");
        //连接数据库
        Connection connection = datasource.getConnection();
        //构造SQL语句
        String sql = "Select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);
        
        //发送到服务器执行
        ResultSet result = statement.executeQuery();
        while(result.next()){
            int id = result.getInt("id");
            String name = result.getString("name");
            System.out.println(id + " " + name);
        }
        //释放资源
        result.close();
        statement.close();
        connection.close();
    }
相关推荐
num_killer5 小时前
小白的Langchain学习
java·python·学习·langchain
期待のcode5 小时前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐5 小时前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲6 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红6 小时前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥6 小时前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v6 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地6 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209256 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei6 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot