当前位置: 代码网 > it编程>数据库>Mysql > MySQL之JDBC编程用法及说明

MySQL之JDBC编程用法及说明

2026年05月10日 Mysql 我要评论
一、什么是 jdbc?jdbc(java data base connectivity) 是 java 提供的一套数据库操作接口标准,用来统一连接数据库、发送 sql、处理结果。特点:面向接口编程,不

一、什么是 jdbc?

jdbc(java data base connectivity) 是 java 提供的一套数据库操作接口标准,用来统一连接数据库、发送 sql、处理结果。

特点:

  • 面向接口编程,不关心底层数据库类型
  • 切换数据库只需要换驱动包
  • 是所有 orm 框架(mybatis、hibernate)的底层基础

jdbc 的核心作用

  1. 建立数据库连接
  2. 发送 sql 语句
  3. 接收并处理执行结果
  4. 关闭资源

jdbc 工作流程

正常来说,访问数据库的重要步骤如下,jdbc也提供了这些接口:

  1. 确定数据库服务器的地址和端口号(数据源)
  2. 建立连接,确定用户名,密码(数据库连接)
  3. 发送要执行的sql(执行对象)
  4. 接收返回结果(结果集)
  5. 关闭连接(释放资源,关闭连接)

数据库厂商提供了jdbc具体的实现类,java程序员只需要利用接口来写程序。

加载驱动 → 建立连接 → 创建 statement → 执行 sql → 处理结果 → 释放资源

二、开发环境准备(maven 项目)

maven类似于应用商店,在maven仓库中维护了所有java工程所用到的依赖。maven仓库是国外的,可以用阿里的镜像。

1. 配置 maven 阿里云镜像

加速依赖下载,在 settings.xml<mirrors> 中加入:

<mirror>
  <id>aliyunmaven</id>
  <mirrorof>*</mirrorof>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

2. 引入 mysql 驱动依赖

pom.xml

<dependencies>
    <!-- mysql 8.x 驱动 -->
    <dependency>
        <groupid>mysql</groupid>
        <artifactid>mysql-connector-java</artifactid>
        <version>8.0.33</version>
    </dependency>
</dependencies>

三、jdbc 核心 api

1. drivermanager(传统连接)

class.forname("com.mysql.cj.jdbc.driver");
connection connection= drivermanager.getconnection(url, user, password);

driver类(驱动类)

2. datasource(连接池)

datasource通过一个连接池去管理很多个连接,当需要执行sql时拿出一个空的连接,用完返还给连接池。是更高效、支持连接复用,企业开发标准用法

mysqldatasource datasource = new mysqldatasource();
datasource.seturl(url);
datasource.setuser(user);
datasource.setpassword(password);

drivermanager vs datasource

  • drivermanagergetconnection每次获取的是一个物理连接,每执行一次都会打开一个会话窗口,新建连接,用完销毁,性能低
  • datasourse 一个连接可以执行很多sql,直到关闭数据源。连接可复用,关闭只是归还,性能极高

3. connection(连接对象)

代表一次数据库会话,用于创建 statement。

4. statement(执行对象)

  • statement:静态 sql,存在 sql 注入风险
  • preparedstatement预编译 sql,解决sql注入问题
  • callablestatement:执行存储过程

5. resultset(结果集)

封装 select 查询结果,用 next() 遍历,getxxx(列名/下标) 取值。

四、sql 注入

什么是 sql 注入?

用户输入恶意字符串,破坏原有 sql 逻辑,实现越权查询/删改数据。

示例:

select * from student where name = '' or/**/1=1;#' and class_id=1

直接查出所有数据:

解决方案

preparedstatement + 占位符 ?

statement执行静态的sql语句,preparedstatement可以预处理sql执行对象。参数会被安全转义,从根本杜绝注入。

五、完整代码

功能:根据 name 查询学生

基础版

package org.daisy;

import java.sql.*;
import java.text.messageformat;
import java.util.scanner;

