JDBC | 模板模式&策略模式
这两天自己的机子出了怪现象,cmd窗口打不开,组策略编辑器打不开,但是有时可以打开,好象被人控制了一般,花十块钱升级了一下病毒库(金山毒霸),查了一天毒(一遍又一遍)...无病毒,最后还原了系统,至今不知道什么原因...见鬼了...
拿登陆模拟程序实现了如题两个模式的应用,用PreparedStatement防止了类似sql注入的不安全因素:
模板模式:
策略模式:
正是这些模式的引进,才让我们对数据的持久化实现技术越来越傻瓜,hibernate是从这些基础上发展过来的...
拿登陆模拟程序实现了如题两个模式的应用,用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(); } } } |