hibernate动态数据库进化版

闲言少叙:


import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate配置
 * @author chendaojun
 *
 */
public class DynamicHibernateConfiguration extends Configuration {
	public DynamicHibernateConfiguration() {
		super();
	}

	public void reset() {
		super.reset();
	}

	public DynamicHibernateConfiguration(String dialect, String driverClass,
			String ipAddress, String port, String dataBaseName,
			String username, String password) throws HibernateException {
		String connection_url = "";
		if (dialect.indexOf("MySQL") > -1) {
			connection_url = "jdbc:mysql://" + ipAddress + "/" + dataBaseName;
		} else if (dialect.indexOf("SQLServer") > -1) {
			connection_url = "jdbc:sqlserver://" + ipAddress + ":" + port
					+ ";DataBaseName=" + dataBaseName;
		} else if (dialect.indexOf("Oracle") > -1) {
			connection_url = "jdbc:oracle:thin:@" + ipAddress + ":" + port
					+ ":" + dataBaseName;
		} else {
			throw new HibernateException("The dialect was not allowed.==fd=="
					+ dialect);
		}
		super.setProperty("hibernate.connection.provider_class","com.jolbox.bonecp.provider.BoneCPConnectionProvider");
		super.setProperty("hibernate.dialect", dialect);
		super.setProperty("hibernate.connection.url", connection_url);
		super.setProperty("hibernate.connection.driver_class", driverClass);
		super.setProperty("hibernate.connection.username", username);
		super.setProperty("hibernate.connection.password", password);
		super.setProperty("bonecp.idleMaxAge", "60");
		super.setProperty("bonecp.idleConnectionTestPeriod", "5");
		super.setProperty("bonecp.maxConnectionsPerPartition", "60");
		super.setProperty("bonecp.minConnectionsPerPartition", "20");
		super.setProperty("bonecp.partitionCount", "3");
		super.setProperty("bonecp.acquireIncrement", "10");
		super.setProperty("bonecp.statementsCacheSize", "50");
		super.setProperty("bonecp.preparedStatementCacheSize", "50");
		super.setProperty("bonecp.releaseHelperThreads", "3");
		super.setProperty("bonecp.connectionTestStatement", "select 1 from dual");
//		super.setProperty("hibernate.show_sql", "true");    
	}

	public DynamicHibernateConfiguration(String dialect, String driverClass,
			String ipAddress, String port, String dataBaseName,
			String username, String password, String schema, String catalog)
			throws HibernateException {
		String connection_url = "";
		if (dialect.indexOf("MySQL") > -1) {
			connection_url = "jdbc:mysql://" + ipAddress + "/" + dataBaseName;
		} else if (dialect.indexOf("SQLServer") > -1) {
			connection_url = "jdbc:sqlserver://" + ipAddress + ":" + port
					+ ";DataBaseName=" + dataBaseName;
		} else if (dialect.indexOf("Oracle") > -1) {
			connection_url = "jdbc:oracle:thin:@" + ipAddress + ":" + port
					+ ":" + dataBaseName;
		} else {
			throw new HibernateException("The dialect was not allowed.==fd=="
					+ dialect);
		}
		super.setProperty("hibernate.connection.provider_class","com.jolbox.bonecp.provider.BoneCPConnectionProvider");
		super.setProperty("hibernate.dialect", dialect);
		super.setProperty("hibernate.connection.url", connection_url);
		super.setProperty("hibernate.connection.driver_class", driverClass);
		super.setProperty("hibernate.connection.username", username);
		super.setProperty("hibernate.connection.password", password);
		super.setProperty("hibernate.default_schema", schema);
//		super.setProperty("hibernate.default_catalog", catalog);
//		super.setProperty("hibernate.show_sql", "true");   
		super.setProperty("bonecp.idleMaxAge", "60");
		super.setProperty("bonecp.idleConnectionTestPeriod", "5");
		super.setProperty("bonecp.maxConnectionsPerPartition", "60");
		super.setProperty("bonecp.minConnectionsPerPartition", "20");
		super.setProperty("bonecp.partitionCount", "3");
		super.setProperty("bonecp.acquireIncrement", "10");
		super.setProperty("bonecp.statementsCacheSize", "50");
		super.setProperty("bonecp.preparedStatementCacheSize", "50");
		super.setProperty("bonecp.releaseHelperThreads", "3");
		super.setProperty("bonecp.connectionTestStatement", "select 1 from dual");
	}

}




import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
/**
 * 动态会话工厂类
 * @author 陈道俊改进版
 *
 */
