JDBC编程的基本流程

news/2024/5/19 1:46:34 标签: 数据库, mysql, java, JDBC

文章目录

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

1、创建数据源

  1. 创建DataSource对象,这个对象描述了数据库服务器在哪,需要导入包javax.sql.DataSource
java">DataSource databases = new MysqlDataSource();
  1. 设置数据库所在的地址
java">((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. 设置登录数据库的用户名
java">((MysqlDataSource) databases).setUser("root");
  1. 设置登录数据的密码
java">((MysqlDataSource) databases).setPassword("fl12345.0");

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

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

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

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

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

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

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

java">Connection connection = dataSource.getConnection();

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

在这里插入图片描述

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

3、操作数据库

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

3.1 插入操作

java">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包装成一个“语句对象”

java">PreparedStatement statement = connection.prepareStatement(sql);

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

执行sql

java">int ret = statement.executeUpdate();

返回值就表示影响了几行

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

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

java">statement.close();
connection.close();

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

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

java">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注入”

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

java">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方法有很多,需要让这里的方法和数据库的列的类型匹配
进行替换操作

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

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

最后还需要执行sql

3.2 删除操作

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

java">//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修改学生姓名

java">//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 查找操作

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

java">//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.niftyadmin.cn/n/5779.html

相关文章

【负荷预测】基于改进灰狼算法(IGWO)优化的LSSVM进行负荷预测(Matlab代码实现)

📝个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,…

分击合进,锦江之星酒店与白玉兰酒店再领投资热潮

2022年11月11日,「山水画中游,暇享好时光」品牌品鉴会在广西桂林隆重召开。锦江酒店(中国区)旗下两大酒店品牌锦江之星酒店和白玉兰酒店携手亮相本次活动。 (品牌矩阵品鉴会活动现场) 后疫情时代&#xff…

.net 大型物流综合管理网络平台源码【免费分享】

淘源码:国内专业的免费源码下载平台 源码分享,需要源码学习可私信我! 一、源码描述 这是一款大型的物流综合管理网络平台源码,十分完整实用,便于调试,涵盖了物流综合管理的全面内容,该源码运行比…

网络安全系列-三十八: 网络分析的瑞士军刀 CyberChef

CyberChef介绍 CyberChef是英国情报机构政府通信总部(GCHQ)发布了一款新型的开源Web工具,为安全从业人员分析和解密数据提供了方便。 GCHQ一般指英国政府通讯总部。 英国政府通讯总部是英国秘密通讯电子监听中心,相当于美国国家安全局。缩写为GCHQ CyberChef是一款简单、…

SpringBoot项目使用hutool工具进行HttpClient接口调用的处理(文件上传)

前言 今天遇到一个需求,需要调用其他系统的接口,看到网上都说hutool封装的HttpClient很好用,我就也去使用了下 下面记录使用过程和关键代码以及遇到的一些坑,下面分享给大家 简单描述我的需求:封装一个公共接口,调用…

C语言 —— sizeof与strlen对比表 (持续更新中....)

sizeof与strlen对比表 sizeofstrlen本质C语言的一个关键字,也是C语言的一个运算符。C语言中的库函数使用方法sizeof(类型或变量名)库函数的原型:size_t strlen(const char *s)返回内容sizeof运算符用来返回一个类型或者是变量所占…

JS 根据某一属性值合并两个数组

假设我们有两个对象数组,其中第一个包含一些带有用户ID和用户名的对象。 该数组包含带有用户ID和用户地址的对象。 数组是- const arr1 [{"id":"123","name":"name 1"},{"id":"456","name&quo…

你能分清Java的关键字和标识符吗?

文章目录Java标识符和关键字概念标识符关键字区别Java标识符和关键字 概念 标识符 Java 中标识符是为方法、变量或其他用户定义项所定义的名称。标识符可以有一个或多个字符。 在 Java 语言中,标识符的构成规则如下: 标识符由数字(0~9&a…