JDBC编程中遇到的一点小问题

众所周知,java语言中采用了JDBC技术,为大量的java程序员提供了方便的数据库访问机制,客户程序员无需关心项目或者产品采用那种数据库,也不必在意各种数据库之间的差异,JDBC提供了统一的API供客户程序员使用,这种技术大大简化了程序员的工作量,从而使得程序员能花更多的时间去关注处理业务,但是在实际的实用中,虽然JDBC的各方 面封装都已经很好,而且性能也不错(至少在比hibernate的性能要好很多),但是在一些小细节上,一不小心还是会犯错,笔者就曾经遇到过这样的问题,改了很久都没有发现问题所在,后来仔细一行一行的读代码后终于发现这个隐藏的很深的问题,详情如下:

/*******

*javaBean

*/

class Student{

    String name;

    int id;

public void setName(String name){

   this.name=name;

}

public void setId(int id){

 this.id=id;

}

public String getName(){

 return name;

}

publlic int getId(){

 

return id;

}

public String toString(){

  return "name:"+this.name+",id="+this.id;

}

}

 

/****

*query bean

*/

class Dao{

ResultSet rs=null;

    /**

    *...略...

   */

 

List<Student> list = new ArrayList<Student>();

 Student st  = new Studendt();

 

 while(rs.hasNext()){

    st.setId(rs.getInt("id"));

    st.setName(rs.getString("name"));

   list.add(st);

}

 /***不知道读者有没有发现上述代码的问题**/

int size = list.size();

for(int i=0;i<size;i++){

  Student st=list.get(i);

System.out.println(st);

}

/**数据库中有10条学生信息记录,但打印出来的十条语句却只是同一个学生的信息,

*直接打印list时发现list里添加的10个内存地址一样的student的对象,

*笔者在这上面花了很多时间最后把代码改为如下才正*确的取到了10条学生信息

*/

whie(rs.hasNext()){

  Student st=new Student();

   st.setId(rs.getInt("id"));

    st.setName(rs.getString("name"));

    list.add(st);

}

/**这样在遍历list之后就正确的取出了10个学生的信息

*究其原因是因为list是允许添加相同的对象的,它是对象

*添加的顺序来区别添加进去的对象,而此前的代码中由于

*只在while循环外声明了一个student对象,而在while里

*只是不断的改变了该对象的属性,实际上相当于把相同的

*student对象添加了10次,所以打印list时取到的是10个

*内存地址相同的student对象,把student的声明放在while

*里去就对了,但是这会出现一个性能问题那就是假如数据库

*里有10万条记录,那么我们的这次查询将导致new 10万

*个student对象,这或多或少会对我们的

*应用的性能会造成影响,因此更好的做法是:

*/

whie(rs.hasNext()){

  Student st=new Student();

   st.setId(rs.getInt("id"));

    st.setName(rs.getString("name"));

    list.add(st);

    st=null;

}

/***因为我while里的student对象只是一个临时的作用,

*因此在每次把它添加到list后就显示的把它声明为null

*这样可以明确的告诉jvm该个对象已经作废,你在适当

*的时机里可以把它销毁了,而不必等到jvm的内存不够用时

*才去销毁这些无用的对象

*/

*/

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值