JDBC是代表一组独立于任何数据库管理系统(DBMS)的API

MySQL8使用时,url需要加参数:serverTimezone=UTC,否则会报错

Statement用于执行静态SQL语句,而PreparedStatement用于执行预编译的SQL语句,通常对于执行多次相似的语句更有效。

执行增、删、改,使用 int executeUpate()方法,接收执行条数。

执行查询,使用ResultSet executeQuery()方法,接收返回结果集。

1
2
3
4
5
6
7
8
//        Statement对象执行SQL
Statement statement = conn.createStatement();
int row1 = statement.executeUpdate("insert into jdbctest values (1,'张三','abc123')");

// PreparedStatement对象执行SQL
String sql = "insert into jdbctest values (2,'李四','abc123')";//发给服务器的sql语句
PreparedStatement preparedStatement = conn.prepareStatement(sql);
int row2 = preparedStatement.executeUpdate();

文件类型用new FileInputStream(path)

两者区别:

Statement 和预加载(PreparedStatement)在数据库操作中有以下主要区别:

  1. 编译方式
    • Statement:每次执行SQL时都会编译
    • PreparedStatement:SQL预编译一次,多次执行
  2. 参数处理
    • Statement:直接拼接SQL字符串,有SQL注入风险
    • PreparedStatement:使用参数化查询,更安全
  3. 性能
    • Statement:每次执行都需要编译,性能较低
    • PreparedStatement:预编译后执行效率更高,特别适合重复操作
  4. 数据类型处理
    • Statement:所有值都作为字符串处理
    • PreparedStatement:可以正确处理各种数据类型

实践建议

  1. 优先使用PreparedStatement,特别是在:
    • 有用户输入的情况下(防注入)
    • 需要多次执行相同SQL时(性能)
    • 处理非字符串数据类型时
  2. 仅在以下情况考虑Statement
    • 执行一次性、简单的SQL语句
    • 执行DDL语句(如CREATE TABLE)
    • 需要动态拼接非常复杂的SQL时

jdbc获取自增长键值

1
2
3
4
5
6
7
pst.executeUpdate();
//获取自增长键值
ResultSet generatedKeys = pst.getGeneratedKeys();
if (generatedKeys.next()) {
//因为自增长键值只有一个,所以这里直接getObject(1)即可
System.out.println("自增id值" + generatedKeys.getObject(1));
}

批处理

1
2
3
4
5
6
7
8
9
10
for (int i = 1; i <= 1000; i++) {
//设置1000次?的值
pst.setObject(1, 0);
pst.setObject(2, "冯七");
pst.setObject(3, "冯七的密码");
//先攒着这些数据,设置完,sql会重新编译一下,生成一条新的完整的sql
pst.addBatch();
}
//最后一口气执行
pst.executeBatch();