预处理Statement

什么是CRUD

CRUD 是 增删改查的英文首字母拼接 . 对应到 sql 里就是

insert/create delete/drop alter/update select/show

为什么用PreparedStatement

  1. 预编译SQL语句 , 语句固定可以复用
  2. 参数化查询 , 依靠值传递 , 有效防止传入关键字或导致sql注入的问题

源码贴在这里

java 复制代码
package com.zpero.base;

import org.junit.Test;

import java.sql.*;
import java.util.Scanner;

public class JDBCOperation {
    @Test
    public void testQuerySingleRowAndCol() throws SQLException {
        //注册驱动
        //获取连接
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps =
                conn.prepareStatement("SELECT count(*) as Count FROM teacher");

        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getInt("Count"));

        }
        rs.close();
        ps.close();
        conn.close();

    }
    @Test
    public void testQuerySingleRow() throws Exception {
        //注册驱动
        //获取连接
        Connection conn2 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps2 =
                conn2.prepareStatement("SELECT * FROM teacher where id = ?");
        ps2.setInt(1, 10);
        ResultSet rs2 = ps2.executeQuery();
        while (rs2.next()) {
            int id = rs2.getInt("id");
            String formattedId = String.format("%03d", id);
            String tname = rs2.getString("tname");
            int age = rs2.getInt("age");
            String object = rs2.getString("object");
            int salary = rs2.getInt("salary");
            String email = rs2.getString("email");
            System.out.println(formattedId + '\t' + tname + '\t' + age + '\t' + object + '\t' + salary + '\t' + email);
        }
    }

    @Test
    public void testQueryMoreRow() throws SQLException {
        //注册驱动
        //获取连接
        Connection conn3 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps3 =
                conn3.prepareStatement("SELECT * FROM teacher where age > ?");
        ps3.setInt(1, 25);
        ResultSet rs3 = ps3.executeQuery();
        while (rs3.next()) {
            int id = rs3.getInt("id");
            String formattedId = String.format("%03d", id);
            String tname = rs3.getString("tname");
            int age = rs3.getInt("age");
            String object = rs3.getString("object");
            int salary = rs3.getInt("salary");
            String email = rs3.getString("email");
            System.out.println(formattedId + '\t' + tname + '\t' + age + '\t' + object + '\t' + salary + '\t' + email);

        }
        rs3.close();
        ps3.close();
        conn3.close();

    }

    @Test
    public void testInsert () throws SQLException {
        Connection conn4 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );
        PreparedStatement ps4 =
                conn4.prepareStatement("INSERT INTO teacher(id,tname,age , object ,salary , email ) VALUES (?,?,?,?,?,?)");
        ps4.setInt(1,12);  ps4.setString(2,"曼波"); ps4.setInt(3,18);
        ps4.setString(4,"体育"); ps4.setInt(5,5000); ps4.setString(6,"manbo@school.com");

        int count = ps4.executeUpdate();

        if(count > 0){
            System.out.println("success");
        }else {
            System.out.println("failed");
        }
        ps4.close();
        conn4.close();
    }
    @Test
    public void testUpdate () throws Exception {

        Connection conn5 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps5 = conn5.prepareStatement("update teacher set salary = ? where tname = ?");
        ps5.setInt(1,3000);
        ps5.setString(2,"曼波");
        int count = ps5.executeUpdate();
        if(count > 0){
            System.out.println("success");
        }else {
            System.out.println("failed");
        }
        ps5.close();
        conn5.close();


    }
    @Test
    public  void testDelete () throws Exception {
        Connection conn6 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );
        PreparedStatement ps6 = conn6.prepareStatement("delete from teacher where tname = ?");
        ps6.setString(1,"曼波");
        int count = ps6.executeUpdate();
        if(count > 0){
            System.out.println("success");
        }else {
            System.out.println("failed");
        }
        ps6.close();
        conn6.close();
    }


}

@Test是 Junit 参数化测试注解 ,因此要导入 JUnit jar包 junit hamcrest jar包 hamcrest 点击jar 即可下载

同上一篇文章流程 导入lib文件库 文章链接

添加class文件 JDBCOperation

PreparedStatement查询

查询有多少条记录

java 复制代码
@Test
    public void testQuerySingleRowAndCol() throws SQLException {
        //注册驱动
        //获取连接
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps =
                conn.prepareStatement("SELECT count(*) as Count FROM teacher");

        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getInt("Count"));

        }
        rs.close();
        ps.close();
        conn.close();

    }

注册驱动被集成到了 DriverManager中 具体代码见 上一篇文章 注册驱动 部分 , 具体思路就是 Drive 类 实现了 驱动接口 , 然后在静态代码块中实现了加载时自动注册

