JDBC编程的基本流程

news2025/7/11 10:00:53

文章目录

  • 1、创建数据源
  • 2、让代码和数据源建立连接
  • 3、操作数据库
    • 3.1 插入操作
    • 3.2 删除操作
    • 3.3 修改操作
    • 3.4 查找操作

1、创建数据源

  1. 创建DataSource对象,这个对象描述了数据库服务器在哪,需要导入包javax.sql.DataSource
DataSource databases = new MysqlDataSource();
  1. 设置数据库所在的地址
((MysqlDataSource) databases).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");

jdbc:mysql 表示这个url是用于jdbc mysql的url
127.0.0.1 表示mysql服务器所在的主机的ip值,这里意为本机
3306 表示端口号,mysql的默认端口号就是3306
mydb_one 表示我的数据库名
characterEncoding=utf8 服务器的字符集,如果你的服务器字符集是utf8mb4也写成utf8
useSSL=false 表示传输过程中,不需要加密

  1. 设置登录数据库的用户名
((MysqlDataSource) databases).setUser("root");
  1. 设置登录数据的密码
((MysqlDataSource) databases).setPassword("fl12345.0");

以上写法还能换成另一种写法

MysqlDataSource database = new MysqlDataSource();
database.setURL();
database.setUser("root");
database.setPassword("fl12345.0");

但是第一种写法是更常见的习惯写法,因为代码中持有的实例是DataSource类型,后面一些其他代码如果需要用到DataSource,相关的参数也是DataSource,未来如果数据库进行切换,代码几乎不用改动——低耦合

第二种写法就会导致代码中导出散播着MysqlDataSource这条的类型,如果要进行数据库切换,代码中很多地方都需要修改——高耦合

2、让代码和数据源建立连接

前面创建好数据源,只是描述了一下这个数据源在哪,但我们并没有实际的去访问这个数据源

例如快递小哥给我打电话,让我去取快递,但实际上我可以选择不去,或者稍后再去取。真正去取快递这个操作,就相当于和数据库建立连接

Connection connection = dataSource.getConnection();

当我们去使用getConnection()方法时,会返回一个Connection对象,idea会给我们提示有很多的Connection,一定要认准,使用的是JDBC的Connection,不是MySQL驱动包里面的Connection,更不是其它的Connection

在这里插入图片描述

创建数据源的哪一个步骤出现差错,在建立连接的时候都会抛出SQLException,因此我们需要显示处理SQLException

3、操作数据库

操作数据库的关键就是构造一个SQL语句

3.1 插入操作

String sql = "insert into student values(1, 'fl')";

//数据库中的student表
//+-------+-------------+------+-----+---------+-------+
//| Field | Type        | Null | Key | Default | Extra |
//+-------+-------------+------+-----+---------+-------+
//| id    | int(11)     | YES  |     | NULL    |       |
//| name  | varchar(20) | YES  |     | NULL    |       |
//+-------+-------------+------+-----+---------+-------+

在JDBC中构造SQL,不必带上分号, 分号只是在命令行中用来区分不同的语句,现在是直接在代码上操作

此处光是一个String类型的sql还不行,需要把这个Sring包装成一个“语句对象”

PreparedStatement statement = connection.prepareStatement(sql);

通过connection里面的prepareStatement这个方法来构造语句对象,这操作就是把字符串风格的sql转成了一个JDBC里面的对象

执行sql

int ret = statement.executeUpdate();

返回值就表示影响了几行

SQL中如果是insert, update, delete, 都使用executeUpdate 方法
如果是select, 则使用executeQuery 方法

sql执行完毕后,还需要释放资源

statement.close();
connection.close();

先释放statement,再释放connection 先创建的后释放,后创建的先释放

整个插入数据已经执行完毕,但是插入的数据都是直接给定的,但实际上大概率我们是需要灵活的处理要插入的数据,例如让用户通过控制台,输入想要插入的数据

Scanner scanner = new Scanner(System.in);

//让用户通过控制台输入一下待插入的数据
System.out.print("请输入id:");
int id = scanner.nextInt();
System.out.print("请输入名字:");
String name = scanner.next();

此时就需要把id和name替换到insert语句中的对应位置上,此处就有两种方式
第一种: 通过字符串拼接这个操作来构造sql,虽然可以,但是不推荐,因为这么写非常麻烦,容易写错,其次就是容易引起“SQL注入”

第二种: 使用代替写法,避免直接拼接字符串

String sql = "insert into student values(?, ?);
PreparedStatement statement = connection.prepareStatement(sql);

//插入多条记录
//String sql = "insert into student values(?, ?), (?, ?)";//下标1,2,3,4  并非1,2,1,2

?相当于告诉java程序,这两个字段的值,还不确定,先占个位置,再使用PreparedStatement的setXXX系列的方法进行替换
setXXX方法有很多,需要让这里的方法和数据库的列的类型匹配
进行替换操作

