JavaSE23——JDBC

JDBC

一、什么是 JDBC?

JDBC 是 Java Database Connectivity 的缩写,它是 Java 语言用于与关系型数据库进行连接和交互的一种标准接口。

JDBC 提供了一种统一的方式,使得 Java 应用程序能够通过标准的 API 与各种不同的数据库进行通信,而不需要关注具体数据库的实现细节。通过 JDBC,开发人员可以使用 Java 语言来执行 SQL 查询、更新数据库内容以及管理数据库事务。

JDBC API库包含下面提到的每个任务,都是与数据库相关的常用用法。

  • 制作到数据库的连接。
  • 创建SQL或MySQL语句。
  • 执行SQL或MySQL查询数据库。
  • 查看和修改所产生的记录。

从根本上来说,JDBC是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,因此可以用Java编写不同类型的可执行文件,例如:

  • Java Application
  • Java Applets
  • Java Servlets
  • Java ServerPages (JSPs)
  • Enterprise JavaBeans (EJBs)

所有这些不同的可执行文件就可以使用JDBC驱动程序来访问数据库,这样可以方便的访问数据。

JDBC具有ODBC一样的性能,允许Java程序包含与数据库无关的代码。

JavaSE23——JDBC_第1张图片

使用 JDBC,开发人员可以通过编写 Java 代码来连接数据库并执行各种操作,从而实现与数据库的交互。JDBC 提供了灵活且可扩展的接口,可以适用于不同的关系型数据库,如MySQL、Oracle、SQL Server等。

二、常见的JDBC组件

  1. Driver接口
  • 实现数据库驱动程序的接口,又厂商负责实现并提供,开发者只需引入驱动不同数据库的jar包。
  1. DriverManager类
  • 用于加载JDBC驱动程序,并建立与数据库的连接。

  • 有两个重要的静态方法:

    方法 功能
    void registerDriver (Driver driver) 用于加载数据库驱动程序。
    Connection getConnection(String url, String user, String password) 连接数据库并返回连接对象。
  1. Connection接口

    方法 功能
    Statement createStatement () 获取一个陈述器对象
    PreparedStatement prepareStatement (String sql) 获取一个SQL预编译的陈述器
    CallableStatement prepareCall (String sql) 获取SQL操作的储存过程
    DatabaseMetaData getMetaData() 获取数据库元数据的对象。
  2. Statement接口

    方法 功能
    boolean execute (String sql) 可执行任何SQL语句,有结果集时为true,否则为false。
    ResultSet executeQuery (String sql) 执行select语句,返回结果集
    int executeUpdate (String sql) 执行insert、update、delete语句,返回受影响行数
  3. ResultSet接口

  • 用于存放和解析结果集,对象初始化时游标在第一行,调用next()方法换行。

  • 数据获取方法

    方法 功能
    getXXX (int index) 以索引方式获取某字段的数据。
    getXXX (String field) 以字段名获取某字段的数据。
  • 游标操作方法

    方法 功能
    void next() 游标移动到下一行
    void previout () 游标移动到上一行
    void absolute (int row) 游标移动到指定行
    void afterLast () 游标移动到尾行之后
    void beforeFirst () 游标移动到首行之前
    void last () 游标移动到尾行

    1. PreparedStatement接口

实际开发中往往需要将程序的变量作为SQL语句的参数,PreparedStatement是Statement的子接口,可预编译SQL语句,用占位符“?”代替参数进行预编译,之后在用 setXXX()方法给参数赋值。示例:

String sql = "insert into tab_user(id, name, birthday) value(?, ?, ?)";
PreparedStatement ps = connection.preparedStatement(sql);
ps.setInt(1, 101);            //第一个参数是字段索引,第二个是数据。
ps.setString(2, "King");
ps.setDate(3, "2023-1-1");
ps.executeUpdate();

三、实现JDBC的基本步骤

  1. 将数据库驱动的 jar包(mysql-connector-java.jar)放到 lib目录,并右键引用 jar包,确认MySQL服务正在运行。

  2. 加载并注册驱动,有两种方式:

    Class.forName(“com.mysql.jdbc.Driver”);

    该方法作用是加载并初始化一个指定的类。

    DriverManager.registerDriver(new com.mysql.jdbc.Driver() );

    由于Driver对象源码中默认存在一段静态代码自动执行Class.forName("driverName") ,所以此方法会使驱动重复注册。

  3. 连接数据库时,其中参数 URL=“jdbc:mysql://hostName:port/databaseName?parameter”;

    jdbc:mysql:// 是规定格式;
    hostName:port 是主机地址和端口号;
    databaseName 是MySQL服务中必须已经存在的一个数据库对象的名称。
    ?parameter 用来设置一些参数,主要必须设置三个字符集参数,否则会报警。

四 JDBC 完整实现代码

pom.xml

<dependencies>
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>8.0.18version>
    dependency>
    <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.12version>
    dependency>
dependencies>

DBUtil.java

import java.sql.*;
import java.util.List;

public class
DbUtil {
    public static final String url = "jdbc:mysql://localhost:3306/" +
            "smart_health?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";

    public static final String user = "root";

    public static final String pwd = "123456";

    static Connection conn;
    static PreparedStatement pstmt;
    static ResultSet resultSet;

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建链接
     */
    public static void getConnection() {
        try {
            conn = DriverManager.getConnection(url, user, pwd);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    /**
     * 查询操作
     *
     * @param sql    sql语句
     * @param params sql中的参数集合
     * @return 结果集
     */
    public ResultSet executeQuery(String sql, List<Object> params) {
        try {
            //连接数据库
            getConnection();
            // 创建命令执行对象 (预加载sql)
            pstmt = conn.prepareStatement(sql);

            //select * from user where id = ? and username = ?
            if (params != null && params.size() > 0) {
                for (int i = 0; i < params.size(); i++) {
                    pstmt.setObject(i + 1, params.get(i));
                }
            }
            //执行sql语句,获取查询结果
            resultSet = pstmt.executeQuery();
        } catch (SQLException e) {
            System.out.println("查询失败" + "----" + e);
        }

        return resultSet;
    }

    /**
     * 数据库增删改操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int executeUpdata(String sql, List<Object> params) {
        int result = 0;
        try {
            //连接数据库
            getConnection();
            pstmt = conn.prepareStatement(sql);
            //匹配占位符
            if (params != null && params.size() > 0) {
                for (int i = 0; i < params.size(); i++) {
                    pstmt.setObject(i + 1, params.get(i));
                }
            }
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            System.out.println("数据库操作失败" + "----" + e);
        }finally {
            this.close();
        }
        return result;
    }

    /**
     * 释放资源
     */
    public void close() {
        try {
            if (resultSet != null) {
                resultSet.close();
                resultSet = null;
            }
            if (pstmt != null) {
                pstmt.close();
                pstmt = null;
            }
            if (conn != null) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}


你可能感兴趣的:(java,java,开发语言)