开发者

MySQL的JDBC编程详解

开发者 https://www.devze.com 2025-09-15 08:58 出处:网络 作者: BUG召唤师
目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言
目录
  • 前言
  • 一、前置知识
    • 1. 引入依赖
    • 2. 认识 url
  • 二、JDBC 操作流程
    • 1. 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 项目中引入;

        <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 得到结构化的数据,直接把解析好的结构化数据发给数据库服务器,服务器就省下了这部分解析的工作;

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

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

    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 studenlrwRYKeuSt 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() 等方法进行替换;

            // 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;

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

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

    编程客栈
    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. 执行http://www.devze.com sql 语句
            ResultSet resultSet = statement.executeQuery();
    
            // 5. 遍历结果集合
            //    通过 next() 方法,可以获取临时表的每一行数据,执行到最后一行的下一行会返回 false
            while(resultSet.next()){
                int id = relrwRYKeuSsultSet.getInt("id");
                String name = resultSet.getString("name");
    
                System.out.println("id = " + id + ", name = " + name);
            }
    
            // 6. 释放资源
            resultSet.close();
            statement.close();
            connection.close();
        }
    }

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

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号