使用JDBC插入记录

使用JDBC插入记录

插入数据表我们不使用 Statement 了,而是使用 PreparedStatement。这个我们可以使用参数化,也就是可以在sql语句里面使用 ? 问号,然后下面再去设置这个值。这样可以防止sql注入的问题。

完整代码

import java.sql.*;

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//注册JDBC驱动
        String url = "jdbc:mysql://localhost:3306/tablename1?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true";
        Connection conn = DriverManager.getConnection(url,"root","123321");
        String sql = "insert into user(name) values (?)";
        PreparedStatement statement = conn.prepareStatement(sql);
        statement.setString(1, "张三");//下标从1开始
        int res = statement.executeUpdate();//返回受影响的记录数
        //插入多条记录
        statement.setString(1, "李四");
        statement.executeUpdate();
        //插入多条记录
        statement.setString(1, "王五");
        statement.executeUpdate();
        //记得要关闭连接
        if(statement != null) {
            statement.close();
        }
        if(conn != null) {
            conn.close();
        }
        System.out.println("执行成功。");
    }
}Code language: JavaScript (javascript)

补充说明

  • PreparedStatement 预编译sql语句,? 是占位符,下标从1开始
  • setString(1, “张三”) 表示设置第1个 ? 的值为 “张三”,还有 setInt()、setDate() 等方法对应不同类型
  • executeUpdate() 返回受影响的行数,插入成功返回1
  • 同一个 PreparedStatement 对象可以多次设置参数并多次执行,适合批量插入场景
  • 批量插入更高效的方式是用 addBatch() + executeBatch():
statement.setString(1, "张三");
statement.addBatch();
statement.setString(1, "李四");
statement.addBatch();
statement.setString(1, "王五");
statement.addBatch();
statement.executeBatch();Code language: CSS (css)
  • PreparedStatement 能有效防止sql注入,因为参数值不会被当作sql代码解析
  • 如果 user 表有自增主键 id,插入时不需要指定 id 字段,数据库会自动生成

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注