JDBC的简单使用与封装

news2024/12/27 13:52:04

目录

1、JDBC

 2、JDBC的常用接口

1.Driver接口

2.Connection接口

 3.Statement接口

4.ResultSet接口

 3、JDBC的基本使用

1)、简单的增删查改

Ⅰ、查

 Ⅱ、增

Ⅲ、改

 Ⅳ、删

 2)简单封装

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进行下面操作,将包加载完毕。

 我们在使用之前先要去了解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端口号为306
格式如下: 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() :在链接上提交事务。
  6. rollback() :在此链接上回滚事务。

 3.Statement接口

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

  三种Statement类:

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

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

  1. execute(String sql):运行语句,返回是否有结果集
  2. executeQuery(String sql):运行select语句,返回ResultSet结果集。
  3. executeUpdate(String sql):运行insert/update/delete操作,返回的是int类型的结果,代表受影响的行数,如果为0,表示没有任何操作
  4. addBatch(String sql) :把多条sql语句放到一个批处理中。
  5. executeBatch():向数据库发送一批sql语句执行。

4.ResultSet接口

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

  1. getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
  2. getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
  3. getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
  4. getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
  5. getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

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

  1. next():移动到下一行
  2. Previous():移动到前一行
  3. absolute(int row):移动到指定行
  4. beforeFirst():移动resultSet的最前面。
  5. afterLast() :移动到resultSet的最后面。

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

 3、JDBC的基本使用

1)、简单的增删查改

Ⅰ、查

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

 结果:添加成功

Ⅲ、改

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

结果:修改成功

 Ⅳ、删

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

结果:删除成功

 2)简单封装

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

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

 

 资源文件夹如下图所示:

 

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

结果:小四

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2018年全国职业技能大赛中职组“网络安全”赛项—基础题(解析)

2018年全国职业技能大赛中职组“网络安全”赛项—基础题(解析) 任务一、nmap 1、nmap sP -n 192.168.100.133 //进行ping扫描 1.1、nmap -Pn -n 192.168.100.133 //目标禁用 绕过ping 扫描 2、nmap -A -n ip // 对ip进行综合性扫描 3、nmap -O -n…

TiDB-学习笔记

编写这个笔记,希望能记录下学习TiDB时候的知识点。 目录 第一章 1.事务 1.1 SQL-92标准: 1.2 事务的隔离级别 2.在TiDB学习 SQL 语句 第二章 第三章 第一章 1.事务 事务的特性(ACID) atomicity原子性、consistency一致性、i…

网上花店网页代码 html静态花店网页设计制作 dw静态鲜花网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

全志V853 在 NPU 转换 YOLO V3 模型

NPU 转换 YOLO V3 模型 YOLO 全称是 You Only Look Once(你只需看一次),从名称上也能看出这种算法速度快的优势,因此在许多边缘设备上,YOLO 算法的使用十分广泛。YOLOV3 是华盛顿大学研究生 Joseph Redmon 所开发&…

matlab学习笔记(九)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 matlab学习笔记(九)一、信号采样二、信号重建一、信号采样 信号的采样原理图如下图所示: 其数学模型表示为: 其中的f(t)为原…

11、Mysql高级之SQL优化

11、Mysql高级之SQL优化 文章目录11、Mysql高级之SQL优化0 SQL优化1 大批量插入数据2 优化insert语句3 优化order by语句3.1 环境准备3.2 两种排序方式3.3 Filesort 的优化4 优化group by 语句5 优化嵌套查询6 优化OR条件7 优化分页查询7.1 优化思路一7.2 优化思路二8 使用SQL提…

【Budibase】搭建低代码开发平台

Budibase介绍 Budibase 是一套开源的低代码开发平台,支持一键数据库及API 接入,支持简单的 JS 关联前后端数据,有细致的权限访问管理,对移动端有良好的支持。它主打企业流程自动化,有完善的自动化流程设计&#xff0c…

NETDMIS5.0界面介绍

1.启动界面介绍 双击桌面快捷方式,打开NET.DMISS启动界面如下图,包含三个菜单是文件、设置语言、帮助。 2.工作界面介绍 默认测量界面包括主菜单,工具条,节点程序界面(显示测量过程),CAD视窗…

