JDBC | 模板模式&策略模式
来源:互联网 发布:四川师范大学网络教育 编辑:程序博客网 时间:2024/06/06 00:58
这两天自己的机子出了怪现象,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是从这些基础上发展过来的...
总觉得这样写有问题,虽然是套上了设计模式...高手在哪???
对登陆模拟程序做了一下改进,实现了如题两个模式的应用,用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是从这些基础上发展过来的...
总觉得这样写有问题,虽然是套上了设计模式...高手在哪???
- JDBC | 模板模式&策略模式
- 策略模式&模板模式
- 策略模式模板模式
- 策略模式&&模板方法模式
- 模板模式和策略模式
- 模板方法模式,策略模式
- 模板和策略模式
- 模板实现策略模式
- 设计模式-模板方法模式 策略模式
- 策略模式,模板模式,工厂模式
- JDBC之使用策略模式和模板方法模式优化代码
- 策略模式还是模板方法模式?
- 模板模式和策略模式的区别
- 模板模式和策略模式的区别
- 模板模式和策略模式的区别
- 模板模式和策略模式的区别
- 模板模式和策略模式的区别
- 模板模式和策略模式的区别
- 听声诊断 主板报警声含义
- 安装了VMware Workstation的第一天
- 用js数组联动下拉框
- SQL内置函数
- IT时代周刊:IBM中国10年转型
- JDBC | 模板模式&策略模式
- Ruby之symbol研究
- Active Sync over WiFi in Windows Mobile 5
- ulimit 命令
- windows程序设计课程演示程序下载
- 引用和宏定义的汇编实现
- 在DataGrid中利用CheckBox全选所有行
- 金融服务平台项目测试工作总结
- 认真的对待批评以保护前进的动力