MySQL的JDBC编程

系列文章目录

MySQL的基础操作-CSDN博客

MySQL操作进阶-CSDN博客

MySQL索引事务-CSDN博客


目录

系列文章目录

前言

一、前置知识

[1. 引入依赖](#1. 引入依赖)

[2. 认识 url](#2. 认识 url)

[二、JDBC 操作流程](#二、JDBC 操作流程)

[1. JDBC 的写操作](#1. JDBC 的写操作)

[2. JDBC 的读操作](#2. JDBC 的读操作)


前言

本文介绍了MySQL数据库的JDBC操作流程,包括前置知识、写操作和读操作的实现步骤。内容涵盖:1)如何创建Maven项目并引入MySQL依赖;2)URL格式解析;3)JDBC写操作流程(创建数据源、建立连接、构造SQL、执行更新、释放资源);4)使用PreparedStatement防止SQL注入;5)JDBC读操作流程(执行查询、处理ResultSet结果集)。文章通过代码示例详细演示了插入、查询等基本操作,并强调了资源释放的顺序和SQL语句参数化的安全性考虑。


一、前置知识

1. 引入依赖

创建 Maven 项目,同时在 Maven Respository 中找到 MySQL 的依赖,在 Maven 项目中引入;

XML 复制代码
    <dependencies>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
    </dependencies>

2. 认识 url

url 是资源在网路上的位置;

以下面 url 为例:

jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSS=false

jdbc:mysql 表示 url 的作用,是给 jdbc 操作 mysql 的;

127.0.0.1 表示 IP 地址,描述网络上主机所在的位置;

3306 表示端口号,代表操作网络的应用程序;

myjdbc 表示数据库名;

characterEncoding=utf8 指定字符集为 utf8;

useSS=false 表示设置为不加密;

? 前面表示资源,后面表示访问资源的参数;

& 表示参数间的分隔符,多个参数使用这个符号分割;

二、JDBC 操作流程

1. JDBC 的写操作

  1. 创建数据源,设置好 url,用户名和密码;

  2. 建立和数据库服务器的连接;

  3. 构造 sql,使用 JDBC 操作数据库仍然需要手动构造 sql;

构造完 sql 之后需要预处理 sql 语句,目的是检查 sql 编写是否正确,避免直接发给服务器,导致服务器报错,浪费服务器资源;

除了检查 sql 是否正确,还会解析 sql 得到结构化的数据,直接把解析好的结构化数据发给数据库服务器,服务器就省下了这部分解析的工作;

  1. 把 sql 发给服务器,服务器返回受到影响的行数;

  2. 关闭连接,释放资源;先获得的资源后释放,后获得的资源先释放;

java 复制代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

// 在数据库中插入数据
public class Demo1 {
    public static void main(String[] args) throws SQLException {
        // 1. 创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");

        //    设置用户名和密码
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        // 2. 建立和数据库服务器之间的连接
        Connection connection = dataSource.getConnection();

        // 3. 构造 sql
        String sql = "insert into student values(1, '张三')";
        //    预处理 sql 语句
        PreparedStatement statement = connection.prepareStatement(sql);
        
        // 4. 把 sql 发给服务器
        int n = statement.executeUpdate();

        // 5. 关闭连接,释放资源
        statement.close();
        connection.close();
    }
}

更新和删除记录的操作和插入的操作步骤相同,只需要更改 sql 语句;

注意:

为了解决 sql 写死的问题,代码中的 sql 是可以拼接参数的;

但是字符串中拼接上参数,容易被注入 sql 攻击,为了避免被注入 sql,可以使用占位符 "?",再调用 PreparedStatement 的 setInt(), setString() 等方法进行替换;

java 复制代码
        // 3. 构造 sql
        //String sql = "insert into student values(" + id + ", '" + name +"')";
        String sql = "insert into student values (?, ?)";
        //    预处理 sql 语句 - 检查 sql 是否存在问题
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, id);
        statement.setString(2, name);

2. JDBC 的读操作

读操作和写操作的主要区别:

  1. sql 语句:需要编写查询语句;

  2. 执行 sql 的方法:executeQuery();

  3. 执行 sql 语句的返回值:返回的结果集的类型为 ResultSet;

ResultSet 默认指向第 0 行记录的前一个位置,调用 next() 方法,才会指向第 0 行记录;

如果 next() 指向的地方有数据记录,返回 true,否则返回 false;

  1. 获取数据记录的列需要使用 getInt(),getString() 等方法,取决于列的数据类型,括号中填写要获取临时表的列名,如果使用别名,就写别名;

  2. 关闭资源时,要注意关闭 ResultSet,因为 ResultSet 是最后打开的,因此要最先关闭;

java 复制代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

// jdbc 查询
public class Demo2 {
    public static void main(String[] args) throws SQLException {
        // 1. 创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        // 2. 建立连接
        Connection connection = dataSource.getConnection();

        // 3. 编写 sql 语句
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 4. 执行 sql 语句
        ResultSet resultSet = statement.executeQuery();

        // 5. 遍历结果集合
        //    通过 next() 方法,可以获取临时表的每一行数据,执行到最后一行的下一行会返回 false
        while(resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");

            System.out.println("id = " + id + ", name = " + name);
        }

        // 6. 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

注意:读操作同样可以使用占位符,后续用变量去替换;


相关推荐
IvorySQL17 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·17 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德17 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫17 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i17 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.18 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn18 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露18 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星18 小时前
sql语言之分组语句group by
java·数据库·sql
符哥200818 小时前
Ubuntu 常用指令集大全(附实操实例)
数据库·ubuntu·postgresql