JDBC | 模板模式&策略模式
这两天自己的机子出了怪现象,cmd窗口打不开,组策略编辑器打不开,但是有时可以打开,好象被人控制了一般,花十块钱升级了一下病毒库(金山毒霸),查了一天毒(一遍又一遍)...无病毒,最后还原了系统,至今不知道什么原因...见鬼了...

拿登陆模拟程序实现了如题两个模式的应用,用PreparedStatement防止了类似sql注入的不安全因素:
模板模式:
package cn.zhd;
import cn.zhd.*;
import java.sql.*;
import org.apache.log4j.*;
//模板类
abstract class Jdbc_Template {
    Connection cn=null;
    PreparedStatement pstatm=null;
    ResultSet rs=null;
    Configuration config=null;
    Logger log=Logger.getLogger(Jdbc_Template.class);
    public void setConfig(Configuration config){
        this.config=config;
    }
    public void execute(String user,String pass){
        try{
            Class.forName(config.getValue("driver"));
   
            cn=DriverManager.getConnection(config.getValue("URL"),config.getValue("user"),config.getValue("pass"));   

            doExecute(pstatm,user,pass);

        }catch(Exception e){
            log.warn(e);
            e.printStackTrace();
        }
        finally{
            if(cn != null)    {
                try{
                    if(pstatm != null){
                        try{
                            if(rs != null){
                                try{
                                    rs.close();                                   
                                }catch(Exception e){
                                    log.warn(e);
                                    e.printStackTrace();
                                }
                            }
                            pstatm.close();
                        }catch(Exception e){
                            log.warn(e);
                            e.printStackTrace();
                        }
                    }
                    cn.close();
                }catch(Exception ex){
                    log.warn(ex);
                    ex.printStackTrace();
                }
            }   
               
        }
    }
       

    abstract void doExecute(PreparedStatement pstatm,String user,String pass);
       

}
//继承自模板
public class Jdbc_Template extends Jdbc_Template{
   
    public void doExecute(PreparedStatement pstatm,String user,String pass){

        boolean foo=false;
        if(cn==null){

            log.warn("connect is failure!");
            return;
        }
        String query="select * from login where user=? and pass=?";

        try{
            pstatm=cn.prepareStatement(query);
            pstatm.setString(1,user);
            pstatm.setString(2,pass);
            rs=pstatm.executeQuery();
            while(rs.next()){
       
                foo=true;
                break;
            }
            if(foo){
           
                log.warn("welcome"+"  "+user);
            }
            else

                log.warn("failure!");
        }catch(SQLException e){
            log.warn(e);
            e.printStackTrace();
        }   
    }
   
    public static void main(String []args){
        Logger log=Logger.getLogger(JdbcTemplate.class);
        try{
            Configuration cfg=new Configuration("/JdbcDemo.properties");
            JdbcTemplate jm=new JdbcTemplate();
            jm.setConfig(cfg);
//            用spring的话,上面的代码就可以不写了,直接用xml配置
            jm.execute("zz","123");
        }catch(Exception e){
            log.warn(e);
            e.printStackTrace();
        }
    }
}

策略模式:
package cn.zhd;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.log4j.Logger;

interface MyPolicy{
    public void Login(Connection cn,PreparedStatement pstatm,Configuration config,String user,String pass);
}
//登陆算法1
class MyStrategy1 implements MyPolicy{

    public void Login(Connection cn,PreparedStatement pstatm,Configuration config,String user,String pass){
        boolean foo=false;
        Logger log=Logger.getLogger(MyStrategy1.class);     
        try{
            String query=config.getValue("select1");
            pstatm=cn.prepareStatement(query);
            pstatm.setString(1,user);
            pstatm.setString(2,pass);
            ResultSet rs=pstatm.executeQuery();
            while(rs.next()){
                foo=true;
                break;
            }
            if(foo){
                System.out.print("sdsdf");
                log.warn("cheng gong denglu!");
            }
            else
                log.warn("denglu shibai");
        }catch(SQLException e){
            log.warn(e);
        }
    }
}
//登陆算法2
class MyStrategy2 implements MyPolicy{
    public void Login(Connection cn,PreparedStatement pstatm,Configuration config,String user,String pass){
        boolean foo_u=false;
        boolean foo_p=false;
        Logger log=Logger.getLogger(MyStrategy2.class);
       
       
        try{
            String query1=config.getValue("select2");
            String query2=config.getValue("select3");
            pstatm=cn.prepareStatement(query1);
           
            pstatm.setString(1,user);
            ResultSet rs=pstatm.executeQuery();   
            while(rs.next()){
                foo_u=true;
            }
            if(foo_u){
                pstatm=cn.prepareStatement(query2);
                pstatm.setString(1,user);
                ResultSet rst=pstatm.executeQuery();
                while(rst.next()){
                    System.out.println(rst.getString("pass") + pass.toString());
                    //caonima
                    if(rst.getString("pass").equals(pass.toString())){
                        foo_p=true;
                        System.out.println(rst.toString());
                    }   
                }
            }
            if(foo_u && foo_p){
                log.warn("weclome" +"  "+ user+"!");
            }
            else if(foo_u==false){
                log.warn("user"+"is"+"not"+"this");
            }
            else if(foo_p==false)
                log.warn("pass"+"is"+"not"+"this");
               
        }catch(SQLException e){
            log.warn(e);
        }

    }
}

public class JdbcStrategy {
    MyPolicy mp1=new MyStrategy1();
    MyPolicy mp2=new MyStrategy2();
    Connection cn=null;
    PreparedStatement pstatm=null;
    ResultSet rs=null;
    Configuration config=null;
    Logger log=Logger.getLogger(JdbcStrategy.class);
    public void setConfig(Configuration config){
        this.config=config;
    }
    public void executeLogin(String user,String pass){
        try{
            Class.forName(config.getValue("driver"));
            cn=DriverManager.getConnection(config.getValue("URL"),config.getValue("user"),config.getValue("pass"));
            if(cn==null){
                log.warn("connect is failure");
                return;
            }
    //控制运行时所选登陆算法       
    //        mp1.Login(cn,pstatm,config,user,pass);
            mp2.Login(cn,pstatm,config,user,pass);
        }catch(ClassNotFoundException e){
            log.warn(e);
        }catch(SQLException e){
            log.warn(e);
        }
        finally{
            if(cn != null)    {
                try{
                    if(pstatm != null){
                        try{
                            if(rs != null){
                                try{
                                    rs.close();                                  
                                }catch(Exception e){
                                    log.warn(e);
                                    e.printStackTrace();
                                }
                            }
                            pstatm.close();
                        }catch(Exception e){
                            log.warn(e);
                            e.printStackTrace();
                        }
                    }
                    cn.close();
                }catch(Exception ex){
                    log.warn(ex);
                    ex.printStackTrace();
                }
            }
        }  
    }
    public static void main(String[] args) {
        Logger log=Logger.getLogger(JdbcStrategy.class);
        try{
            Configuration cfg=new Configuration("/JdbcDemo.properties");
            JdbcStrategy js=new JdbcStrategy();
            js.setConfig(cfg);
            js.executeLogin("zhd","223");
        }catch(Exception e){
            log.warn(e);
            e.printStackTrace();
        }

    }

}

正是这些模式的引进,才让我们对数据的持久化实现技术越来越傻瓜,hibernate是从这些基础上发展过来的...