statement.setInt(1, id); //把第一个?替换成id
statement.setString(2,name); //把第二个?替换成name

这里就是在执行具体的替换操作,从下标1还是计算。

最后还需要执行sql

3.2 删除操作

让用户输入一个id,根据id来删除

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");

//2.建立链接
Connection connection = (Connection) dataSource.getConnection();

//3.输入id
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要删除的id:");
int id = scanner.nextInt();

//4.拼接SQL
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);

//5.执行SQL
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
System.out.println(statement);

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

删除操作和插入操作几乎是一模一样

3.3 修改操作

根据id修改学生姓名

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");

//2.建立链接
Connection connection = (Connection) dataSource.getConnection();

//3.输入id
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要修改的学生id:");
int id = scanner.nextInt();
System.out.print("请输入要修改的学生姓名:");
String name = scanner.next();

//4.拼接SQL
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, name);
statement.setInt(2, id);

//5.执行sql
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
System.out.println(statement);

//6.关闭资源
statement.close();
connection.close();

修改操作和插入操作几乎是一模一样

3.4 查找操作

查找操作和前面的三个操作相比,要复杂一些,查找操作需要对结果进行访问

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");

//2.建立链接
Connection connection = (Connection) dataSource.getConnection();

//3.拼接SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);

//4.执行SQL,对于查询操作,就需要使用executeQuery
//  查询操作的返回结果不是一个int,而是一张"临时表"
//使用ResultSet表示这张临时表
 ResultSet resultSet = statement.executeQuery();

//5.遍历结果集合(返回临时表),先获取到这一行,再获取到这一行中的若干行
//  如果遍历到表的结束位置,此处的next也就返回false
//+-------+-------------+------+-----+---------+-------+
//| Field | Type        | Null | Key | Default | Extra |
//+-------+-------------+------+-----+---------+-------+
//| id    | int(11)     | YES  |     | NULL    |       |
//| name  | varchar(20) | YES  |     | NULL    |       |
//+-------+-------------+------+-----+---------+-------+
//  next方法表示获取到一行记录,同时把光标往后移动一行
while (resultSet.next()){
    //针对这一行获取到其中的列
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("id = "+ id +", name = " + name);
}

//6.释放资源
resultSet.close();//resultSet也需要释放
statement.close();
connection.close();

在获取每一列的数据时,需要用对应的类型去接受,不可混用

在使用get系列方法时,会有两种
在这里插入图片描述
第一种传的参数是第几列(从1开始)
第二种传的参数是列的名字(主要用这个)

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

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

相关文章

【第006篇】通过impdp命令导入dmp文件到Oracle11g数据库中

准备:按照dmp文件的账号密码,如 gwpc/gwpc 创建好表空间、用户等信息。 1、执行以下命令获取DATA_PUMP_DIR的值。 select * from dba_directories;2、将上图圈主的那个路径复制出来备用:/opt/oracle/app/admin/orcl/dpdump/ 3、将dmp文件放…

3.35 OrCAD中怎么产生Cadence Allegro的第一方网表?OrCAD软件输出Cadence Allegro第一方网表报错时应该怎么处理?

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

从0开始搭建ELK日志收集系统

Elasticsearch elasticsearch是一个高度可扩展全文搜索和分析引擎,基于Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。 Logstash 数据收…

一周侃 | 周末随笔

前言 明天又是周一了,感慨时间过得真快,2022年只差一个月就要过去了。大家年初定的目标实现了吗【狗头】 作为一个技术类博主,我平常除了看专业书籍和论文之外,很喜欢看一些闲书,比如时政类、经济类、历史人文类、科…

linux 进程通信 C程序案例

linux 进程通信 C程序案例 编写C程序完成&#xff1a;父进程创建两个子进程&#xff0c;每个进程都在屏幕上显示自己的进程ID号&#xff0c;并在第1个子进程中加载执行一条外部命令。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #inc…

看5G时代,“一键喊话”的大喇叭如何奏响基层治理最强音

“喂喂&#xff0c;各位居民朋友快下楼做核酸啦……” 通过广播传递最新政策、应急预警、疫情防控等信息&#xff0c;利用智能信息播报系统&#xff0c;打通基层宣讲“最后一公里”&#xff0c;已成为全国多地的常见景象。“多亏了它&#xff0c;需要紧急通知的时候&#xff0c…

Vue--》超详细教程——vue-cli脚手架的搭建与使用

目录 vue-cli vue-cli 的安装 (可能出现的问题及其解决方法) vue-cli 创建 Vue 项目 Vue项目中目录的构成 Vue项目的运行流程 Vue组件的使用 vue-cli vue-cli是Vue.js开发的标准工具。它简化了程序员基于webpack创建工程化的Vue项目的工程。其好处就是简省了程序员花费时…

Nacos——配置中心源码详解