public class DynamicSessionFactory {    
	   
//    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";    
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();    
    private static DynamicHibernateConfiguration configuration = new DynamicHibernateConfiguration();    
    private static org.hibernate.SessionFactory sessionFactory;    
    private static List<DynamicHibernateConfiguration> configurationList = new ArrayList<DynamicHibernateConfiguration>();
    private static Map<String, SessionFactory> sessinFactoryMap = new HashMap<String, SessionFactory>();
//    private static String configFile = CONFIG_FILE_LOCATION;    
   
   /* static {    
        try {    
    		configuration.configure(configFile);    
    		sessionFactory = configuration.buildSessionFactory();    
        } catch (Exception e) {    
            System.err.println("%%%% 创建临时会话工厂错误 %%%%");    
            e.printStackTrace();    
        }    
    }*/    
   
    private DynamicSessionFactory() {    
    }    
   
    /**   
     * Returns the ThreadLocal Session instance. Lazy initialize the   
     * <code>SessionFactory</code> if needed.   
     *    
     * @return Session   
     * @throws HibernateException   
     */   
    public static Session getSession() throws HibernateException {    
        Session session = (Session) threadLocal.get();    
   
        if (session == null || !session.isOpen()) {    
            if (sessionFactory == null) {    
                rebuildSessionFactory();    
            }    
            session = (sessionFactory != null) ? sessionFactory.openSession()    
                    : null;    
            threadLocal.set(session);    
        }    
   
        return session;    
    }    
   
    /**   
     * Rebuild hibernate session factory   
     *    
     */   
    public static void rebuildSessionFactory() {    
        try {    
            // configuration.configure(configFile);    
            sessionFactory = configuration.buildSessionFactory();    
        } catch (Exception e) {    
            System.err.println("%%%% 重建临时会话工厂错误 %%%%");    
            e.printStackTrace();    
        }    
    }    
   
    public static void reflashSessionFactory(    
            DynamicHibernateConfiguration tempConfiguration) {    
        try {    
            // configuration.configure(configFile);
        	
        	// hibernate配置相同的标志
        	boolean flag = false; 
        	for (DynamicHibernateConfiguration config : configurationList) {
        		if (tempConfiguration.getProperty("hibernate.dialect").equals(config.getProperty("hibernate.dialect"))    
                    && tempConfiguration.getProperty("hibernate.connection.url").equalsIgnoreCase(config.getProperty("hibernate.connection.url"))    
                    && tempConfiguration.getProperty("hibernate.connection.username").equals(config.getProperty("hibernate.connection.username"))    
                    && tempConfiguration.getProperty("hibernate.connection.password").equals(config.getProperty("hibernate.connection.password"))) {    
                    configuration = config;
                    sessionFactory = sessinFactoryMap.get(configuration.getProperty("hibernate.connection.url")+configuration.getProperty("hibernate.connection.username"));
                    flag = true;
                    break;
        		}
			}
        	if (!flag){    
                closeSession();    
                closeSessionFactory();    
                configuration.reset();    
                configuration = tempConfiguration;    
                configurationList.add(configuration);
                sessionFactory = configuration.buildSessionFactory();
                sessinFactoryMap.put(configuration.getProperty("hibernate.connection.url")+configuration.getProperty("hibernate.connection.username"), sessionFactory);
//                System.out.println("%%%% 会话工厂在这里重新开始 %%%%");    
            }    
        } catch (Exception e) {    
            System.err.println("%%%% 会话工厂重新开始错误 %%%%");    
            e.printStackTrace();    
        }    
    }    
   
    public static void closeSessionFactory() throws HibernateException {    
        try {
        	if (sessionFactory != null) {
        		sessionFactory.close();    
			}
        } catch (Exception e) {    
            System.err.println("%%%% 会话工厂关闭错误 %%%%");    
            e.printStackTrace();    
        }    
    }    
   
    /**   
     * Close the single hibernate session instance.   
     *    
     * @throws HibernateException   
     */   
    public static void closeSession() throws HibernateException {    
        Session session = (Session) threadLocal.get();    
        threadLocal.set(null);    
   
        if (session != null) {    
            session.close();    
        }    
    }    
   
    /**   
     * return session factory   
     *    
     */   
    public static org.hibernate.SessionFactory getSessionFactory() {    
        return sessionFactory;    
    }    
   
    /**   
     * return session factory   
     *    
     * session factory will be rebuilded in the next call   
     */   
    /*public static void setConfigFile(String configFile) {    
        TempSessionFactory.configFile = configFile;    
        sessionFactory = null;    
    }*/    
   
