JDBC的简单使用与封装

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: JDBC的简单使用与封装

1、JDBC

我们先了解JDBC是什么,JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC 可帮助我我们编写管理以下三种编程活动的 Java 应用程序:

  1. 连接到数据源,如数据库
  2. 将查询和更新语句发送到数据库
  3. 检索和处理从数据库接收的结果以回答查询

我们可以通过JDBC进行简单增删查改。但是JDBC使用的前提,下载jdbc各数据库的驱动包 ,我这里用Mysql为例子,我们找到对应版本的驱动包。

JDBCMysql的驱动包下载地址

下载完成之后,我们可以新建一个包把它放在里面,然后再进行找到File中的Project Structure进行下面操作,将包加载完毕



16ef5f4cc9ab4b8bbcc713ced1ccf163.png


350f46b96c534615b5095a7ccf70a23a.png

或者在pom.xml的dependencies节点中添加mysql驱动依赖:1e982fb77e8b44ffb3997a3e43597b33.png

68d2e27e85a645f6a1587ab62a322d1f.png

我们在使用之前先要去了解JDBC的常用方法。

2、JDBC的常用接口

1.Driver接口

Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

  • 装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");
  • 装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

2.Connection接口

Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。

使用DriverManager建立连接,需要三个参数

1)url:数据库连接的url(mysql端口号为3306)

格式如下: jdbc:mysql://数据库的ip地址:数据库的端口/数据库?参数名=参数值

注意:一般有多个参数名=参数值,如果使用8.x数据库,则需要额外加一个参数:allowPublicKeyRetrieval=true

2)user:数据库的用户名

3)password:数据库的密码

连接MySql数据库:

Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名/参数名=参数值", "user", "password");

常用方法:

  1. createStatement():创建向数据库发送sql的statement对象。
  2. prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
  3. prepareCall(sql):创建执行存储过程的callableStatement对象。
  4. setAutoCommit(boolean autoCommit):设置事务是否自动提交。
  5. commit() :在链接上提交事务。
  1. rollback() :在此链接上回滚事务。

3.Statement接口

  用于执行静态SQL语句并返回它所生成结果的对象。

  三种Statement类:

  • Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
  • PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

常用Statement方法(2,3方法特别重要):


execute(String sql):运行语句,返回是否有结果集

executeQuery(String sql):运行select语句,返回ResultSet结果集。

executeUpdate(String sql):运行insert/update/delete操作,返回的是int类型的结果,代表受影响的行数,如果为0,表示没有任何操作

addBatch(String sql) :把多条sql语句放到一个批处理中。

executeBatch():向数据库发送一批sql语句执行。

4.ResultSet接口

ResultSet提供检索不同类型字段的方法,常用的有:


getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。

getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。

getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。

getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。

getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

ResultSet还提供了对结果集进行滚动的方法:


next():移动到下一行

Previous():移动到前一行

absolute(int row):移动到指定行

beforeFirst():移动resultSet的最前面。

afterLast() :移动到resultSet的最后面。

使用后依次关闭对象及连接:ResultSet → Statement → Connection。这是因为在程序用完后要及时关闭数据库连接资源,以释放内存,避免资源耗尽。

3、JDBC的基本使用

1)、简单的增删查改

cbbaf990d501497e81fd86b42c4e4576.png

Ⅰ、查

package com.hk.sky;
import java.sql.*;
public class Jdbc {
    public static void main(String[] args) throws SQLException {
        // 1、使用DriverManager建立连接
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
                "root",
                "123456"
        );
        PreparedStatement pSta = conn.prepareStatement("select * from student");
         // 3、执行查询,返回结果集
        ResultSet rs = pSta.executeQuery();
        // 4、遍历结果集,获取查询结果
        //在获取查询结果之前,你需要了解表中各列的数据类型,以便用不同的数据类型的变量来进行接收
        // 通过字段名称去获取各字段对应的值,格式为: 值 = rs.get数据类型("字段名称")
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.println("id = " + id + ",name = " + name );
        }
        // 5、关闭连接,释放资源
        pSta.close();
        conn.close();
    }
}

结果:

id = 1,name = 李四
id = 2,name = 王五
id = 3,name = 张三
id = 4,name = 小明

Ⅱ、增

package com.hk.sky;
import java.sql.*;
public class Main
 {
    public static void main(String[] args) throws SQLException {
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
                "root",
                "123456"
        );
    PreparedStatement pSta=conn.prepareStatement("insert into student(id,name) values(?,?)");
        pSta.setInt(1,5);
        pSta.setString(2,"小三");
        int result=pSta.executeUpdate();
        if (result>0)
            System.out.println("添加成功");
        pSta.close();
        conn.close();
    }
}


结果:添加成功

49ae8ba1afd246b1854e06add129bb9c.png

Ⅲ、改

