MySQL~Java的数据库编程:JDBC(JDBC的环境配置以及使用)

2023-05-16

 

目录

JDBC的环境配置

JDBC的使用步骤(Java操作数据库)

建立数据库连接

方式一:DriverManager

 方式二:DataSource(数据源/数据库连接池)

DataSource与DriverManager的对比 

创建操作命令对象Statement

Statement

PreparedStatement

CallableStatement

执行SQL语句

处理结果集 

释放资源 

JDBC实现查询操作完整代码


什么是JDBC?

JDBC即Java Database Connectivity,Java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个api由java.sql.*、javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.

· 多种:可以同时支持多种关系型数据库,可以任意切换(兼容性)

· 统一:使用一套标准的jdbc api操作的代码

JDBC的优势

· Java语言访问数据库操作完全面向抽象接口编程

· 开发数据库应用不用限定在特定数据库厂商的API

· 程序的可移植性增强 

JDBC的环境配置

①首先需要提前准备数据库驱动包

②创建项目,并创建一个lib目录,将jar包放置在lib目录中

③项目右键,打开当前项目的设置

④按照如下顺序将依赖包添加至项目中

⑤进行完上述步骤后即配置完成,之后检验是否配置成功即可.

只要能看到如上提示即配置成功.

JDBC的使用步骤(Java操作数据库)

数据库:是一个网络主机上的数据库服务端进程,需要使用URL来连接.

· 协议名:网络传输数据的格式

· 服务器地址:服务器(进程)所在主机对应的地址(ip,域名)

      本机的ip:127.0.0.1

      域名:localhost

· 服务器端口号:主机中端口绑定的一个进程

· 带层次的文件路径:服务资源(资源可能是一个文件,也可能是虚拟资源)

再进行下列jdbc操作之前,首先需要建立一个数据库,例如在下列演示中,我使用的是自己提前建好的db_test数据库,并针对其进行操作

建立数据库连接

方式一:DriverManager

import java.sql.*;
public class First {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1、建立数据库连接
        Class.forName("com.mysql.jdbc.Driver");
        /**
         * DriverManager是jdbc的api,Connection也是(Java.sql开头)
         * url:
         * ①服务器地址,看看是不是要连接的数据库ip/域名
         * ②带层次的路径:数据库名
         * ③用户名,密码
         */
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?user=root&password=142516&useUnicode=true&characterEncoding=UTF-8");
    }
}

 方式二:DataSource(数据源/数据库连接池)

连接池初始化时就创建了一定数量的数据库连接对象(Connection),一个程序连接某个数据库使用一个连接池就行.

import java.sql.Connection;
import java.sql.SQLException;

public class CourseQuery {
    public static void main(String[] args) throws SQLException {
        /**
         * 使用数据库连接池来获取数据库连接对象
         * 一个Java程序,创建多个还是1个连接池对象一个
         */
        MysqlDataSource ds = new MysqlDataSource();
        //url中的参数,可以使用方法来设置
        ds.setURL("jdbc:mysql://localhost:3306/db_test");
        ds.setUser("root");
        ds.setPassword("142516");
        //安全连接,如果不设置有警告
        ds.setUseSSL(false);
        //设置编码格式:按某个编码保存数据,也要按一样的编码来使用
        ds.setCharacterEncoding("UTF-8");
        Connection c = ds.getConnection();
    }
}

DataSource与DriverManager的对比 

· DriverManager每次都是新建一个物理连接,释放的时候是关闭物理连接,相当于实际操作MySQL中的点击关闭

· DataSource是初始化的时候就创建一定数量的连接,释放时只是重置并放回连接池,即可以实现复用

·  DriverManager效率低,而DataSource效率高

创建操作命令对象Statement

Statement对象用于执行sql代码,共有三种操作命令对象,分别为:StatementPreparedStatementCallableStatement.

Statement

不带占位符简单操作命令对象,用于执行不带参数的简单SQL语句

        //2、创建操作命令对象
        Statement s = c.createStatement();

PreparedStatement

 使用PreparedStatement创建操作命令对象时,需要对其传入sql语句

· 其用于执行带或不带参数的sql语句

· SQL语句会预编译在数据库系统

· 执行速度快于Statement对象

        //2.创建操作命令对象
        //使用PreparedStatement创建操作命令对象时,必须对其传入sql语句
        String sql = "select id, name from course where name=?";
        PreparedStatement ps = c.prepareStatement(sql);

CallableStatement

用于执行存储过程的,后续学习后会记录在该博客中.

执行SQL语句

· 如果是插入、修改、删除操作,调用executeUpdate方法,返回int类型表示处理成功多少条

