MySQL之JDBC编程

目录

1. 数据库编程的必备条件

2. Java的数据库编程:JDBC 

3. JDBC工作原理 

4. JDBC使用 

 4.1 IDEA配置JDBC

4.2 JDBC开发案例 

4.3 JDBC使用步骤总结  

5. JDBC常用接口和类 

5.1 JDBC API 

5.2 数据库连接Connection 

5.3 Statement对象 

5.4 ResultSet对象


 

1. 数据库编程的必备条件

  • 编程语言,如 Java C C++ Python 等;
  • 数据库,如Oracle MySQL SQL Server 等;
  • 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL 提供了Java 的驱动包 mysql-connector-java ,要基于 Java 操作 MySQL 即需要该驱动包。同样的,要基于Java 操作 Oracle 数据库则需要 Oracle 的数据库驱动包 ojdbc  

2. Java的数据库编程:JDBC 

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

3. JDBC工作原理 

 JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。

JDBC 访问数据库层次结构:

JDBC优势:

  1. Java语言访问数据库操作完全面向抽象接口编程
  2. 开发数据库应用不用限定在特定数据库厂商的API
  3. 程序的可移植性大大增强

4. JDBC使用 

 4.1 IDEA配置JDBC

首先我们要准备数据库驱动包:

1、下载数据库驱动包

进入https://mvnrepository.com/ 这个链接,在搜索栏输入JDBC Drivers,如图:

点击搜索之后,会出现如下页面,然后点击箭头所指:

进去以后,会有很多的版本,选择你所需要的版本,在这里我们选择 5.1.49 版本:

点进去之后,出现如下界面:

点击箭头所指方框中的 .jar 文件,进行下载,下载之后无需解压。

 找到你所下载的依赖包mysql-connector-java-5.1.49.jar:

找到之后选中它,进行复制(直接Ctrl+C即可)。 

 2、在项目中创建文件夹lib(右击你所创建的项目,之后如图):

点击过后,出现下图,填写你要创建的文件名(lib)即可: 

若此处出现lib文件夹,说明创建成功。

3、将刚才复制的依赖包mysql-connector-java-5.1.49.jar粘贴(Ctrl+V)到lib中:

4、右击复制过来的依赖包,在列表中选择Add as Library,点击它 

5、这时这个包就可以点开了,说明配置成功

4.2 JDBC开发案例 

  • 创建数据源
//1、创建数据源,描述了要操作的数据库在哪里
        DataSource dataSource = new MysqlDataSource(); //向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java110?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

对于创建的数据源对象,所调用的三个方法:

1、setUrl方法,对于URL参数有:

2、setUser方法,里面传的是用户名,一般默认为root

3、setPassword方法,里面传的是你要连接的数据库的密码

  •  建立数据库连接
 //2、和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
  • 构造一个SQL语句,并转成语句对象 

以插入为例: 

String sql = "insert into student values(1,'小明')";
//需要把String str转成语句对象
PreparedStatement  statement = connection.prepareStatement(sql);
  • 执行SQL语句 
 //4、把构造好的sql发送给服务器去执行
        int n = statement.executeUpdate();
        System.out.println("n = "+n);
  • 释放资源 
//5、最后一步释放必要的资源
        statement.close();
        connection.close();

完整代码:

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

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class TestJDBC {
    public static void main(String[] args) throws SQLException {

        //1、创建数据源,描述了要操作的数据库在哪里
        DataSource dataSource = new MysqlDataSource(); //向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java110?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        //2、和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        //3、构造一个SQL
        String sql = "insert into student values(1,'小明')";

        //需要把String str转成语句对象
        PreparedStatement  statement = connection.prepareStatement(sql);

        //4、把构造好的sql发送给服务器去执行
        int n = statement.executeUpdate();
        System.out.println("n = "+n);  //执行成功,会返回一个数字

        //5、最后一步释放必要的资源
        statement.close();
        connection.close();
    }
}

若想要实现由用户自己来输入要插入的值(我们这里举的例子是插入学生的学号,姓名),代码可以这样写:

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

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class TestJDBC {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入学号:");
        int id = scanner.nextInt();

        //1、创建数据源,描述了要操作的数据库在哪里
        DataSource dataSource = new MysqlDataSource(); //向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java110?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        //2、和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        //3、构造一个SQL
        String sql = "insert into student values(?,?)";
        //需要把String str转成语句对象
        PreparedStatement  statement = connection.prepareStatement(sql);

        statement.setInt(1,id);
        statement.setString(2,name);
        //4、把构造好的sql发送给服务器去执行
        int n = statement.executeUpdate();
        System.out.println("n = "+n);

        //5、最后一步释放必要的资源
        statement.close();
        connection.close();
    }
}

上述代码中的 ?为占位符,下标从1开始。之后可以用PreparedStatement中的setInt方法和setString方法,将用户输入的信息与其对应。

MySQL中的增删改操作都是类似的,这里只介绍了插入操作,删除和修改操作可以自己动手去试试。对于查询操作(select),他需要返回一个结果集,下面是执行查询操作SQL语句的代码:

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

import javax.jws.soap.SOAPMessageHandlers;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestJDBCSelect {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java110?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        Connection connection = dataSource.getConnection();

        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        ResultSet resultSet = statement.executeQuery();
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("id: "+id);
            System.out.println("name: "+name);
        }

        //释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

4.3 JDBC使用步骤总结  

  1. 创建数据库连接Connection
  2. 创建操作命令Statement
  3. 使用操作命令来执行SQL
  4. 处理结果集ResultSet
  5. 释放资源

5. JDBC常用接口和类 

5.1 JDBC API 

Java JDBC 编程中对数据库的操作均使用 JDK 自带的 API 统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握 Java 数据库编程。

5.2 数据库连接Connection 

Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:

  • 一种是通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
  • 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象。
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();

上面我们JDBC开发案例用的就是数据源这种方式。 

  • 以上两种方式的区别是:
  1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源
    时,通过connection.close()都是关闭物理连接。
  2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接
    是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将
    Conncetion连接对象回收。

5.3 Statement对象 

Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。

 

实际开发中最常用的是 PreparedStatement 对象,以下对其的总结:

主要掌握两种执行 SQL 的方法:
  • executeQuery() 方法执行后返回单个结果集的,通常用于select语句
  • executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于updateinsertdelete语句

5.4 ResultSet对象

ResultSet 对象它被称为结果集,它代表符合 SQL 语句条件的所有行,并且它通过一套 getXXX 方法提供了对这些行中数据的访问。ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet next() 方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
面试问答:
1. 数据库连接有哪些方式?分别有什么区别?

 2. 数据库StatementPreparedStatement有什么区别?

 这两个问题上述内容已有答案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SVM的车牌识别算法

基于SVM的车牌识别系统(Python代码实现) 车牌识别系统是智能交通系统的重要组成部分,有着广泛的应用。车牌识别系统主要有车牌定位、字符分割和字符识别三部分组成,本文的研究重点是车牌字符识别这部分,本文提出了一种…

QT 搭建opencv 环境

1. 准备工具CMake 一、CMake介绍 CMake是一个被广泛使用的、开源免费并且完全跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C特性,类似UNIX下的aut…

html手势密码解锁插件(附源码)

文章目录 1.设计来源1.1 界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134534785 html手势密码解锁插件(附源码),仿手机手势密码,拖动九…

最新绿豆APP源码苹果CMS影视插件版本/原生JAVA源码+反编译开源+免授权

源码简介: 最新绿豆APP源码苹果CMS影视插件版本,它是原生JAVA源码反编译开源免授权,绿豆影视对接苹果CMS,它可以支持多功能自定义DIY页面布局。 1、新版绿豆视频APP视频6.1插件版反编译指南及教程 2、后端插件开源,可…

图形编辑器开发:自定义光标管理

