JDBC 编程 (使用Java操作MySQL数据库)(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: JDBC 编程 (使用Java操作MySQL数据库)

2、JDBC 代码编写步骤

1)创建数据源对象,数据源对象就是描述了要访问的数据库是啥,在哪

创建数据源对象

DataSource dataSource = new MysqlDataSource();

这个  DataSource 是 java 标准库里面的类,MysqlDataSource 是 MySQL 驱动包中的类。

DataSource 是个接口类,不能实例化自己,而 MySQLDataSource 正好是实现了该接口的具体类。


注:如果我们导入 驱动包 失败,就找不到导入 MysqlDataSource 的包!!

(每种数据库都会提供对应的类来实现 DataSource 接口 )

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


通过数据源找到数据库的位置(找到到家)

((MysqlDataSource) dataSource).setURL(URL);

setURL 方法不是 DataSource 里的,而是 MySQLDataSource 的,得转成子类引用

MySQL 是一个客户端服务器的程序,描述服务器的位置,会使用 URL 这个概念来表示。

但是有的数据库,比如 SQLite,就不是客户端服务器结构,也就谈不上 URL

这个 URL 我们可以直接复制粘贴使用(注:要写正确的数据库名)

"jdbc:mysql://127.0.0.1:3306/创建数据库名?characterEncoding=utf8&useSSL=false"

设置 用户名 和 密码 (拿钥匙进家门)

((MysqlDataSource) dataSource).setUser("root");
 ((MysqlDataSource) dataSource).setPassword("123456");//输入你个人设置的密码

用户名统一都是root(MySQL 自带的用户名)

密码,就是你安装数据库的时候设置的密码

注:如果没有设置密码,要写成空字符串的形式 如 ....setPassword("");


2) 让代码和数据库服务器建立连接

Connection connection = dataSource.getConnection();

注意:使用 Connection 来表示连接,不要导入错误的包,不然会连接失败!!!

import java.sql.Connection;

到这里,我们可以运行一下代码,如果没有报错说明连接数据库成功


 如果是以下这样,就说明 URL 没有写对

如果报错出 Access denied 就说明 用户名 或者 密码 错误


3)构造要执行的 SQL 语句

       我们可以把要执行的 SQL 语句转成字符串,传给Connction对象的 prepareStatement() 方法中。

语法:

String sql = "要操作的SQL语句";
PreparedStatement statement = connection.prepareStatement(sql);

       1.先通过字符串。描述出来要执行的 SQL 是啥

       2.然后构造成 PreparedStatement 对象

connection.prepareStatement(sql) 含义:先通过字符串,描述出来要执行的 SQL语句,然后再构造成 PreparedStatement 对象对 SQL 语句进行预解析,然后把结果发给数据库!!


为什么要在本地解析SQL语句:这个解析过程是比较消耗时间和资源的,而数据库要日理万机,要处理很多客户端的其请求。把所有的解析工作都交给服务器来完成,会让本就不富裕的系统资源雪上加霜!所以就把一部好解析工作,放到客户端来完成。

这里就要写我们想要执行的语句,例如往 test库中 student 表中插入一个学生数据

String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);

这里大家要注意一点,例如使用 Java/C++/Python.... 操作数据库,本质上还是通过 SQL语句来操作 !!

4) 执行 SQL

执行方法有两个,如下

方法名 作用 返回值
executeUpdate 对应插入、删除、修改语句 返回这次 SQL 操作影响到的行数(整数类型)
executeQuery 对应查询语句 返回 临时表数据
int n = statement.executeUpdate();


5)完成滞后于,关闭释放资源

前面的语句对象和连接对象,都需要消耗资源。需要我们手动释放资源,这里主要释放内存资源。

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

注意:这里释放资源的顺序,要和之前申请资源的顺序正好相反(先创建的后释放,后创建的先释放)

6)总代码

public static void main(String[] args) throws SQLException {
        //1. 创建数据源对象
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");
        //2. 让代码和数据库建立连接
        Connection connection = (Connection) dataSource.getConnection();
        //3. 构造要执行的 SQL 语句【构造请求】
        String sql = "insert into student values(1,'张三')";
        PreparedStatement statement = connection.prepareStatement(sql);
        //4. 执行SQL 【发送请求 & 读取响应】
        int n = statement.executeUpdate();
        //5. 完成之后,需要关闭释放相关资源
        statement.close();
        connection.close();
    }

7)拓展:通过字符串拼接的方式,让用户输入数据进行插入

我们可以手动拼装 SQL 语句,将我们想插入的数据替换成变量,然后在拼接到 SQL 语句中,如下

