由于这段实习阶段用到数据库相关的知识较多大概列举了一下流程,边实践变写。
尽量对每个技术点的认识更加深刻
第一部分:JDBC编程部分技巧
1.批处理SQL(Batch)
PrepareStatment的addBatch()
使用场景1:多条sql批处理
批量添加同时可以动态set静态sql中占位符?.
简单举例
public static int[] batchTest() {
int[] result=null;
Connection conn = null;
PreparedStatement ps = null;
conn = DataBaseUtils.getConnection();
String sql="insert into bzb_test(id,name,pass) values (?,?,?)";
try {
conn.setAutoCommit(false);
ps=conn.prepareStatement(sql);
ps.setInt(1, 4);
ps.setString(2, "root4");
ps.setString(3, "root4");
ps.addBatch();
ps.setInt(1, 5);
ps.setString(2, "root5");
ps.setString(3, "root5");
ps.addBatch();
result=ps.executeBatch();
// 成功执行完提交
conn.commit();
return result;
} catch (SQLException e) {
// 失败后将开始的执行回滚
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
return null;
} finally {
DataBaseUtils.close(ps);
DataBaseUtils.close(conn);
}
}
将结果数组控制台输出结果:(-2状态代表执行成功,未知影响条数)
数据库查询结果:
使用场景2::多条静态的sql批处理
addBatch("put static sql String"); example: select * from user where username='test';
addBatch("put static sql String");
addBatch("put static sql String");
最后执行PrepareStatment的executeBatch();
亲测提示:ps.addBatch("insert into bzb_test(id,name,pass) values (1,'root9','root9')");
有的版本可能不支持此特性
小感悟:使用addBatch()的executeBatch()的优点在于可以高效的批量执行。
但应该根据不同的业务场景选择不同的实现技术,比如addBatch有时返回状态码返回-2,代表sql执行成功,但位置影响行记录数。
这就打不到对状态的精准控制,有时候不如ps.executeUpdate()返回的int来得直接;
我在业务代码中就用下面的方法获取每条sql影响的记录数:
for (String str : sqls) {//遍历执行sql集合
ps = conn.prepareStatement(str);
ps.executeUpdate();//这里可以单独提取每条sql的影响行记录数
}
2.游标设置(分段读取)
3.流读取(Blob等“大内容”)
4.连接池(DBCP---commons.xxx.jar---xxx:dbcp,pool,logging)
参数设置:最小空闲连接数 最大连接数
连接池连接失效问题(DBMS的连接超过设置的连接时长后超时,就像Mysql的默认8小时超时设置)
定时的去判断连接是否失效,失效丢弃重新获取,这个需要根据项目,根据 数据库设置调优
第二部分:数据库架构设计方面