发表于: 2017-10-10 19:03:23
2 676
今天完成的事情:
1 学习jdbc的批处理
接触到新的一个类PreparedStatement用来批处理:
通过connection.prepareStatement(sql)获得一个PreparedStatement对象,然后系统会对这句sql语句预编译处理,在接下来可以重复利用,比Statement处理相同数量的语句更快。另一方面,它支持利用?占位的方式写动态参数化sql语句。
! 相比于Statement,它更安全。
防止SQL注入错误:
如果验证查询使用strSQL = "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"';";
userName和passWord都填入1' OR '1'='1,
则strSQL = "SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';";
判断语句恒成立。。结果就是绕过验证,直接进入了。
利用PreparedStatement参数化查询时数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行。可以防止大部分SQl注入错误。
简单的例子:
String sql = "INSERT INTO student VALUES (?,?,?)";//?占位
PreparedStatement ps = connect.prepareStatment(sql);//预编译
ps.setInt(1,10);//第一个参数是序号(1开始),第二个参数是要传入的值
ps.setSpring(2,"XX");
ps.setInt(3,10);
利用后:
效果感人 比昨天提高了4倍
在url后面添加了一个参数:
rewriteBatchedStatements=true
我的天!只有1秒多
然后通过addBatch和executeBatch函数+开启rewriteBatchedStatements:
public void testAddByDB2() throws SQLException {
int id = 1;
String sql = "INSERT INTO student1 VALUES (?,?,?) ";
Connection connection = DBConnection.getConnection();
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for(int i = 1; i <= 100; i++){
for(int j = 1; j <= 5000; j++){
preparedStatement.setInt(1,id++);
preparedStatement.setInt(2,i+j);
preparedStatement.setInt(3,i + j * 2);
preparedStatement.addBatch();//缓存
}
preparedStatement.executeBatch();//发送给数据库执行
connection.commit();
preparedStatement.clearBatch();//清除缓存
}
connection.close();
System.out.println("测试完成");
}
传入50万条数据(包含3个int类型的)用时5秒不到。
2 进行查询对比
100W
index的有事稍微体现了些。
插了3000W:
查询:
index的优势很明显了~~~
2个亿:
额,预计半小时了
查询:
已经不能比了。
测试版本基于mysql-connect-java-5.1.44。
明天计划的事情:
遇到的问题:
收获:
1 感受到index在查询时候的效率了。
2 练习了sql的批量处理。
评论