//插入,修改,删除,都调用executeUpdate,返回int是执行成功多少条
int n = ps.executeUpdate();

· 如果是查询操作,处理结果集ResultSet,调用excuteQuery方法,返回结果集

由于在利用PreparedStatement创建操作命令对象时已经传入了sql语句,因此在执行的时候就不需要再传了. 

//Statement创建操作命令对象
ResultSet rs = s.executeQuery("select id, name from course");
//PreparedStatement创建操作命令对象
ResultSet rs = ps.executeQuery();

处理结果集 

        while(rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.println(String.format("id: %d,name: %s\n",id, name));
        }

释放资源 

 反向释放(ResultSet -> Statement -> Connection),都是调用close方法释放

        //关闭结果集
        if(rs != null) {
            try {
                rs.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }

        }
        //关闭命令
        if(s != null) {
            try {
                s.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
        //关闭连接
        if(c != null) {
            try {
                c.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }

JDBC实现查询操作完整代码

下述为Java操作数据库实现查询操作的完整代码,创建操作命令对象时利用Statement创建,并实现根据用户输入来查询的操作.

package org.example;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import java.sql.*;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Li_yizYa
 * Date: 2022—05—03
 * Time: 19:43
 */
public class CourseQuery {
    public static void main(String[] args) throws SQLException {
        //1.连接数据库
        /**
         * 使用数据库连接池来获取数据库连接对象
         * 一个Java程序,创建多个还是1个连接池对象一个
         */
        MysqlDataSource ds = new MysqlDataSource();
        //url中的参数,可以使用方法来设置
        ds.setURL("jdbc:mysql://localhost:3306/db_test");
        ds.setUser("root");
        ds.setPassword("142516");
        //安全连接,如果不设置有警告
        ds.setUseSSL(false);
        //设置编码格式:按某个编码保存数据,也要按一样的编码来使用
        ds.setCharacterEncoding("UTF-8");
        Connection c = ds.getConnection();
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入要查找的书名:>");
        String inputName = scan.nextLine();

        //2.创建操作命令对象
        //使用PreparedStatement创建操作命令对象时,必须对其传入sql语句
        String sql = "select id, name from course where name=?";
        PreparedStatement ps = c.prepareStatement(sql);
        /**
         * 替换占位符: setXXX(index, value)
         * XXX: 值的类型
         * index: 是占位符的索引位置(从1开始)
         * value: 要替换的值
         */
        ps.setString(1, inputName);

        //3.执行sql语句
        ResultSet rs = ps.executeQuery();

        //4.处理结果集
        while (rs.next()){//遍历每一行数据
            //获取id字段的值
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.printf("id: %s, name: %s\n", id, name);
        }
        //5.释放资源:反向释放(resultSet, Statement, Connection).close()
        if(rs != null) {
            try {
                rs.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }

        }
        //关闭命令
        if(ps != null) {
            try {
                ps.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
        //关闭连接
        if(c != null) {
            try {
                c.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

· 数据库中目前存储了六本书,可以随意查询以下六本书

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL~Java的数据库编程:JDBC(JDBC的环境配置以及使用) 的相关文章

  • Hadoop伪分布集群配置(我用的是VMwareWorkstation)

    1 虚拟机环境准备 xff1a 1 0 xff09 首先准备好一台已经安装好了的虚拟机 我这里用的是Centos 2 0 xff09 安装 vim 编辑器 使用 yum y install vim 也可以直接用vi 注意 xff1a 安装好
  • fork函数的用法

    1 头文件 include lt sys types h gt inlcude lt unistd h gt 2 函数原型 pid t fork void 函数参数 xff1a void 3 fork函数功能 fork xff08 xff0
  • gitee配置流水线实现自动打包vue

    1 任务编排 xff1a 第1步 xff1a 创建一个构建任务 xff0c 选择nodejs xff1b 第2步 xff1a 编写构建命令 设置NPM源 xff0c 提升安装速度 npm config set registry https
  • Linux操作系统:Firewalld防火墙

    Linux操作系统 xff1a Firewalld 防火墙 课堂引入 xff1a Linux防火墙是通过netfilter来处理的 xff0c 它是内核级别的框架 iptables被作为netfilter的用户态抽象层 xff0c ipta
  • 全景图拼接

    目录 一 图像拼接基本流程 二 RANSAC 随机一致性采样 2 1 RANSAC基本思想 xff1a 数据中包含正确的点和噪声点 xff0c 合理的模型应该能够在描述正确数据点的同时摒弃噪声点 2 2 RANSAC基本流程 xff1a 2
  • 11. JS操作节点续(2) + DOM 重点核心

    关于dom操作 xff0c 我们主要针对于元素的操作 主要有创建 增 删 改 查 属性操作 事件操作 DOM xff1a 我们获取过来的DOM元素是一个对象 xff08 object xff09 xff0c 所以称为 文档对象模型 创建 d
  • Docker-使用篇

    文章目录 一 Docker镜像和容器 镜像命令镜像下载 xff08 pull xff09 查看镜像 xff08 images xff09 镜像搜索 xff08 search xff09 删除镜像 xff08 rmi xff09 容器命令新建
  • Rviz上发布的点位信息机器人不执行(网络配置原因)已解决

    在调试机器人时发现Rviz上发布的点位信息机器人没有执行 xff0c 经检查是由于网络配置原因 xff0c 本文记录解决方法 使用ssh将笔记本与实物机器人连接 xff0c 机器人中控使用的工控机 xff0c 机器人作为显示器和键盘输入 p
  • gazebo小车自主路径规划导航仿真

    gazebo小车自主路径规划仿真 在之前的文章中完成了对地图的构建 xff0c 接下来使用 Ros navgition完成机器人自主导航 首先是Ros navigation的下载安装 ros功能包 xff1a Navigation ros
  • 关于结构体对齐

    首先我们先了解一下各数据类型所占的字节数 x64系统 xff08 64位 xff09 x86系统 xff08 32位 xff09 在这里有一个很有意思的点 xff0c 我使用VS在x86与x64系统下运行出来的long类型所占据的空间都是4
  • 安装docker报出的错误及解决方案

    1 错误一 xff1a 解决方案 xff1a yum erase podman buildan yum install y docker ce allowerasing 重启服务 systemtl restart docker yum源的安
  • make、makefile的使用解释(Linux项目自动化构建工具)

    本文所使用系统为Linux centos 7 makefile是一个文件 里面包含了 xff1a 1 文件与文件的依赖关系 2 文件与文件的依赖方法 为什么需要包含文件与文件的依赖方法和依赖方法呢 xff1f 一个工程中的源文件不计数 xf
  • elementUI中neditor第一次加载无法正常赋值的解决方法

    1 lt neditor v if 61 34 neditorLoad 34 v model 61 34 formFields content 34 class 61 34 wd editor 34 gt 加上v if 61 34 nedi
  • Gazebo仿真中光源的设置

    目录 写在前面官方文档链接point类型directional类型spot类型 写在前面 最近研究在Gazebo中仿真px4 xff0c 使用Apriltag ros包对Apriltag二维码检测的时候发现光源对检测影响非常大 xff0c
  • 使用Java操作Hbase

    目录 修改hosts文件 导入jar包 配置hbase信息 xff0c 连接hbase数据库 创建表 删除表 获取namespace 获取tables 添加数据 查询表中的数据 查询表中所有数据 关闭流 修改hosts文件 位置 xff1a
  • CAN协议国际标准化协议部分总结(一)

    前言 xff1a 本文主要是对CAN协议中ISO11898做一个简短的总结 ISO11898 ISO11519 ISO15765 CAN协议在OSI模型中包含三层 xff0c 物理层 数据链路层和传输层 各层中CAN定义内容可参考下图 其协
  • STM32 串口 DMA 数据读取(详细代码)

    最近重新开始学32 xff0c 搞到串口 DMA 的时候 xff0c 数据读取卡了很长一段时间 xff0c 最终 xff0c 功夫不负有心人终于搞出来了 在此以记录一下 xff0c 方便以后查询使用 在调试的过程中也遇到了很多bug xff
  • 在阿里云购买Linux服务器,配置宝塔环境,全图文,最最详细图解,保姆级教学

    在阿里云购买Linux服务器 xff08 CentOs 7 xff09 xff0c 配置宝塔环境 一 在阿里云购买CentOs服务器 Linux系统 CentOS是免费的 开源的 可以重新分发的开源操作系统 xff0c CentOS xff
  • (Linux)FreeRTOS(任务)

    任务调度器 调度器就是使用相关的调度算法来决定当前需要执行的任务 xff0c 调度器总是在所有处于就绪列表的任务中 xff0c 选择具有最高优先级的任务来执行 抢占式调度 xff1a 主要是针对优先级不同的任务 xff0c 每个任务都有一个
  • 制作一个串口助手 | python + pyqt5

    目录 一 背景 1 1 开发流程图 二 前提 2 1 关于环境 2 2 关于源码 三 步骤 3 1 使用pyqt创建一个 ui界面并生成 py文件 3 2 创建两个 py文件 xff0c 一个用来继承ui界面生成的 py类 xff0c 一个

随机推荐