代码改变世界

9月15日培训日记

2006-09-16 15:46  java ee spring  阅读(177)  评论(0编辑  收藏  举报

根据李杰将建立数据库连接的作业采用spring bean的方式来完成的,讲解了如下知识:
  1.BeanFactoryPostProcessor,PropertyPlaceholderConfigurer(把properties文件中的数据拿来换掉配置文件中的${})
  2.BeanPostProcessor的作用,BeanPostProcessor是监听其他bean的初始化过程,并且只能原型的bean。
  3.<Bean>元素的init-method属性。
总结流程:
  1.读取配置文件
  2.创建Bean实例
  3.调用BeanFactoryPostProcessor
  4.为Bean赋属性值
  5.调用BeanPostProcessor(只有ApplicationContext才会自动调用,BeanFactory不自动调用)
     5.1 postProcessBeforeInitialization(对初始化方法产生影响的代码)
         5.2  <Bean>元素的init-method属性
     5.3 postProcessAfterInitialization(要利用初始化方法结果的代码)

王泽佑写了个BeanFactoryPostProcessor,结果spring没有执行其中的方法?怎么回事?还是ApplicationContext与BeanFactory的问题。
看帮助:Connection,statement,ResultSet被垃圾回收后,都会自动关闭资源。Statement关闭会导致Resultset关闭。
要写就一块写(拧螺母故事和造坦克的故事):
 rs.close();
 rs = null;

点评王涛写的验证用户登录的程序:
import java.io.*;
import java.sql.*;

public class ErrorClass
{
 
 public static void main(String[] args)throws Exception
 {
    ResultSet rs=null;
   
    Connection con=null;
    Statement sm = null;
    BufferedReader br = null;
     
    Class.forName("com.mysql.jdbc.Driver");
   try{
  
    con = DriverManager.getConnection("jdbc:mysql://localhost/itcast","root","");
    sm = con.createStatement(ResultSet.CONCUR_UPDATABLE,ResultSet.TYPE_SCROLL_INSENSITIVE);
    
    br = new BufferedReader(new InputStreamReader(System.in));
    rs = sm.executeQuery("select student.name,student.psw from student"); 
    System.out.println("请输入用户名,按回车结束");
    String inuse = br.readLine();
    
    System.out.println("请输入密码,按回车结束");
    String inpsw = br.readLine();
    br.close();
    //Boolean bool = false;
    
    while(rs.next())
    {
     if(inuse.equals(rs.getString(2)) && inpsw.equals(rs.getString(3)))
     {
      System.out.println("用户名和密码正确");
      //bool = true;
      break;
     }
     
    }
    if(rs.isAfterLast())
    {
     System.out.println("用户名和密码错误");
    }
   } 
   catch(Exception e)
   {
    e.printStackTrace();
   }
   
   finally
   {
   
    rs.close();
    con.close();
    sm.close();
  
   }
 }
}
问题:
      1.变量命名应尽量与大多数人的习惯一致,例如,con改为cn,sm改为stmt
      2.判断找到记录的方式还可以改善,while条件中只负责判断是否找到,找到和没找到的打印信息应在while之后,并且rs.isAfterLast()是否可靠也值得怀疑。
      3.查询出所有用户后再比较判断用户是否存在,这是一个非常低劣的做法,如果记录较多,运行效率会很低。
      4.最后关闭结果集,命令和连接的代码写得太随意,太马虎!
通过王涛写的这个程序,发现学员当前更需要动手练习,然后由老师指正学员程序中的问题。我们应多布置些有实际意义和解决实际问题的练习题,然后对学员完成的作业进行点评。课后调查了一下,学员们现在都急切需要留出一段时间来总结和消化前面所讲的知识。