大家好,我是前端西瓜哥。 今天来讲讲如何在图形编辑器中使用自定义光标,并对光标其进行管理。 编辑器 github 地址: https://github.com/F-star/suika 线上体验: https://blog.fstars.wang/app/suika/ 自定义光标的意义是什么&am…

【Docker】从零开始:4.为什么Docker会比VM虚拟机快

【Docker】从零开始:4.为什么Docker会比VM虚拟机快 docker有着比虚拟机更少的抽象层docker利用的是宿主机的内核,而不需要加载操作系统OS内核 docker有着比虚拟机更少的抽象层 由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接…

关于一些网络的概述

语义分割网络是一种基于深度学习的计算机视觉技术,它能够将图像中的每个像素分配给特定的类别,从而实现对图像中不同对象的精确识别和定位。近年来,随着深度学习技术的不断发展,语义分割网络在各个领域都取得了显著的进展。 早期的语义分割网络主要采用全卷积神经网络(FC…

时序预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 x 基本介绍 1.Matlab实现LSTM-Adaboost时间序列预测…

数据库基础入门 — SQL

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…

《多GPU大模型训练与微调手册》

全参数微调 Lora微调 PTuning微调 多GPU微调预备知识 1. 参数数据类型 torch.dtype 1.1 半精度 half-precision torch.float16:fp16 就是 float16,1个 sign(符号位),5个 exponent bits(指数位),10个 ma…

数学几百年重大错误:将两异函数误为同一函数

黄小宁 因各实数都可是数轴上点的坐标所以数集A可形象化为数轴上的点集A,从而使x∈R变换为实数yxδ的几何意义可是:一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)运动到新的位置yxδ还在管道g内(设各点只作位置改变而没别的改变即变位前…

Ubuntu下载离线安装包

旧版Ubuntu下载地址 https://old-releases.ubuntu.com/releases/ 下载离线包 sudo apt-get --download-only -odir::cache/ncayu install net-tools下载snmp离线安装包 sudo apt-get --download-only -odir::cache/root/snmp install snmp snmpd snmp-mibs-downloadersudo a…

Linux下安装Foldseek并从蛋白质的PDB结构中获取 3Di Token 和 3Di Embedding

0. 说明: Foldseek 是由韩国国立首尔大学 (Seoul National University) 的 Martin Steinegger (MMseqs2 和 Linclust 的作者) 开发的一款用于快速地从大型蛋白质结构数据库中检索相似结构蛋白质的工具,可以用于计算两个蛋白之间的结构相似性&#xff0c…

TensorFlow实战教程(十九)-Keras搭建循环神经网络分类案例及RNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。这篇文章将详细讲解循环神经网络RNN的原理知识,并采用Keras实现手写数字识别的RNN分类案例及可视化呈现。基础性文…

多元函数奇偶性

多元函数奇偶性 多元函数的定义域 定义域根据函数的变量数不同,有不同的形式 一元函数 y f ( x ) yf(x) yf(x),定义域可以是数集二元函数 z f ( x , y ) zf(x,y) zf(x,y),定义域可以是一平面区域,是平面点集三元函数 v f ( x , y , z ) vf(x,y,z) vf(x,y,z),定义域是一块空…

基于骑手优化算法优化概率神经网络PNN的分类预测 - 附代码

基于骑手优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于骑手优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于骑手优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

spark内置数据类型

在用scala编写spark的时候,假如我现在需要将我spark读的数据源的字段,做一个类型转换,因 为需求中要拼接出sql的create table语句,需要每个字段的sql中的类型,那么就需要去和sparksql 中的内置数据类型去比对。 写s…

光伏、储能双层优化配置接入配电网研究(附带Matlab代码)

由于能源的日益匮乏,电力需求的不断增长等,配电网中分布式能源渗透率不断提高,且逐渐向主动配电网方向发展。此外,需求响应(demand response,DR)的加入对配电网的规划运行也带来了新的因素。因此,如何综合考…

Linux docker安装RStudio Server结合内网穿透实现公网访问内网服务

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅cpolar 🌅 有航道的人,再渺小也不会迷途。 文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5…