//[用户输入] 通过用户输入的数据,来确定插入的值
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要插入的学号:");
int id = scanner.nextInt();
System.out.println("请输入要插入的姓名:");
String name = scanner.next();
//3. 构造要执行的 SQL 语句【构造请求】
String sql = "insert into student values("+ id +",'"+ name +"')";
System.out.println("statement: "+ statement);

上述手动拼接 SQL 虽然可行,但是存在两个问题


1. 代码非常乱 ~~尤其是拼的 SQL 变成啥样了,看不清晰,不直观


2.不安全~容易引发SQL注入漏洞


SQL注入例如像 name 这种,使用户自己输入的。用户可能会输入一些奇怪的东西,来对数据库进行破坏,如 name = ');drop database xxxx.... 等当 name 拼接到 SQL语句中,就会使我们原来的语句结束掉,然后执行删库操作。


因此,应该借助 PreparedStatement 内部提供的 SQL 拼装机制,这样代码更简单更直观,同时会对拼接内容进行更加严格的校验检测,避免 SQL 注入!!

使用 PreparedStatement 拼装机制

第一步:在 SQL 中需要插入数据的部分用 ?做占位符


第二步:使用 PreparedStatement 中 set 系列方法

set数据类型(第几个'?',替换内容);

数据类型如:Int 、String(首字母要大写)

String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id); //替换第一个 '?'
statement.setString(2,name); //替换第二个 '?'

3、插入、删除、更新、查找

JDBC 看起来是很麻烦的代码,实际上是固定的逻辑。而插入、删除、更新、查找这些操作其实也就第三步和第四步代码不同,其他的都一样,所以下面就只列举第三步和第四步代码了。


大家可以那下面代码作为模板,进行练习。

//1. 创建数据源对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=utf8&useSSL=false");//自己要操作的数据库名
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("密码");//要填写自己设置的密码
//2. 让代码和数据库建立连接
Connection connection = (Connection) dataSource.getConnection();
//3. 构造要执行的 SQL 语句【构造请求】
//4. 执行SQL 【发送请求 & 读取响应】
//5. 完成之后,需要关闭释放相关资源
statement.close();
connection.close();

这里插入操作在上面已经当例子举了,这里就不找赘述了

删除操作🌚

 

//3. 构造要执行的 SQL 语句【构造请求】
        //[用户输入] 通过用户输入的数据,来确定更新的值
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除学生的学号:");
        int id = scanner.nextInt();
        String sql = "delete from student where id = ? ";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        System.out.println("statement: "+ statement);
        //4. 执行SQL 【发送请求 & 读取响应】
        int n = statement.executeUpdate();

0b4ce4171b385fa0a9d73e52b47555a4_5e3b289f8dfa46d58cf87df4b67a2675.png

更新操作🌛

 

//3. 构造要执行的 SQL 语句【构造请求】
        //[用户输入] 通过用户输入的数据,来确定更新的值
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要修改学生的学号:");
        int id = scanner.nextInt();
        System.out.println("请输入要修改姓名:");
        String name = scanner.next();
        String sql = "update student set name = ? where id = ? ";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(2,id);
        statement.setString(1,name);
        System.out.println("statement: "+ statement);
        //4. 执行SQL 【发送请求 & 读取响应】
        int n = statement.executeUpdate();

afdedcd562985cea4ffda3fade86dd5d_a4783a12b0764101b00a22afe4a308bf.png

查找操作🌜

查找操作跟其他操作不同,在执行 SQL 中要用 executeQuery 方法


executeQuery 方法 返回的是一个 ‘表’ 数据结构,要用 ResultSet 来接收。


我们要想得到查找数据,还要遍历 ResultSet对象,使用 next() 方法

next() 方法就是遍历表中的每一行,每次钓鱼共 next ,就往下走一行!!

如果能走,就返回 true,否则就是 false

在每一行中,通过 get 系列方法得到每一列的值。


getXXX(列名/第几列);


注意:列的类型是什么就用什么类型的变量来接收

//3. 构造要执行的 SQL 语句【构造请求】
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4. 执行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);
}

efb2c68da8ab7ca4c9875aeafe3d32dd_a0940d8b042148a8bdc498053ef469d1.png

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
前端开发 关系型数据库 MySQL
【前端学java】MySQL数据库的本地安装
【8月更文挑战第12天】MySQL数据库的本地安装
19 3
|
4天前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
10天前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
34 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
10天前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
47 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
3天前
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
3天前
|
前端开发 关系型数据库 MySQL
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
|
5天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
5天前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
4天前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
5天前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
19 0