executeQuery() 方法返回的类型是 ResultSet 类型

查询单行数据

java 复制代码
 @Test
    public void testQuerySingleRow() throws Exception {
        //注册驱动
        //获取连接
        Connection conn2 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps2 =
                conn2.prepareStatement("SELECT * FROM teacher where id = ?");
        ps2.setInt(1, 10);
        ResultSet rs2 = ps2.executeQuery();
        while (rs2.next()) {
            int id = rs2.getInt("id");
            String formattedId = String.format("%03d", id);
            String tname = rs2.getString("tname");
            int age = rs2.getInt("age");
            String object = rs2.getString("object");
            int salary = rs2.getInt("salary");
            String email = rs2.getString("email");
            System.out.println(formattedId + '\t' + tname + '\t' + age + '\t' + object + '\t' + salary + '\t' + email);
        }
    }

查询多行数据

Java 复制代码
 @Test
    public void testQueryMoreRow() throws SQLException {
        //注册驱动
        //获取连接
        Connection conn3 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps3 =
                conn3.prepareStatement("SELECT * FROM teacher where age > ?");
        ps3.setInt(1, 25);
        ResultSet rs3 = ps3.executeQuery();
        while (rs3.next()) {
            int id = rs3.getInt("id");
            String formattedId = String.format("%03d", id);
            String tname = rs3.getString("tname");
            int age = rs3.getInt("age");
            String object = rs3.getString("object");
            int salary = rs3.getInt("salary");
            String email = rs3.getString("email");
            System.out.println(formattedId + '\t' + tname + '\t' + age + '\t' + object + '\t' + salary + '\t' + email);

        }
        rs3.close();
        ps3.close();
        conn3.close();

    }

增加新数据

java 复制代码
  @Test
    public void testInsert () throws SQLException {
        Connection conn4 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );
        PreparedStatement ps4 =
                conn4.prepareStatement("INSERT INTO teacher(id,tname,age , object ,salary , email ) VALUES (?,?,?,?,?,?)");
        ps4.setInt(1,12);  ps4.setString(2,"曼波"); ps4.setInt(3,18);
        ps4.setString(4,"体育"); ps4.setInt(5,5000); ps4.setString(6,"manbo@school.com");

        int count = ps4.executeUpdate();

        if(count > 0){
            System.out.println("success");
        }else {
            System.out.println("failed");
        }
        ps4.close();
        conn4.close();
    }

executeUpdate() 返回 int数据 , 受影响的行数

Java 复制代码
 @Test
    public void testUpdate () throws Exception {

        Connection conn5 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );

        PreparedStatement ps5 = conn5.prepareStatement("update teacher set salary = ? where tname = ?");
        ps5.setInt(1,3000);
        ps5.setString(2,"曼波");
        int count = ps5.executeUpdate();
        if(count > 0){
            System.out.println("success");
        }else {
            System.out.println("failed");
        }
        ps5.close();
        conn5.close();


    }

java 复制代码
 @Test
    public  void testDelete () throws Exception {
        Connection conn6 = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mssqldata",
                "root",
                "123456"
        );
        PreparedStatement ps6 = conn6.prepareStatement("delete from teacher where tname = ?");
        ps6.setString(1,"曼波");
        int count = ps6.executeUpdate();
        if(count > 0){
            System.out.println("success");
        }else {
            System.out.println("failed");
        }
        ps6.close();
        conn6.close();
    }
相关推荐
熟悉的新风景6 分钟前
springboot项目或其他项目使用@Test测试项目接口配置-spring-boot-starter-test
java·spring boot·后端
晴空月明2 小时前
分布式系统高可用性设计 - 监控与日志系统
后端
songroom2 小时前
【转】Rust: PhantomData,#may_dangle和Drop Check 真真假假
开发语言·后端·rust
红尘散仙3 小时前
Rust 终端 UI 开发新玩法:用 Ratatui Kit 轻松打造高颜值 CLI
前端·后端·rust
mldong3 小时前
mldong-goframe:基于 GoFrame + Vben5 的全栈快速开发框架正式开源!
vue.js·后端·go
canonical_entropy3 小时前
集成NopReport动态生成复杂Word表格
后端·低代码
come112344 小时前
Go 包管理工具详解:安装与使用指南
开发语言·后端·golang
绝无仅有4 小时前
OSS文件上传解析失败,错误:文件下载失败的排查与解决
后端·面试·架构
LaoZhangAI4 小时前
Kiro vs Cursor:2025年AI编程IDE深度对比
前端·后端