Nacos——配置中心源码详解配置中心客户端主动获取客户端服务端客户端长轮询更新客户端1.入口2.配置文件分片处理3.配置文件处理4.本地配置文件与缓存数据的对比5.开启长轮询与服务端对比6.通知监听器7.监听回调处理服务端1.入口2.长轮询机制3.长轮询的延迟任务4.数据变更事件总…

【U8+】用友U8同一个账套使用了好多年,需要将以前年度进行分离、删除。

【问题需求】 用友U8一个账套使用了好多年了&#xff0c; 需要将以前年度进行删除&#xff0c; 但是在系统管理中&#xff0c;查看该账套只有一个年度账&#xff08;账套库&#xff09;。 例如&#xff1a; 图中002账套&#xff0c;是从2020年开始使用至2024年&#xff0c; 现在…

SpringBoot集成Spring Security——【认证流程】

一、认证流程 上图是 Spring Security 认证流程的一部分&#xff0c;下面的讲解以上图为依据。 &#xff08;1&#xff09; 用户发起表单登录请求后&#xff0c;首先进入 UsernamePasswordAuthenticationFilter&#xff1a; 在 UsernamePasswordAuthenticationFilter中根据用户…

第十四届蓝桥杯模拟赛第一期试题【Java解析】

目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 E 最小矩阵 问题描述 答案提交 答案 解析 F 核酸日期 问题描述…

香港和新加坡,谁是亚洲加密金融中心?

去新加坡&#xff0c;还是去中国香港? 对中国Web3的创业者来说&#xff0c;是一个问题。 2022年11月&#xff0c;中国香港金融科技周和新加坡金融科技周同时举办&#xff0c;将这场竞赛推向高潮。 抢人、抢钱、抢公司……中国香港和新加坡对于“加密金融中心”或者“全球We…

2、云原生微服务实践-服务开发框架设计和实践

目录 一、依赖管理 二、服务模块管理 api、svc 三、其他文件管理 1、私密配置文件 2、前端页面单页文件 四、单体仓库 mono-repo 1、单体仓库和多仓库的对比&#xff1a; 2、单体仓库优点 五、接口参数校验 六、统一异常处理 七、DTO(数据传输对象)和DMO(数据模型对…

尝试改善科研V2

参考链接&#xff1a; https://fulequn.github.io/2022/09/26/Article202209261/ https://www.xljsci.com/ https://apps.ankiweb.net/ https://www.explainpaper.com/ 1 从动机上促成科研 将科研这件事情分成准备工作、活动本身、活动的结果。 1.1 准备工作 准备工作十分简…

湖南郴州王瑞平、大衣哥、谷传民、孟文豪唱响《知心世界》主题曲

在大衣哥和谷传民对簿公堂之时&#xff0c;来自湖南郴州的王瑞平&#xff0c;准备在他们之间架起一座沟通的桥梁。众所周知&#xff0c;大衣哥和谷传民的官司&#xff0c;是因为《火火的情怀》版权&#xff0c;其实这首歌的版权&#xff0c;并不是只属于谷传民一人。 著名音乐人…

第一个springBoot maven 项目

1. env: java 11 IntelliJ IDEA 2021.3.2 (Community Edition) 2. file->new project->Maven: pom.xml 需要导入的包&#xff1a;后面三个是jdk8升级到11后&#xff0c;可能会出错&#xff0c;需要用到的包 <parent><groupId>org.springframework.boot<…

python面向对象之类和对象相关知识

python面向对象之类和对象相关知识 一、面向对象简介 1、什么是面向对象 面向对象是一种编程思想&#xff0c;把数据和对数据的多个操作方法封装在一起组成类&#xff0c;这样通过这个类创建出来的对象,就可以直接调用这些方法了。2、面向对象相关的术语 类&#xff1a;用来…

一次金融APP的解密历程

声明&#xff1a;本文仅限于技术讨论与分享&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负&#xff0c;与本号及原作者无关。 前言&#xff1a; 客户仅提供官网下载地址给我们测试。但是由于官网的版本不是最新的&#xff0c;APP会强制你升级。而…

搭建lamp平台

apache安装步骤 检查是否已经rpm安装httpd服务&#xff0c;已安装则卸载服务。 [rootlocalhost ~]# rpm -e rpm -qa | grep httpd --nodeps 开发工具安装 如果编译安装无法执行&#xff0c;可能是开发工具没有安装&#xff0c;执行下面命令即可安装。&#xff08;如已安装则跳…

【springboot进阶】优雅使用 MapStruct 进行类复制

项目中经常会遇到这样的一个情况&#xff1a;从数据库读取到数据&#xff0c;并不是直接返回给前端做展示的&#xff0c;还需要字段的加工&#xff0c;例如记录的时间戳是不需要的、一些敏感数据更是不能等等。传统的做法就是创建一个新的类&#xff0c;然后写一堆的get/set方法…