前言
数据库的重要性显而易见,不论是什么零碎,什么应用软件,也不论它们是 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 的应用次要有如下几个步骤:
- 注册数据库驱动程序(database driver program)到 JDBC 的驱动管理器中。
在连贯数据库之前,须要将数据库厂商提供的数据库驱动类注册到 JDBC 的驱动管理器中,个别是把驱动类加载到 JVM 实现的。
Class.forName("com.mysql.jdbc.Driver");
- 构建数据库连贯的 URL。
要与数据库建设连贯,那么就须要构建数据库连贯的 URL,这个 URL 由数据库厂商指定,个别合乎一种根本格局,即 JDBC协定+IP地址或域名+端口+数据库名称
。MySQL 的 URL 是 jdbc:mysql://localhost:3306/dbname
- 获取连贯对象(Connection 对象)。
String url = "jdbc:mysql://localhost:3306/dbname";
String username = "root";
String password = "123456";
// Connection 对象的获取须要借助 DriverManager 对象
Connection conn = DriverManager.getConnection(url, username, password);
- 进行数据库操作。
编写 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 开始的。
- 敞开连贯
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)或者是其余任意的长久化框架。
最初的最初
由自己程度所限,不免有谬误以及不足之处, 屏幕前的靓仔靓女们
如有发现,恳请指出!
最初,谢谢你看到这里,谢谢你认真对待我的致力,心愿这篇博客对你有所帮忙!
你轻轻地点了个赞,那将在我的心里世界削减一颗亮堂而夺目的星!