    /**   
     * return hibernate configuration   
     *    
     */   
    public static DynamicHibernateConfiguration getConfiguration() {    
        return configuration;    
    }    
   
}  





import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;


/**
 * 数据库操作
 * 
 * @author 陈道俊改进版
 * 
 */
public class DynamicHibernateDAO {
	public Session session = null;


	private Query query = null;;

	/**
	 * @param Dialect
	 *            //数据库方言
	 * @param dbDriver
	 *            //数据驱动
	 * @param dbUrl
	 *            //数据库地址
	 * @param DbPort
	 *            //数据库端口
	 * @param DbName
	 *            //数据库名
	 * @param DbUserName
	 *            //数据库用户名
	 * @param DbUserPassword
	 *            //数据库密码
	 * @return
	 */
	public DynamicHibernateConfiguration setHibernateConfig(String dialect,
			String driverClass, String ipAddress, String port,
			String dataBaseName, String username, String password,
			String schema, String catalog) {
		DynamicHibernateConfiguration configuration = null;
		if (schema != null && schema != "") {
			configuration = new DynamicHibernateConfiguration(dialect,
					driverClass, ipAddress, port, dataBaseName, username,
					password, schema, catalog);
		} else {
			configuration = new DynamicHibernateConfiguration(dialect,
					driverClass, ipAddress, port, dataBaseName, username,
					password);
		}
		return configuration;
	}

	/**
	 * 获取session
	 * 
	 * @return
	 */
	public void reflashDbConnection(
			DynamicHibernateConfiguration configuration, String dialect,
			String driverClass, String ipAddress, String port,
			String dataBaseName, String username, String password,
			String tableName) {

		session = DynamicSessionFactory.getSession();

	}

	public Session getSession() {
		return session;
	}

	/**
	 * 获取sqlSession
	 * 
	 * @return
	 */
	public Session getTempSession() {
		return DynamicSessionFactory.getSession();
	}


	/**
	 * 执行数据库操作时先执行此方法
	 * 
	 * @param dialect
	 * @param driverClass
	 * @param ipAddress
	 * @param port
	 * @param dataBaseName
	 * @param username
	 * @param password
	 * @param schema
	 * @param catalog
	 * @param tableName
	 */
	public void dynamicSqlOperateBefore(String dialect, String driverClass,
			String ipAddress, String port, String dataBaseName,
			String username, String password, String schema, String catalog,
			String tableName) {

		DynamicHibernateConfiguration configuration = setHibernateConfig(
				dialect, driverClass, ipAddress, port, dataBaseName, username,
				password, schema, catalog);
		DynamicSessionFactory.reflashSessionFactory(configuration);
		session = DynamicSessionFactory.getSession();
	}

	/**
	 * 获取对象
	 * @param dialect
	 * @param driverClass
	 * @param ipAddress
	 * @param port
	 * @param dataBaseName
	 * @param username
	 * @param password
	 * @param schema
	 * @param catalog
	 * @param tableName
	 * @param idColumn
	 * @param id
	 * @return
	 */
	public Object get(String dialect, String driverClass, String ipAddress,
			String port, String dataBaseName, String username, String password,
			String schema, String catalog, String tableName, String idColumn,
			Long id) {
		dynamicSqlOperateBefore(dialect, driverClass, ipAddress, port,
				dataBaseName, username, password, schema, catalog, tableName);
		StringBuilder sql = new StringBuilder();
		sql.append("select * from " + tableName + " where " + idColumn + "="
				+ id);
		query = session.createSQLQuery(sql.toString()).setResultTransformer(
				Transformers.ALIAS_TO_ENTITY_MAP);
		Object object = query.uniqueResult();

		// session.close();
		return object;
	}