public class demo01_drivermanager {
    static scanner in = new scanner(system.in);
    public static void main(string[] args) throws classnotfoundexception, sqlexception {
        //1. 加载数据库厂商提供的驱动
        // "com.mysql.cj.jdbc.driver" 通过完全限定名加载指定的类到jvm
        class.forname("com.mysql.cj.jdbc.driver");

        //2. 建立连接
        connection connection = drivermanager.getconnection("jdbc:mysql://127.0.0.1:3306/test20260422?characterencoding=utf8" +
                "&allowpublickeyretrieval=true&usessl=false", "root", "pullmecloser00");

        //3. 创建statement对象
        //sql语句通过connection发送
        statement statement =  connection.createstatement();

        //4. 定义sql语句
        system.out.println("input name:");
        string name = in.nextline();
        string sql = "select studentid,sn,name,mail,classid from student where name ='"+name+"';";

        //5. 执行sql语句,获取结果集
        resultset resultset = statement.executequery(sql);

        //6. 遍历结果集
        // resultset.next() 如果有下一条数据就返回true
        while(resultset.next()){
            //获取学生id,sql中的int对应java中的int
            int stuid = resultset.getint(1);
            string stusn = resultset.getstring(2);
            string stuname = resultset.getstring(3);
            string stumail = resultset.getstring(4);
            string stuclassid = resultset.getstring(5);
            system.out.println(messageformat.format(
                    "学生编号 = {0},学号 = {1},学生姓名 = {2},邮箱 = {3},班级 = {4}",
                    stuid,stusn,stuname,stumail,stuclassid)
            );
        }

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

datasourse , preparement 优化

package org.daisy;

import com.mysql.cj.jdbc.mysqldatasource;
import javax.sql.*;
import java.text.messageformat;
import java.util.scanner;

public class demo02_datasource {
    static scanner in = new scanner(system.in);
    public static void main(string[] args) throws sqlexception {
        // 定义mysql数据源对象
        mysqldatasource mysqldatasource = new mysqldatasource();

        //设置数据库连接串,用户名,密码
        mysqldatasource.seturl("jdbc:mysql://127.0.0.1:3306/test20260422?characterencoding=utf8" +
                "&allowpublickeyretrieval=true&usessl=false");
        mysqldatasource.setuser("root");
        mysqldatasource.setpassword("pullmecloser00");

        //定义jdbc数据源对象
        datasource datasource = mysqldatasource;
        //1. 通过数据源获取数据库连接
        connection connection = datasource.getconnection();


        //2. 获取预处理sql执行对象
        //定义要执行的sql语句
        string sql = "select studentid,sn,name,mail,classid from student where name = ?";
        //sql执行对象
        preparedstatement preparedstatement = connection.preparestatement(sql);

        //用户输入查询信息
        system.out.println("input name:");
        string name = in.nextline();

        //3. 用真实值来替换占位符
        //序号1对应第一个占位符
        preparedstatement.setstring(1,name);

        //4. 执行sql,获取结果
        //结果集对象
        resultset resultset = preparedstatement.executequery();

        //遍历结果
        while(resultset.next()){
            //获取学生id,sql中的int对应java中的int
            int stuid = resultset.getint(1);
            string stusn = resultset.getstring(2);
            string stuname = resultset.getstring(3);
            string stumail = resultset.getstring(4);
            string stuclassid = resultset.getstring(5);
            system.out.println(messageformat.format(
                    "学生编号 = {0},学号 = {1},学生姓名 = {2},邮箱 = {3},班级 = {4}",
                    stuid,stusn,stuname,stumail,stuclassid)
            );
        }

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

把建立连接和关闭资源封装成对象

  • dbutil
package org.daisy.dbutil;

import com.mysql.cj.jdbc.mysqldatasource;
import javax.sql.datasource;
import java.sql.connection;
import java.sql.resultset;
import java.sql.sqlexception;
import java.sql.statement;

public class dbutil {
    /**
     * 构造方法私有化,禁止其他类创建dbutil对象,是单例模式的一个重要特征
     */
    private dbutil(){}

    //数据源
    private static datasource datasource = null;

    //连接串,用户名,密码
    private static string url = "jdbc:mysql://127.0.0.1:3306/test20260422?characterencoding=utf8" +
            "&allowpublickeyretrieval=true&usessl=false";
    private static string user = "root";
    private static string password = "pullmecloser00";

    //类加载到jvm时,执行数据源的初始化
    static {
        mysqldatasource mysqldatasource = new mysqldatasource();
        mysqldatasource.seturl(url);
        mysqldatasource.setuser(user);
        mysqldatasource.setpassword(password);
        datasource = mysqldatasource;
    }

    /**
     * 获取数据库连接
     * @return
     * @throws sqlexception
     */
    public static connection getconnection() throws sqlexception {
        return datasource.getconnection();
    }

    /**
     * 释放资源,关闭连接
     * @param resultset
     * @param statement
     * @param connection
     * @throws sqlexception
     */
    public static void close(resultset resultset, statement statement,connection connection) throws sqlexception {
        if(resultset!=null)
            resultset.close();
        if(statement!=null)
            statement.close();
        if(connection!=null)
            connection.close();
    }
}
  • insert
package org.daisy;

import org.daisy.dbutil.dbutil;

import java.sql.connection;
import java.sql.preparedstatement;
import java.sql.sqlexception;
import java.util.scanner;

public class demo03_insert {
    static scanner in = new scanner(system.in);
    public static void main(string[] args) throws sqlexception {
        //1. 获取数据库连接
        connection connection = dbutil.getconnection();

        //2. 定义sql
        string sql = "insert student (sn,name,mail,classid) values (?,?,?,?)";

        //3. 定义预处理对象
        preparedstatement statement = connection.preparestatement(sql);

        //4. 用真实数据填充占位符
        system.out.println("input sn:");
        string sn = in.nextline();
        system.out.println("input name:");
        string name = in.nextline();
        system.out.println("input mail:");
        string mail = in.nextline();
        system.out.println("input classid:");
        string classid = in.nextline();

        statement.setstring(1,sn);
        statement.setstring(2,name);
        statement.setstring(3,mail);
        statement.setstring(4,classid);

        //5. 执行并判断 executeupdate返回结果是受影响的行数
        int row = statement.executeupdate();
        if(row == 1)
            system.out.println("insert successfully");
        else
            system.out.println("insert fail");

        //6. 关闭资源
        dbutil.close(null,statement,connection);
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com