JDBC超级详细 安装 使用 (2023新版)通俗易懂

JDBC超级详细 安装 使用 (2023新版)通俗易懂

JDBC详细介绍 安装 使用 通俗易懂

1.1 JDBC 概述

英文全称:Java Data Base Connectivity 翻译过来就是 java数据库连接,它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询(executeQuery)、更新(executeUpdate)等操作。

使用 jdbc 准备工作

1.在设置的新项目文件下定义一个 lib 文件夹,在创建文件夹内加入 mysql-connector-java-5.1.47.jar 注:我的数据库版本是5版本

下载地址: https://nowjava.com/jar/version/mysql/mysql-connector-java.html

温馨提示:下载与自己数据库相对应的版本,数据库8以上版本效率很高,但是稳定性不能保证,所以实际开发中使用数据库5版本较多。求稳

1.2 jdbc 操作数据库执行操作流程

1.2.1 准备数据库连接必要参数

/*

选择正确的驱动程序,从而建立到数据库的连接,这里可以改变的是 company 字段在localhost:3306/后面,?serverTimezone前面,这个字段决定你使用的具体是哪个数据库

*/

String jdbcUrl ="jdbc:mysql://localhost:3306/company? serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";

// 提供数据库名字

String username = "root";

// 提供数据库密码

// String password 这里我将我的密码注释掉了,大家记得加上

// 定义驱动类字段

String driverClass = "com.mysql.jdbc.Driver";

// 准备必要参数字段

Connection connection = null;

Statement statement = null;

PreparedStatement statement = null;

ResultSet resultSet = null;

// 这个字段用来后面记录数据库改变行数

int affectedRows = 0;

Statement 与 PreparedStatement 的区别

PreparedStatement是预编译的,对于批量处理可以大大提高效率.

使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理

Statement 不能防止 SQL 注入 ,PreparedStatement 可以防止 SQL 注入,SQL 注入说白了就是数据库被盗了,里面的信息会被偷取,例如你的微信号,和密码泄露了。

1.2.2 加载驱动

// 这里用定义字符串变量等于 com.mysql.jdbc.Driver

Class.forName(driverClass);

1.2.3 获取数据库链接对象

connection = DriverManager.getConnection(jdbcUrl, username, password);

1.2.4 准备 SQL 语句

/*

这里提供静态 sql 语句

*/

String sql1 = "insert into student(name, age, gender) VALUES ('三不沾', 66, false)";

String sql2 = "select * from student where id = ?";

注:sql 语句 大致分为两种,一种为查询如 select,一种为改变数据如:delete 、update、insert into等

工具使用提示:

准备 目标执行 SQL 语句

字符串中 Alt + Enter ==> Inject language or reference ==> 输入 MySQL 回车

在自动补齐 SQL 过程中,可以首先使用 use XXX 选择对应的数据库,方便后续操作

应用成功后展示台展示结果

company> use company

[2023-03-27 11:45:42] completed in 3 ms

1.3 通过 Connection 获取数据库搬运工对象(Statement PreparedStatement)

// 获取 SQL 语句搬运工对象

statement = connection.createStatement();

// 获取 SQL 语句搬运工对象 可批处理 防SQL注入

statement = connection.prepareStatement(sql);

1.4 (Statement PreparedStatement) 具体使用

1.4.1 Statement 创建

// 定义要执行的 SQL 语句

String sql1 = "insert into student(name, age, gender) VALUES ('三不沾', 66, false)";

// 获取 SQL 语句搬运工对象

statement = connection.createStatement();

1.4.2 PreparedStatement 创建

// 这里使用有定位符的 SQL 语句,为了突出 PreparedStatement 的特点

String sql = "select * from student where id = ?";

// 获取 SQL 语句搬运工对象 这里可以与 Statement 对比

statement = connection.prepareStatement(sql);

1.5 ResultSet 结果集部分知识

这里定义的 resultSet 是单向的,只能单向遍历的结果集,只能执行 next() 方法

1.5.1 数据库数据改变操作(插入,删除,修改)

/*

驱动执行 sql 语句,affectedRows 将记录改变数据的行数

*/

affectedRows = statement.executeUpdate(sql);

