当前位置:网站首页>MySQL JDBC编程
MySQL JDBC编程
2022-07-04 03:53:00 【Lockey-s】
博客主页:Lockey-s 欢迎点赞 收藏 留言 欢迎讨论! 本文由 【Lockey-s】 原创!首发于 CSDN 由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不 尽! 精品专栏(不定时更新)
JDBC 编程
概念
JDBC 就是一种类和方法,是一种执行 SQL 语句的 Java API,可以对多种数据库实现统一访问,就像是班长约定好数据的统计格式一样。优势就是使得程序的可移植性大大增强,不用限定在特定数据库厂商的API。
使用
引入依赖
引入依赖就需要用 MySQL 的驱动包(把 MySQL 自身的 api 给转换成 JDBC 风格)。
下载驱动包
最好的方法就是去 MySQL 官网,但是 MySQL 被 Oracle 收购后,就很难找了,所以就可以去 maven 中央仓库 去安装,然后搜索 MySQL,第一个结果就是:
然后点进去选择 5.1.x 系列就可以,因为我的 MySQL 是 5.7 系列的,所以用的是 5 系列的,如果 MySQL 是 8 系列的,那么就用 8 系列的,一定要和自己的 MySQL 版本匹配,如果不匹配的话,就可能导致 bug :
然后点击前面的版本号,然后进入页面之后:
然后点那个 jar 按钮,就会下载驱动包,jar 里面就是其他人写好的 class 文件。
导入到项目中
- 进入项目之后,可以创建一个目录,这里创建的是 lib
- 把刚刚下载的 jar 文件拷贝到刚刚的目录当中,直接复制文件点一下 lib,然后粘贴就好了
- 右键刚才的目录,有一个 add as library 然后点击这个选项,才会把 jar 包引入到项目中,项目才会读取 jar 内部的 .class 文件。否则代码就找不到 jar 里面的一些类了。
编写代码
JDBC 插入的基本流程
创建 DataSource 对象
这个对象就描述了数据库服务器在哪里。代码如下:
DataSource dataSource = new MysqlDataSource();
其中 DataSource 是 JDBC 带的接口,后面的 MysqlDataSource 来自之前下载好的 jar 包,是一个向上转型。
设置数据库地址: 这里的数据库地址可以直接复制,127.0.0.1 表示本机 IP ,3306 是端口号,user 是数据库名,后面是字符集,SSL 是传输过程中是否加密。
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false");
设置数据库用户名:
((MysqlDataSource) dataSource).setUser();
设置数据库的密码:
((MysqlDataSource) dataSource).setPassword();
也可以写成这样,这样就没有转型了:
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL();
dataSource.setUser();
dataSource.setPassword();
因为我们代码中持有的实例是 DataSource 类型,后面一些其他代码如果需要用到其它 DataSource ,相关参数也是 DataSource,代码几乎不用改动,就是“低耦合”。
和数据库服务器建立连接
通过 dataSource.Connection 来建立连接:
Connection connection = dataSource.getConnection();
要注意的是,使用的是 java.sql 里面的 Connection:
操作数据库
- 操作数据库的时候,关键是构造一个 SQL语句,构造 String 类的语句,不用写分号:
String sql = "insert into student values(1,'张三')";
- 然后通过 Connection 里面的 prepareStatement 方法,把 String 风格的 sql语句转化为 JDBC 里面的对象:
PreparedStatement statement = connection.prepareStatement(sql);
- 执行 sql ,如果是插入的话,就是 executeUpdate,选择的话,就是 executeQuery:
int line = statement.executeUpdate();
这里的 line 就是返回值,就是有几行受到了影响。
- 释放资源,先创建的后释放,后创建的先释放。
statement.close();
connection.close();
执行代码,返回值是 1,就说明有一行受到了影响:
执行三次之后,返回数据库查看内容,发现多了三条记录:
用户输入要插入的内容
通过 Scanner 来让用户输入:
int id = scanner.nextInt();
String name = scanner.next();
用户输入之后,把 id,和 name 替换到 sql 语句里面,在 sql语句 的values 当中用 ?代替:
String sql1 = "insert into student values(?,?)";
这两个 ? 就是表示当前字段的值还没有确定,先来占个位置,再使用 PreparedStatement 的 setXXX 系列方法进行替换:
PreparedStatement statement1 = connection.prepareStatement(sql1);
statement1.setInt(1,id);
statement1.setString(2,name);
这里的 1,2 就是下标,从 1 开始计算,把第一个 ?替换成 id 的值,把第二个 ?替换成 name 的值。然后打印一下替换的对象:
System.out.println("statement1" + statement1);
拼装好的 SQL 的输出值为下:
数据库当中的 lisi 也成功插入了。
JDBC 删除的基本流程
- 创建数据源:
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("");
- 建立连接:
Connection connection = dataSource.getConnection();
- 用户输入 id:
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
- 拼装 sql 语句:
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
- 执行 sql :
int line = statement.executeUpdate();
System.out.println(line);
- 回收资源:
statement.close();
connection.close();
运行结果如下:
数据库数据如下:
可以看到 id 为1 的都被删除了。
JDBC 更新的基本流程
- 创建数据源:
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("");
- 建立连接
Connection connection = dataSource.getConnection();
- 用户输入 id
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
String name = scanner.next();
- 拼装 sql 语句
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, name);
statement.setInt(2, id);
System.out.println("statement" + statement);
- 执行 sql
int line = statement.executeUpdate();
System.out.println("line" + line);
- 回收资源
statement.close();
connection.close();
数据库当中 id等于 2 的名字是:lisi
执行结果如下:
可以看到数据库当中的数据也被修改了:
JDBC 查找的基本流程
- 创建数据源:
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("");
- 建立连接
Connection connection = dataSource.getConnection();
- 拼装 sql 语句
String sql = "select * from student order by id";
PreparedStatement statement = connection.prepareStatement(sql);
- 执行 sql,因为查询操作返回的是一个临时表,所以用 executeQuery,返回的临时表用 ResultSet 来表示。
ResultSet resultSet = statement.executeQuery();
- 遍历结果集合,也就是遍历返回的临时表,先获取到返回的每一行,再获取到这一结果的每一列。
while (resultSet.next()) {
//先针对一行来获取列
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id= " + id + " ,name= " + name);
}
- 关闭资源
resultSet.close();
statement.close();
connection.close();
数据库资源如下:
代码执行结果(按 id 顺序排列)如下:
边栏推荐
- Flink学习8:数据的一致性
- Pointer array and array pointer
- Unity draws the trajectory of pinball and billiards
- I.MX6U-ALPHA开发板(模仿STM32驱动开发实验)
- 2021 RSC | Drug–target affinity prediction using graph neural network and contact maps
- 架构实战营 - 第 6 期 模块九之毕业设计
- (指针)自己写一个比较字符串大小的函数,功能与strcmp类似。
- 【愚公系列】2022年7月 Go教学课程 001-Go语言前提简介
- 仿《游戏鸟》源码 手游发号评测开服开测合集专区游戏下载网站模板
- UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x98 in position 1093: illegal multibyte sequence
猜你喜欢
戳气球和布尔运算问题(巨难)
Lnk2038 detected a mismatch of "runtimelibrary": the value "md_dynamicrelease" does not match the value "mdd_dynamicdebug" (in main.obj)
博朗与Virgil Abloh于2021年为纪念博朗品牌100周年而联合打造的“功能性艺术”将在博物馆展出Abloh作品期间首次亮相
Leetcode skimming: binary tree 04 (sequence traversal of binary tree)
leetcode刷题:二叉树09(二叉树的最小深度)
苹果CMS仿西瓜视频大气响应式视频模板源码
Leetcode skimming: binary tree 08 (maximum depth of n-ary tree)
NFT new opportunity, multimedia NFT aggregation platform okaleido will be launched soon
微信脑力比拼答题小程序_支持流量主带最新题库文件
Redis:集合Set类型数据的操作命令
随机推荐
RHCSA 06 - suid, sgid, sticky bit(待补充)
分布式系统:what、why、how
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x98 in position 1093: illegal multibyte sequence
【安全攻防】序列化与反序列,你了解多少?
(pointer) write a function to compare the size of strings by yourself, which is similar to StrCmp.
【微服务|openfeign】@FeignClient详解
C语言单向链表练习
Redis:哈希hash类型数据操作命令
【愚公系列】2022年7月 Go教学课程 001-Go语言前提简介
【微服务|openfeign】feign的两种降级方式|Fallback|FallbackFactory
Pointer array and array pointer
02 specific implementation of LS command
北漂程序员,月薪20K,一年攒15W,正常吗?
Operation of ES6
旭化成首次参展第五届中国国际进口博览会(5th CIIE)
C language bidirectional linked list first edition
Lnk2038 detected a mismatch of "runtimelibrary": the value "md_dynamicrelease" does not match the value "mdd_dynamicdebug" (in main.obj)
【云原生】那些看起来很牛X,原理却很简单的一行代码
I.MX6U-ALPHA开发板(模仿STM32驱动开发实验)
2020 Bioinformatics | TransformerCPI