(免费分享)基于ssm简易网盘系统

开发工具:IDEA,mysql5.7 Tomcat8.0,jdk1.8 package cn.tangtj.clouddisk.web;import cn.tangtj.clouddisk.entity.User; import cn.tangtj.clouddisk.utils.UserUtil; import org.apache.logging.log4j.LogManager; import org.apache.loggi…

嵌入式应用开发|Linux文件I/O常用的四种访问方式

在Linux系统中&#xff0c;一切都可以看成"文件"<通常包含&#xff1a;普通文件、驱动文件、网络通信文件等等>&#xff0c;系统中所有的操作都可以通过文件I/O实现&#xff0c;因此&#xff0c;掌握文件常用接口很有必要。 0.前言 屏幕前的你如果懂得main函数…

SAP S4 如何快速配置一家公司

之前配置公司采用的方法是copy的方式来配置&#xff0c;后来在做其他配置的时候发现&#xff0c;copy的方法会把很多不需要的配置也copy进来了。所就我从新定义了一个公司来进行学习研究。配置一定空的公司很简单&#xff0c;只需要三步&#xff1a; 1 定义和分配公司 • 公司…

Java中的异常、IO与NIO面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

萤石网络通过注册:9个月净利2亿同比降28% 海康威视为大股东

雷递网 雷建平 12月19日杭州萤石网络股份有限公司&#xff08;简称&#xff1a;“萤石网络”&#xff09;日前通过注册&#xff0c;准备在科创板上市。萤石网络计划募资37.39亿元&#xff0c;其中&#xff0c;22亿元用于萤石智能制造重庆基地项目&#xff0c;8亿元用于新一代物…

论文投稿指南——中文核心期刊推荐(航空、航天)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

做Python网络爬虫需要掌握哪些核心技术?

在当下这个社会&#xff0c;如何有效地提取并利用信息成为一个巨大的挑战。基于这种巨大的市场需求&#xff0c;爬虫技术应运而生&#xff0c;这也是为什么现在爬虫工程师的岗位需求量日益剧增的原因。那么做Python网络爬虫需要掌握哪些核心技术呢&#xff1f;下面我们来一起看…

机器学习 特征工程及模型聚合

目录 一&#xff1a;什么是特征工程 二&#xff1a;特征工程方法 三&#xff1a;独热编码 四&#xff1a;归一化处理 五&#xff1a;特征工程方法 六&#xff1a;特征工程处理过程 七&#xff1a;Kaggle房价预测实际案例 一&#xff1a;什么是特征工程 1 是最大限度地从…

React源码分析6-hooks源码

本文将讲解 hooks 的执行过程以及常用的 hooks 的源码。 hooks 相关数据结构 要理解 hooks 的执行过程&#xff0c;首先想要大家对 hooks 相关的数据结构有所了解&#xff0c;便于后面大家顺畅地阅读代码。 Hook 每一个 hooks 方法都会生成一个类型为 Hook 的对象&#xff…

学习->C++篇十八:一文总结C++的异常

目录 C为什么要引入异常&#xff1f; 什么是异常&#xff1f; 怎么使用异常处理错误&#xff1f; 异常的抛出规则&#xff1a; 异常的匹配规则&#xff1a; 单个catch语句&#xff0c;不能完全处理掉异常&#xff1f;重新抛出异常 什么是异常安全问题&#xff1f; 什么…

一、绘制折线图

Origin-绘图 一、新建绘图表格 Add New Column&#xff1a;新建一列 Set as→Y Error设置新列为Y误差 Long Name&#xff1a;X轴和Y轴名称&#xff1b;Units&#xff1a;单位&#xff1b;Comments&#xff1a;注释&#xff1b; 二、绘图 绘制折线图&#xff1a; 选择X、Y、…

2022年,转行IT学哪些编程语言更容易拿高薪?

人们都说年头年尾都是给自己进行规划最好的时段&#xff0c;想要学习编程的你现在是不是也开始进行规划了呢&#xff1f; 不过对大部分人来说&#xff0c;最犹豫的问题也摆在面前&#xff0c;编程语言众多&#xff0c;不知道学什么才能对后续的就业和职业发展有更好的作用。 …