package com.hk.sky;
import java.sql.*;
public class Main {
    public static void main(String[] args) throws SQLException {
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
                "root",
                "123456"
        );
    PreparedStatement pSta=conn.prepareStatement("update student set id=?,name=?where id=?");
        //?为占位符,这是用来设置参数值,其中?的开始位置从1开始。
        pSta.setInt(1,6);
        pSta.setString(2,"齐天大圣");
        pSta.setInt(3,5);
        int result=pSta.executeUpdate();
        if (result>0)
            System.out.println("修改成功");
        pSta.close();
        conn.close();
    }
}

结果:修改成功

586fb03deda94101803eaf8558e8a98a.png

Ⅳ、删

package com.hk.sky;
import java.sql.*;
public class Main {
    public static void main(String[] args) throws SQLException {
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
                "root",
                "123456"
        );
        PreparedStatement pSta= conn.prepareStatement("delete from student where id = ?");
        //?为占位符,这是用来设置参数值,其中?的开始位置从1开始。
        pSta.setInt(1,6);
        int result=pSta.executeUpdate();
        if (result>0)
            System.out.println("删除成功");
        pSta.close();
        conn.close();
    }
}

结果:删除成功

3958d1d3b82d413cad1f7c54b1ce813b.png

2)简单封装

我们可以发现上面的增删查改中的代码只有中间需要去变化,因此为避免代码的冗余,我们就需要去封装起来开头连接和结尾的关闭,这样每次写代码我们只需要去写中间的部分代码


我们先把url,用户名和密码放在一个resources文件夹,并设置为资源文件夹,创建db.properties;


3c17fb7333c04f10b3da559a7b3080bc.png



2513f22c61114b5dbd3d79f062320212.png

资源文件夹如下图所示:

1044ef8e072947da9bf24ffe6823ca75.png

jdbc.url=jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=123456

然后再建一个utils包进行封装开头和结尾

package utils;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
 * 封装
 */
public class DBUtils {
    private static String url;
    private static String username;
    private static String password;
    // 读取配置文件
    static {
        Properties prop = new Properties();
        try {
            // DBUtils.class.getClassLoader().getResourceAsStream()方法可以从类路径中读取资源文件
            prop.load(DBUtils.class.getClassLoader().getResourceAsStream("db.properties"));
            // 通过key获取value
            url = prop.getProperty("jdbc.url");
            username = prop.getProperty("jdbc.username");
            password = prop.getProperty("jdbc.password");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    // 将创建连接的方法封装成静态方法,方便调用
    // 将url、username、password放到配置文件当中,然后读取出来
    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(
                    url,
                    username,
                    password
            );
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    // 将关闭连接的方法封装成静态方法,方便调用
    public static void close(ResultSet rs, PreparedStatement pStmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pStmt != null) {
            try {
                pStmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

下面我们来看看封装之后的如何去更新吧!

package com.hk.sky;
import utils.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
    public static void main(String[] args) throws SQLException {
        Connection conn = DBUtils.getConnection();
        PreparedStatement pstmt = conn.prepareStatement("update student set id = ?, name = ? where id = ?");
        //?为占位符,这是用来设置参数值,其中?的开始位置从1开始。
        pstmt.setInt(1, 1);
        pstmt.setString(2, "小四");
        pstmt.setInt(3, 1);
        //提醒:
        // pstmt.executeQuery()实现查询,返回查询的结果(结果集)
        // pstmt.executeUpdate()实现增、删、改,返回的是int类型的结果,代表受影响的行数,如果为0,表示没有任何操作
        int result = pstmt.executeUpdate();
        if (result > 0) {
            System.out.println("更新成功");
        }
        // 查询才会有ResultSet,因此此处第一个参数为null
        DBUtils.close(null, pstmt, conn);
    }
}

结果:小四


62187f10e4a94f81b9a875e960830076.png


还有剩下的查找,删除,更新也是类似的去修改之间部分,这就交给你们去实现。博主知识有限,望有错误请大佬指出!谢谢😀




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2天前
|
Java 数据库连接
JDBC跨平台封装工具类
JDBC跨平台封装工具类
|
Java 数据库连接 数据库
JDBC学习(三):封装工具类JDBCUtils类
为了以后方便进行数据库连接、数据库关闭、还有后面的连接池的操作等功能,现在将功能封装到JDBCUtils类当中,作为自己的一个工具箱。
344 0
|
2天前
|
Java 关系型数据库 MySQL
flea-db使用之封装JDBC接入
【4月更文挑战第6天】本篇 Huazie 介绍 Flea 框架下的 flea-db 模块中封装JDBC的逻辑
33 1
flea-db使用之封装JDBC接入
|
2天前
|
SQL Java 数据库连接
JDBC如何封装成Mybaits持久层框架只需4
本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。
18 0
|
2天前
|
SQL druid Java
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
32 0
|
2天前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(下)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
413 1
|
2天前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(中)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
31 0
|
2天前
|
SQL 存储 Java
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
46 0
|
9月前
|
Java 数据库连接
Java 中封装JDBC连接到JDBCUtils工具类的详解
Java 中封装JDBC连接到JDBCUtils工具类的详解
44 0
|
9月前
|
SQL 安全 Java
JDBC之DAO层封装思想超详解(下)
JDBC之DAO层封装思想超详解(下)