大话设计模式实战之工厂方法的实现——链接数据库应用

工厂方法的优点在这里不说了,网上搜索一大堆,自己看

如果使用JDBC链接数据库,数据库从MySql切换到Oracle,需要改动的就是切换一下驱动的名称,其他的都不需要修改,这就是工厂方法灵活性的一个直接的例子

纸上谈兵空谈

上代码:

public abstract class AbstractSqlFactory {

    
    //这个就是泛型的类的实例就是需要控制的在JDK1.5中的特性
    public abstract <T extends SqlUtil> T createSql(Class<T> c);
    
}


====================================
package com.fxr.工厂方法模式的应用;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public interface  SqlUtil {

    //数据库的连接
    public Connection getConnection();
    
    //关闭数据库的方法的实现
    public void closeDB(Connection conn, Statement stmt, ResultSet rs);
    
}
====================================
package com.fxr.工厂方法模式的应用;

public class SqlFactory extends AbstractSqlFactory{

    @Override
    public <T extends SqlUtil> T createSql(Class<T> c) {
        SqlUtil sqlUtil = null;
        try{
            
            sqlUtil = (SqlUtil)Class.forName(c.getName()).newInstance();
            
        }catch(Exception e){
            System.out.println("出现错误!");
        }
        return (T)sqlUtil;
    }

}
==========================================
package com.fxr.工厂方法模式的应用;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MySqlUtilImpl implements SqlUtil{

    private static String driver = "com.mysql.jdbc.Driver";// 数据库驱动字符串
    private static String url = "jdbc:mysql://localhost/studentsystem?useUnicode=true&characterEncoding=utf-8";// 连接URL
    private static String user = "yonghumingcheng"; // 数据库用户名
    private static String password = "mima"; // 用户密码
    
    
    @Override
    public Connection getConnection() {
        
         Connection con=null;
            try{
                Class.forName(driver);
            }catch(ClassNotFoundException e){
                System.out.println("加载驱动错误信息:" + e.getMessage());
            }
            try{
                con=DriverManager.getConnection(url,user,password);
            }catch(SQLException e){
                System.out.println("数据库连接错误信息:" + e.getMessage());
                e.printStackTrace();
            }
            return con;
    }

    @Override
    public void closeDB(Connection conn, Statement stmt, ResultSet rs) {
        // 若结果集对象不为空,则关闭
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                // 若Statement 对象不为空,则关闭
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                // 若数据库连接对象不为空,则关闭
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
        
    }

    
}
===========================================
package com.fxr.工厂方法模式的应用;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlServerUtilImpl implements SqlUtil{

    private String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
     private static final String uri="jdbc:sqlserver://127.0.0.1:1433; DatabaseName=demo.db";
    private String userName = "yonghumingcheng";
    private String password = "mima";
    
    
    @Override
    public Connection getConnection() {
        
         Connection con=null;
            try{
                Class.forName(driver);
            }catch(ClassNotFoundException e){
                System.out.println("加载驱动错误信息:" + e.getMessage());
            }
            try{
                con=DriverManager.getConnection(driver,userName,password);
            }catch(SQLException e){
                System.out.println("数据库连接错误信息:" + e.getMessage());
                e.printStackTrace();
            }
            return con;
    }

    @Override
    public void closeDB(Connection conn, Statement stmt, ResultSet rs) {
        // 若结果集对象不为空,则关闭
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                // 若Statement 对象不为空,则关闭
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                // 若数据库连接对象不为空,则关闭
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
        
    }

}

 

posted on 2015-07-16 10:34  aicpcode  阅读(284)  评论(0编辑  收藏  举报

导航