关于后端:一文快速回顾-Java-操作数据库的方式JDBC

0次阅读

共计 4337 个字符,预计需要花费 11 分钟才能阅读完成。

前言

数据库的重要性显而易见,不论是什么零碎,什么应用软件,也不论它们是 Windows 上的应用程序,还是 Web 应用程序,存储(长久化)和查问(检索)数据都是外围的性能。

大家学习数据库时,比方 MySQL 这个数据库管理系统,都是在 CLI(Command Line Interface)上操作数据库的,当初,咱们看看,在 Java Web 中,咱们如何应用 Java 去操作数据库。

JDBC

JDBC(Java Data Base Connectivity)是 Java 操作数据库的一种标准,也是一种 API(与数据库系统进行通信的规范的 API),更是一门技术。

JDBC 是由一组用 Java 编写的类和接口组成,对数据库的操作提供了根本的办法。然而,对于数据库细节的操作,那就是由数据库的厂商实现的。应用 JDBC 操作数据库,须要数据库厂商提供的数据库驱动程序的反对。

那什么是数据库驱动程序呢?这个驱动(driver)能够了解成一种能够让数据库和 Java 彼此进行互动的程序。

简略来讲,JDBC 提供了一种 API 的标准,通知各大数据库厂商按这种标准来实现这些 API 具体的实现代码。能够从两个角色的角度来说这个 JDBC。从咱们开发人员的角度来说,JDBC 为咱们开发人员提供了对立的操作数据库的 API,不必管这些 API 的具体实现,专一于 API 的调用;从数据库厂商的角度来说,JDBC 为他们提供了一套规范的模型接口,都按这个接口去做本人的实现。

如何应用 JDBC?

JDBC 的应用次要有如下几个步骤:

  1. 注册数据库驱动程序(database driver program)到 JDBC 的驱动管理器中。

在连贯数据库之前,须要将数据库厂商提供的数据库驱动类注册到 JDBC 的驱动管理器中,个别是把驱动类加载到 JVM 实现的。

Class.forName("com.mysql.jdbc.Driver");
  1. 构建数据库连贯的 URL。

要与数据库建设连贯,那么就须要构建数据库连贯的 URL,这个 URL 由数据库厂商指定,个别合乎一种根本格局,即 JDBC 协定 +IP 地址或域名 + 端口 + 数据库名称。MySQL 的 URL 是 jdbc:mysql://localhost:3306/dbname

  1. 获取连贯对象(Connection 对象)。
String url = "jdbc:mysql://localhost:3306/dbname";
String username = "root";
String password = "123456";
// Connection 对象的获取须要借助 DriverManager 对象
Connection conn = DriverManager.getConnection(url, username, password);
  1. 进行数据库操作。

编写 SQL,而后获取 PreparedStatement 对象,对 SQL 语句进行执行。SQL 语句的参数是能够应用占位符“?”代替,再通过 PreparedStatement 对象对 SQL 语句中的占位符进行赋值。

Statment 这个单词的意思在这里指的就是 SQL 语句。

// 编写 SQL
String sql = "INSERT INTO tb_game(name, price, platform) values(?, ?, ?)";
// 获取 PreparedStatement 对象
PreparedStatement ps = conn.preparedStatement(sql);
// 给占位符赋值
ps.setString(1, "NBA2K");
ps.setDouble(2, 198.0);
ps.setString(3, "Windows");
// 执行 SQL,将这条数据写入数据库,返回影响的行数
int row = ps.executeUpdate();

应用 PreparedStatement 对象对 SQL 语句的占位符参数赋值,其参数的下标是从 1 开始的。

  1. 敞开连贯
conn.close();

CRUD

新增操作

新增操作,就是下面的插入操作,请看下面。

查问操作

ResultSet

应用 JDBC 查问数据,与插入数据的操作流程根本一样,然而执行查问操作后须要通过一个对象来接管查问的后果,这个对象就是 ResultSet(后果集)。

ResultSet 是 JDBC API 中封装的对象,从数据表中查到的所有记录都会放在这个汇合中。ResultSet 中保护着一个 cursor(游标)来指向以后的数据行(数据记录),初始化的时候,这个游标指向第一行的前一行,能够通过 next() 办法来挪动游标,让游标指向下一行。

调用这个 next() 它返回的是一个布尔值,为 true 阐明 ResultSet 中还有下一行的数据,为 false 阐明没有,所以能够联合 while 循环应用这个办法来遍历整个 ResultSet。

