之前在学习JDBC使用的过程中,主要使用了实现类是StatementImpl单独执行的一些SQL语句,一直也是相安无事。在最近复习JDBC的过程中,发现了一些新知识,发现了新大陆 PreparedStatement
。
PreparedStatement
是Java编程语言中的一个接口,用于执行预编译的SQL语句。它继承自 Statement
接口,允许在执行SQL查询之前将参数添加到SQL语句中。通过使用 PreparedStatement
,可以避免在每次执行查询时重新解析和编译SQL语句,提高了性能和安全性。此外,它允许参数化查询,即将动态值作为参数传递到SQL语句中,防止了SQL注入攻击的风险。PreparedStatement
接口还支持批处理操作,能够有效地执行一组SQL语句,减少了与数据库的通信次数,提升了数据库操作的效率。通过预先编译SQL语句并重复使用 PreparedStatement
对象,可以更高效地与数据库进行交互,是进行数据库操作时常用的一种方式。
相比较来讲,PreparedStatement
优点还是挺多的:
预编译相比较动态SQL性能是比较强的,特别在批处理的场景下,相比较单个执行SQL语句性能就更好了。通常我在批量爬虫的时候,喜欢把所有的数据存一份到数据库中。所以先拿这个场景练手了。
我模拟了批量插入用户数据到数据库中的场景,为了简化,我只保留了2列 age
和 name
。下面是我的测试Demo:
static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/FunTester"// 数据库连接url
String username = "root"// 数据库用户名
String password = "password"// 数据库密码
String query = "INSERT INTO users (age, name) VALUES (?, '?')"// SQL语句
Connection connection = DriverManager.getConnection(url, username, password)// 获取连接
PreparedStatement preparedStatement = connection.prepareStatement(query)// 获取PreparedStatement
preparedStatement.setInt(1, getRandomInt(100))// 设置参数
preparedStatement.setString(2, "FunTester" + StringUtil.getString(20))// 设置参数
preparedStatement.addBatch()// 添加到批处理
preparedStatement.setInt(1, getRandomInt(100))// 设置参数
preparedStatement.setString(2, "FunTester" + StringUtil.getString(20))// 设置参数
preparedStatement.addBatch()// 添加到批处理
preparedStatement.executeBatch()// 执行批处理
preparedStatement.close()// 关闭PreparedStatement
connection.close()// 关闭连接
}
在使用批处理的过程中,有些事项还是多注意的: