闲言少叙:
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.youkuaiyun.com/detail/hellojava1234/5926509