// 输出展示

System.out.println("SQL 语句执行对于数据表影响行数:" + affectedRows);

1.5.2 数据库未改变(查询)

// 这里有1个定位符

String sql = "select * from student where id = ?";

/*

这里的第一个参数 1 是参数位置,这里区别与数组下标,不是从0开始,而是从1开始

第二个1是,为参数赋值 有多种类型,可以是字符串,整形,浮点型,不过也可以统一使用object

赋值结束后得到 sql 语句: select * from student where id = 1

*/

statement.setObject(1,1);

resultSet = statement.executeQuery();

// 从头遍历获取数据库每行字段对应各项数据,输出展示

if (resultSet.next()) {

int id = resultSet.getInt("id");

String name = resultSet.getString("name");

int age = resultSet.getInt("age");

boolean gender = resultSet.getBoolean("gender");

System.out.println("Name:" + name);

System.out.println("Age:" + age);

System.out.println("Gender:" + gender);

}

1.6 resultSet 高级用法

1.6.1 图解

俗称用什么拿什么 可以将结果集放入Object[],也可以放入List>等

1.6.2 将 resultSet 数据转化成 Object[]

public Object[] handle(ResultSet res) throws SQLException {

// 定义数组

Object[] arr = null;

// 获取操作之前,必要准备

ResultSetMetaData metaData = res.getMetaData();

// 获取元数据字段个数

int columnCount = metaData.getColumnCount();

// 循环遍历结果集

if (res.next()) {

// 定义数组长度

arr = new Object[columnCount];

// 循环操作进行赋值 这里要注意,数据结果集是从1开始遍历的

for (int i = 0; i < columnCount; i++) {

arr[i] = res.getObject(i + 1);

}

}

return arr;

}

1.6.3 将 resultSet 数据转化成 List>

public List> handle(ResultSet res) throws SQLException {

// 定义 Map 集合

Map map = null;

// 定义 List 集合

List> list = new ArrayList<>();

// 获取操作之前,必要准备

ResultSetMetaData metaData = res.getMetaData();

// 获取元数据字段个数

int columnCount = metaData.getColumnCount();

// 循环遍历结果集

if (res.next()) {

// 定义 map 长度

map = new HashMap(columnCount);

// 循环操作进行赋值

for (int i = 1; i <= columnCount ; i++) {

/*

给 map 赋值 metaData.getColumnName(i) 获取字段名称

res.getObject(i) 获取字段对应数据

*/

map.put(metaData.getColumnName(i),res.getObject(i));

}

// 将赋值好的 map 添加到 List 集合中

list.add(map);

}

// 返回 list 集合

return list;

}

1.7 关闭资源

/**

* 定义关闭所有资源

* @param resources 所有资源字段 connection,statement,或者connection,statement,resultSet

*/

private static void close(AutoCloseable... resources) {

if (resources != null && resources.length > 0) {

Arrays.stream(resources).forEach(source -> {

try {

if (source != null) {

source.close();

}

}catch (Exception e) {

e.printStackTrace();

}

});

}

}

1.8 总结

学会了上述知识,你就已经算是基本了解 JDBC 在Java中大致起到什么作用,扮演什么样的角色

后期我们会进阶学习这一部分知识,即使用封装的思想,简化代码。

感谢您能读到这里,你的鼓励是我坚持的动力。

相关新闻

杜牧《惜春》原文、赏析及翻译
Bet体育365提款要多久2022

杜牧《惜春》原文、赏析及翻译

🕒 09-24 👽 3688
沼泽合理开发利用的必要技术措施
365bet手机投注网

沼泽合理开发利用的必要技术措施

🕒 08-27 👽 7191
我的个人网站是怎么做出来的
365体育投注一直进不去

我的个人网站是怎么做出来的

🕒 07-02 👽 9376
丢失苹果手机?这5步教你精准定位找回!
Bet体育365提款要多久2022

丢失苹果手机?这5步教你精准定位找回!

🕒 09-29 👽 5521
App Store預覽
365体育投注一直进不去

App Store預覽

🕒 07-19 👽 4668
带着女朋友去了100多座城市旅游,总结出这十大情侣旅游注意事项