找回密码
 立即注册
查看: 53|回复: 0

java操作数据库之JDBC操作mysql

[复制链接]

73

主题

3

精华

77

金币

技术维护QQ:515138

积分
165
发表于 2025-11-17 08:33:20 | 显示全部楼层 |阅读模式
java操作数据库之JDBC和Mybatis
JDBC:(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API。 【是操作数据库最为基础、底层的技术】
但是使用JDBC来操作数据库,会比较繁琐,所以现在在企业项目开发中呢,一般都会使用基于JDBC的封装的高级框架,比如:Mybatis、MybatisPlus、Hibernate、SpringDataJPA。
JDBC-入门程序
需求:基于JDBC程序,执行update语句 (update user set age = 25 where id = 1)
步骤:
准备工作:创建一个maven项目,引入依赖;并准备数据库表user。
代码实现:编写JDBC程序,操作数据库
1,创建一个数据库 web,并在该数据库中创建user表
  1. create table user(
  2.     id int unsigned primary key auto_increment comment 'ID,主键',
  3.     username varchar(20) comment '用户名',
  4.     password varchar(32) comment '密码',
  5.     name varchar(10) comment '姓名',
  6.     age tinyint unsigned comment '年龄'
  7. ) comment '用户表';
  8. insert into user(id, username, password, name, age) values (1, 'daqiao', '123456', '大乔', 22),
  9.                                                            (2, 'xiaoqiao', '123456', '小乔', 18),
  10.                                                            (3, 'diaochan', '123456', '貂蝉', 24),
  11.                                                            (4, 'lvbu', '123456', '吕布', 28),
  12.                                                            (5, 'zhaoyun', '12345678', '赵云', 27);
复制代码
2,在 pom.xml 文件中引入依赖
  1. <dependencies>
  2.     <!-- MySQL JDBC driver -->
  3.     <dependency>
  4.         <groupId>mysql</groupId>
  5.         <artifactId>mysql-connector-java</artifactId>
  6.         <version>8.0.30</version>
  7.     </dependency>
  8.     <dependency>
  9.         <groupId>org.junit.jupiter</groupId>
  10.         <artifactId>junit-jupiter</artifactId>
  11.         <version>5.9.3</version>
  12.         <scope>test</scope>
  13.     </dependency>
  14. </dependencies>
复制代码
3,在 src/main/test/java 目录下编写测试类,定义测试方法
  1. package com.itheima;
  2. import com.itheima.pojo.User;
  3. import org.junit.jupiter.api.Test;
  4. import java.sql.*;
  5. public class JdbcTest {
  6.     /**
  7.      * JDBC入门程序
  8.      */
  9.     @Test
  10.     public void testUpdate() throws Exception {
  11.         //1. 注册驱动
  12.         Class.forName("com.mysql.cj.jdbc.Driver");
  13.         //2. 获取数据库连接
  14.         String url = "jdbc:mysql://localhost:3306/web01";
  15.         String username = "root";
  16.         String password = "1234";
  17.         Connection connection = DriverManager.getConnection(url, username, password);
  18.         //3. 获取SQL语句执行对象
  19.         Statement statement = connection.createStatement();
  20.         //4. 执行SQL
  21.         int i = statement.executeUpdate("update user set age = 25 where id = 1");//DML
  22.         System.out.println("SQL执行完毕影响的记录数为: " + i);
  23.         //5. 释放资源
  24.         statement.close();
  25.         connection.close();
  26.     }
  27.     @Test
  28.     public void testSelect(){
  29.         String URL = "jdbc:mysql://localhost:3306/web01";
  30.         String USER = "root";
  31.         String PASSWORD = "1234";
  32.         Connection conn = null;
  33.         PreparedStatement stmt = null;
  34.         ResultSet rs = null; //封装查询返回的结果
  35.         try {
  36.             // 1. 注册 JDBC 驱动
  37.             Class.forName("com.mysql.cj.jdbc.Driver");
  38.             // 2. 打开链接
  39.             conn = DriverManager.getConnection(URL, USER, PASSWORD);
  40.             // 3. 执行查询
  41.             String sql = "SELECT id, username, password, name, age FROM user WHERE username = ? AND password = ?"; //预编译SQL
  42.             stmt = conn.prepareStatement(sql);
  43.             stmt.setString(1, "daqiao");
  44.             stmt.setString(2, "123456");
  45.             rs = stmt.executeQuery();
  46.             // 4. 处理结果集
  47.             while (rs.next()) {
  48.                 User user = new User(
  49.                         rs.getInt("id"),
  50.                         rs.getString("username"),
  51.                         rs.getString("password"),
  52.                         rs.getString("name"),
  53.                         rs.getInt("age")
  54.                 );
  55.                 System.out.println(user); // 使用 Lombok 的 @Data 自动生成的 toString 方法
  56.             }
  57.         } catch (SQLException se) {
  58.             // Handle errors for JDBC
  59.             se.printStackTrace();
  60.         } catch (Exception e) {
  61.             // Handle errors for Class.forName
  62.             e.printStackTrace();
  63.         } finally {
  64.             // 5. 关闭资源
  65.             try {
  66.                 if (rs != null) rs.close();
  67.                 if (stmt != null) stmt.close();
  68.                 if (conn != null) conn.close();
  69.             } catch (SQLException se) {
  70.                 se.printStackTrace();
  71.             }
  72.         }
  73.     }
  74. }
复制代码
如果在测试时,需要传递一组参数,可以使用  @CsvSource 注解。
ResultSet(结果集对象):封装了DQL查询语句查询的结果。

  • next():将光标从当前位置向前移动一行,并判断当前行是否为有效行,返回值为boolean。
    • true:有效行,当前行有数据
    • false:无效行,当前行没有数据
  • getXxx(…):获取数据,可以根据列的编号获取,也可以根据列名获取(推荐)。
1.jpg
预编译代码如下:
  1. public class JDBCTest {
  2.     /**
  3.      * 编写JDBC程序, 查询数据
  4.      */
  5.     @Test
  6.     public void testJdbc() throws Exception {
  7.         // 获取连接
  8.         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web", "root", "1234");
  9.         // 创建预编译的PreparedStatement对象
  10.         PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?");
  11.         // 设置参数
  12.         pstmt.setString(1, "daqiao"); // 第一个问号对应的参数
  13.         pstmt.setString(2, "123456"); // 第二个问号对应的参数
  14.         // 执行查询
  15.         ResultSet rs = pstmt.executeQuery();
  16.         // 处理结果集
  17.         while (rs.next()) {
  18.             int id = rs.getInt("id");
  19.             String uName = rs.getString("username");
  20.             String pwd = rs.getString("password");
  21.             String name = rs.getString("name");
  22.             int age = rs.getInt("age");
  23.             System.out.println("ID: " + id + ", Username: " + uName + ", Password: " + pwd + ", Name: " + name + ", Age: " + age);
  24.         }
  25.         // 关闭资源
  26.         rs.close();
  27.         pstmt.close();
  28.         conn.close();
  29.     }
  30. }
复制代码
  • 防止SQL注入
  • 性能更高
' or '1' = '1,来完成SQL注入

AI提示词(prompt):
你是一名java开发工程师,帮我基于JDBC程序来操作数据库,执行如下SQL语句:
update user set password = '123456', gender = 2 where id = 1;
  1. @ParameterizedTest
  2. @CsvSource({"1,123456,25"})
  3. public void testUpdate(int userId, String newPassword, int newAge) throws Exception {
  4.     // 建立数据库连接
  5.     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web", "root", "1234");
  6.     // SQL 更新语句
  7.     String sql = "UPDATE user SET password = ?, age = ? WHERE id = ?";
  8.     // 创建预编译的PreparedStatement对象
  9.     PreparedStatement pstmt = conn.prepareStatement(sql);
  10.     // 设置参数
  11.     pstmt.setString(1, newPassword); // 第一个问号对应的参数
  12.     pstmt.setInt(2, newAge);      // 第二个问号对应的参数
  13.     pstmt.setInt(3, userId);         // 第三个问号对应的参数
  14.     // 执行更新
  15.     int rowsUpdated = pstmt.executeUpdate();
  16.     // 输出结果
  17.     System.out.println(rowsUpdated + " row(s) updated.");
  18.     // 关闭资源
  19.     pstmt.close();
  20.     conn.close();
  21. }
复制代码
  • JDBC程序执行DML语句:int rowsUpdated = pstmt.executeUpdate();  //返回值是影响的记录数
  • JDBC程序执行DQL语句:ResultSet resultSet = pstmt.executeQuery(); //返回值是查询结果集
综合项目:
JavaWeb(SpringBoot3+vue3)开发+教学管理系统项目实战
网站建设,公众号小程序开发,系统定制,软件App开发,技术维护【联系我们】手机/微信:17817817816 QQ:515138

QQ|Archiver|自丢网 ( 粤ICP备2024252464号-1 )

GMT+8, 2025-12-1 07:01

专注于网站建设,公众号小程序制作,商城小程序,系统定制,软件App开发

【联系我们】手机/微信:17817817816 QQ:515138

快速回复 返回顶部 返回列表