	/**
	 * 获取对象列表
	 * @param dialect
	 * @param driverClass
	 * @param ipAddress
	 * @param port
	 * @param dataBaseName
	 * @param username
	 * @param password
	 * @param schema
	 * @param catalog
	 * @param tableName
	 * @param sortColumn
	 * @param params
	 * @param iDisplayStart
	 * @param iDisplayLength
	 * @return
	 */
	public List<Map<String, Object>> getObjectList(String dialect, String driverClass,
			String ipAddress, String port, String dataBaseName,
			String username, String password, String schema, String catalog,
			String tableName, String sortColumn, Map<String, String> params,
			Integer iDisplayStart, Integer iDisplayLength) {
		dynamicSqlOperateBefore(dialect, driverClass, ipAddress, port,
				dataBaseName, username, password, schema, catalog, tableName);

		if (iDisplayStart == null) {
			iDisplayStart = 1;
			if (iDisplayLength == null) {
				iDisplayLength = 10;
			}
		}
		StringBuilder sql = new StringBuilder();
		String dbType = DynamicSessionFactory.getConfiguration().getProperty("hibernate.connection.driver_class");
		if (dbType.contains("oracle")) {
			// oracle分页
			sql.append("select * from(select A.*, rownum rn from (");
		} else if(dbType.contains("mysql")) {
		}
		sql.append("select * from " + tableName + " where 1=1");
		if (params != null) {
			if (!params.isEmpty()) {
				Set<String> keys = params.keySet();
				for (String paramKey : keys) {
					String paramVal = params.get(paramKey);
					sql.append(" and " + paramKey + "='" + paramVal + "'");
				}
			}
		}
		
		if (sortColumn != null && sortColumn != "") {
			sql.append(" order by "+sortColumn+" desc");
		}
		
		if (dbType.contains("oracle")) {
			sql.append(") A where rownum <= " + iDisplayLength + ") where rn >= "
					+ iDisplayStart);
		} else if(dbType.contains("mysql")) {
			// mysql分页
			sql.append(" limit "+iDisplayStart+" ,"+iDisplayLength);
		}
		
		query = session.createSQLQuery(sql.toString()).setResultTransformer(
				Transformers.ALIAS_TO_ENTITY_MAP);
		List<Map<String, Object>> list = query.list();

		return list;
	}

	/**
	 * 记录总数查询
	 * @param dialect
	 * @param driverClass
	 * @param ipAddress
	 * @param port
	 * @param dataBaseName
	 * @param username
	 * @param password
	 * @param schema
	 * @param catalog
	 * @param tableName
	 * @param params
	 * @param iDisplayStart
	 * @param iDisplayLength
	 * @return
	 */
	public int getTotalCount(String dialect, String driverClass,
			String ipAddress, String port, String dataBaseName,
			String username, String password, String schema, String catalog,
			String tableName, Map<String, String> params,
			Integer iDisplayStart, Integer iDisplayLength) {
		 dynamicSqlOperateBefore(dialect, driverClass, ipAddress, port,
		 dataBaseName, username, password, schema, catalog, tableName);

		StringBuilder sql = new StringBuilder();
		sql.append("select count(*) from " + tableName);
		query = session.createSQLQuery(sql.toString());
		int totalCount = ((Number) query.uniqueResult()).intValue();
		return totalCount;
	}

}

import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;

public class DynamicHibernateTest {
	public static void main(String[] args) {  
	    try{  
	          
	        Session session=null;
	          
	        // oracle
	        DynamicHibernateConfiguration configuration1 = new DynamicHibernateConfiguration("org.hibernate.dialect.OracleDialect","oracle.jdbc.driver.OracleDriver",  
	                "ip","1521","orcl","uname","pwd");  
	        System.out.println("hibernate.connection.url==1="+DynamicSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));  
	        DynamicSessionFactory.reflashSessionFactory(configuration1);             
	        System.out.println("hibernate.connection.url==2="+DynamicSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));  
	          
	        session=DynamicSessionFactory.getSession();  
	        Query query1 = session.createSQLQuery("select * from WCMDBA.WCM_NEWS where NID=20825").setResultTransformer(  
	                Transformers.ALIAS_TO_ENTITY_MAP);  
	        Map obj1 = (Map)query1.setMaxResults(1).uniqueResult();  
	        System.out.println("fd1111===="+obj1.get("NID"));  
	  
	          
	          
	        // mysql  
	        System.out.println("hibernate.connection.url==3="+DynamicSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));  
	        DynamicHibernateConfiguration configuration2 = new DynamicHibernateConfiguration("org.hibernate.dialect.MySQLInnoDBDialect","com.mysql.jdbc.Driver",  
	                "127.0.0.1","3306","mobileCampus","root","root");              
	        DynamicSessionFactory.reflashSessionFactory(configuration2);  
	          
	        System.out.println("hibernate.connection.url==4="+DynamicSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));  
	        session=DynamicSessionFactory.getSession();  
	        Query query2 = session.createSQLQuery("select * from phone_app ").setResultTransformer(  
	                Transformers.ALIAS_TO_ENTITY_MAP);  
	        Map obj2 = (Map)query2.setMaxResults(1).uniqueResult();  
	        System.out.println("fd2222===="+obj2.get("app_id"));  
	          
	    }catch (Exception e) {  
	        System.err.println(e);  
	    }  
	} 
}


参考:http://feicer.iteye.com/blog/583079

资源地址:http://download.csdn.net/detail/hellojava1234/5926509




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值