java操作MySQL
mysql 概述

数据模型


java 操作数据库
JDBC:使用java语言操作关系型数据库的一套api,但是纯原生比较繁琐还是 框架 ** 规整一些。

JDBC—入门程序
- 步骤:
- 创建maven项目,引入依赖并准备数据库表user.
- 编写jdbc程序并操作数据库
创建一个普通的java 项目 ** 并选择maven。
<!-- 引入数据库操作对应的依赖-->
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
初步尝试jdbc
package com.huohuo;
import org.junit.Test;
import java.sql.*;
public class jdbcTest {
@Test // 测试方法
public void testUpdate() throws Exception {
// 操作数据库的流程
// 1。注册驱动, 固定套路
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.连接数据库
String url = "jdbc:mysql://localhost:3306/web-01";
String username = "root";
String password = "wanghaobo666";
Connection connection = DriverManager.getConnection(url, username, password);
// 3.获取sql语句的执行对象
Statement statement = connection.createStatement();
// 4.执行sql语句
int i = statement.executeUpdate("update user set age = 25 where id = 1");
System.out.println("执行完毕影响的记录数:" + i);
// 5.释放资源
statement.close();
System.out.println("hello");
}
}
其中注册驱动和建立连接还有释放资源都是固定的套路
查询解析

@Test
public void testSelect() throws Exception {
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
// 以上三个资源都需要关闭,所以要使用try-catch-finally
try {
// 1。注册驱动, 固定套路
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.连接数据库
String url = "jdbc:mysql://localhost:3306/web-01";
String username = "root";
String password = "wanghaobo666";
conn = DriverManager.getConnection(url, username, password);
String sql = "SELECT id, username, password, name, age FROM user WHERE username = ? AND password = ?";
preparedStatement = conn.prepareStatement(sql); // 预编译SQL,减少sql执行
preparedStatement.setString(1, "daqiao"); // 设置占位符的参数username = ? 的
preparedStatement.setString(2, "123456"); // 设置占位符的参数
resultSet = preparedStatement.executeQuery(); // 查询的结果集对象是 ResultSet, 可以遍历
List<User> users = new ArrayList<>();
while (resultSet.next()) {
User user = new User(
resultSet.getInt("id"),
resultSet.getString("username"),
resultSet.getString("password"),
resultSet.getString("name"),
resultSet.getInt("age")
);
users.add(user);
System.out.println(user);
}
System.out.println(users);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (resultSet != null) {
resultSet.close();
}
}
}
- 释放数据库连接资源
Connection对象表示与数据库的物理连接。每次与数据库进行交互时,都会使用一个连接对象。如果连接不关闭,数据库连接池可能会达到最大连接数限制,导致无法创建新的连接,影响系统的正常运行。关闭连接释放了资源,确保连接池中的连接能够被复用。
- 释放SQL语句资源
PreparedStatement是执行预编译 SQL 查询的对象,它会在内存中占用一定的资源。如果不关闭,可能会导致内存泄漏或持久化连接池中的资源被浪费。尤其是在执行大量的数据库操作时,长期不关闭PreparedStatement对象可能会影响系统性能。
- 释放结果集资源
ResultSet对象代表了查询的结果集。在使用完查询结果后,如果不关闭ResultSet,它将占用数据库服务器和客户端的资源,可能导致内存泄漏,甚至影响查询的并发执行。当查询的结果集包含大量数据时,这种影响尤其明显。
预编译SQL
在查询语句中:
String sql = "SELECT id, username, password, name, age FROM user WHERE username = ? AND password = ?";
preparedStatement = conn.prepareStatement(sql); // 预编译SQL,减少sql执行
preparedStatement.setString(1, "daqiao"); // 设置占位符的参数username = ? 的
preparedStatement.setString(2, "123456"); // 设置占位符的参数
并没有写死,而是使用了?占位符,在执行之前对占位符进行了赋值。这种形式称之为预编译sql

致谢:本文参考黑马程序员的视频。 https://www.bilibili.com/video/BV1yGydYEE3H/?vd_source=1b8f9bfb1d0891faf1c70d7678ae56db