// 因为一开始的游标在第一行的前一行,所以执行 next() 后,游标就指向第一行的数据了
while (resultSet.next()) {// 处理结果集中每一行的数据}

获取到 ResultSet 对象后,挪动了光标指定了数据行,而后通过 ResultSet 对象提供的一系列 getXxxx() 办法来获取以后行的数据,比方 resultSet.getInt("price") 获取以后行中字段名为 price 的数据。

默认的 ResultSet 是不可更新的,同时它的游标只能一步一步 next 上来,只能走一遍,不能回到上一行的。说了默认,那阐明是能够设置的,通过如下代码进行设置:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
// rs 是能够滚动的,也就是游标走到最初又会回到结尾持续走,并且它的内容是能够被扭转的

查问

找到价格大于 50 块钱的所有游戏:

String sql = "SELECT id, name, price FROM tb_game WHERE price > ?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setDouble(1, 50);
// 执行查问
ResultSet rs = ps.executeQuery(sql);
List<Game> gameList = new ArrayList<>();
// 遍历后果集
while (rs.next()) {Game game = new Game();
    // 获取以后行中字段名为 id 的数据,并赋值到 game 对象中
    game.setId(rs.getInt("id"));
    game.setName(rs.getString("name"));
    game.setPrice(rs.getDouble("price"));
    gameList.add(game);
}
System.out.println(gameList);

批改(更新)操作

批改(更新)数据的操作,也是和插入数据的操作是相似的。

更新 ID 为 3 的数据记录,批改其价格为 298 块钱。

String sql = "UPDATE tb_game SET price = ? WHERE id = ?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setDouble(1, 298);
ps.setInt(2, 3);
int row = ps.executeUpdate();

删除操作

同理。

String sql = "DELETE FROM tb_game WHERE id = ?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setInt(1, 1);
int row = ps.executeUpdate();

分页查问

在 Java Web 中数据量十分大的状况下,是不利于将所有数据都展现到一个页面中的,查看不不便,又占用系统资源。此时就须要对数据进行分页查问,同时,当前的工作中,能够说大部分的业务场景都会波及到分页查问。

在 MySQL 中,分页能够通过其本身的 LIMIT 关键字来实现:

SELECT *
FROM tb_game
WHERE price > 50
ORDER BY price DESC
LIMIT 0, 10; // 从表中下标 0 开始(第一行的下标为 0),限度返回 10 条记录

目前分页波及到这样的两个参数:以后页码 页面大小

波及的 SQL 语句:SELECT * FROM tb_game WHERE price > 50 ORDER BY price DESC LIMIT 以后页码, 页面大小

// 分页参数
int currentPage = 1, pageSize = 10;
// 分页 SQL
String sql = "SELECT * FROM tb_game WHERE price > 50 ORDER BY price DESC LIMIT ?, ?";
PreparedStatement ps = conn.preparedStatement(sql);
// 赋值
ps.setInt(1, (page - 1) * pageSize);
ps.setInt(2, pageSize);
ResultSet rs = ps.executeQuery();

与此同时,还须要计算获取的数据的 总记录数 ,用于计算分页的 总页数,便于前端传递是要哪一页的数据给后端。

int count = 0;
String sql = "SELECT COUNT(*) FROM tb_game WHERE price > 50";
PreparedStatement ps = conn.preparedStatement(sql);
ResultSet rs = ps.executeQuery();
if (rs.next()) {// 获取总记录数,getInt(1) 是获取第一列的数据
    count = rs.getInt(1);
}

总结

目前在 Java 中通过 JDBC 来操作数据库,就有几个固定的步骤,先加载数据库驱动程序,接着获取数据库的连贯,有了这个连贯后,能力进行 CRUD 的操作,操作后也能够获取操作的后果,最初敞开这些资源,比方数据库连贯。

不过,在日常的开发中,根本不会用到原生的 JDBC 来操作数据库,个别咱们有多种抉择,能够应用 JdbcTemplate、Hibernate、MyBatis、JPA(Java Persistence API,Java 长久化 API)或者是其余任意的长久化框架。

最初的最初

由自己程度所限,不免有谬误以及不足之处,屏幕前的靓仔靓女们 如有发现,恳请指出!

最初,谢谢你看到这里,谢谢你认真对待我的致力,心愿这篇博客对你有所帮忙!

你轻轻地点了个赞,那将在我的心里世界削减一颗亮堂而夺目的星!

正文完
 0