闲言少叙:
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