日期:2014-05-16  浏览次数:20551 次

JDBC中查询数据库的小技巧
我们是使用jdbc链接数据库,自己写的连接池。没有使用orm框架。因此对于使用ORM框架的童鞋可以跳过不用看。
1、 Trigger当insert或delete操作时需要更新统计数据时最好使用trigger
drop trigger if exists tri_creations_insert;
delimiter //
create trigger tri_creations_insert before insert on ck.t_creations
for each row
begin
    update t_sites set creation_num = creation_num + 1
    where pk_site = new.fk_site;
    update t_users set creation_num = creation_num +1
    where pk_user = new.fk_user;

end;//
delimiter ;
2、 当insert结束获取insert记录的id【注意红色字体部分】
pstmt = conn.prepareStatement("insert into  T_CREATIONS (fk_user, fk_site, title, content,fk_image,pub_time) values (?,?,?,?,?,now())",Statement.RETURN_GENERATED_KEYS);
pstmt.setInt(1, creation.getFk_user());
pstmt.setInt(2, creation.getFk_site());
pstmt.setString(3, creation.getTitle());
pstmt.setString(4, creation.getContent());
pstmt.setInt(5, creation.getFk_image());
if (1 == pstmt.executeUpdate()){
ResultSet rs = pstmt.getGeneratedKeys(); //获取 
rs.next();     
creationId = rs.getInt(1); 
}
3、 当批量更新表数据时【不推荐使用】
update t_clubs as a, (select fk_club, sum(creation_num) as  cnum,sum(user_num) as unum from t_sites group by fk_club) as b
set a.creation_num = b.cnum,a.user_num = b.unum
where a.pk_club=b.fk_club
语句结构[当table2可以是select的结果作为一章表]
update table1 as a, table2 as b set a.row1= b.row1 where a.row2=b.row2
4、 在DAO中添加一个获取表名的方法比如String getTableName(); 这样表名发生变化时只用修改该方法中的里面的值即可。同样方法可以在DAO中添加静态变量String COLS=“****”COLS为表的列名。
5、 在查询返回对象时,最好能使用下面的方法。如果直接使用new Object(rs.getInt(1)……),当一旦发生变化,则改动会非常大,涉及到对象的构造函数以及相关的所有地方。而且对象的构造函数会非常多。而使用下面的对象构造方法,则修改起来非常容易,想怎么变就怎么变。
rs = pstmt.executeQuery();
while (rs.next()) {
album.setPk_album(rs.getInt(1));
album.setFk_site(rs.getInt(2));
album.setName(rs.getString(3));
album.setImage(rs.getString(4));
album.setCreat_time(rs.getTimestamp(5));
album.setPic_num(rs.getInt(6));
}
6、 在查询时,可以多取出一些属性的数据,可以以备变化。还有就是一次能取出来的尽量别用两次。当然一些机密性数据如非必要还是不要取出来为好。如果不小心泄露了 呵呵 不好不好
7、 Mysql数据库的join操作其实速度并不是很慢,不要太担心这种操作的效率问题。相反mysql的嵌套查询效率很低,要慎用。
8、 小错误注意:sql语句换行时,注意前后留空格。
9、 插入数据时,对于一些状态信息(status)或者初始统计信息(num),可以不再插入时赋值,而是通过对表列设置默认值【前提insert时,初始值都是一样的】;对于数据值的后期更改只提供update或get方法
最最重要的是,做项目发现问题解决问题产生感想时一定要立即立即记录下来,这些都是点点滴滴的收获,不要像我现在看以前偶尔留下的问题记录回想感悟……现在根本就写不出来有没有……可惜开发的时候写代码的时间都嫌少 哪还有时间写这些呢!!!!