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();
    }
}

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


相关推荐
0xDevNull2 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花2 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸2 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain3 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希3 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神3 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员3 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java4 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿4 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴4 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存