使用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 字段,数据库会自动生成
Previous: 第一个JDBC程序
Next: 使用JDBC删除记录