package jef.database.datasource; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import jef.common.log.LogUtil; import jef.database.dialect.DatabaseDialect; import jef.database.dialect.AbstractDialect; import jef.tools.StringUtils; /** * EF-ORM中简单的Datasource实现。 * 只有SimpleDataSource才支持带properties参数的getConnection()方法。从而获得Oracle的列注释 * * @author Administrator * */ public final class SimpleDataSource extends AbstractDataSource implements DataSourceWrapper { private String url; private String username; private String password; private String dbKey; private String racId; private String driverClass; private final java.util.Properties prop = new java.util.Properties(); @Override public String toString() { return StringUtils.concat(url, ":", username); } public SimpleDataSource() { }; public SimpleDataSource(String url,String user,String password) { this.url=url; this.username=user; this.password=password; } public SimpleDataSource(DataSourceInfo info) { this.url=info.getUrl(); this.driverClass=info.getDriverClass(); this.username=info.getUser(); this.password=info.getPassword(); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String user) { this.username = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDbKey() { return dbKey; } public void setDbKey(String dbKey) { this.dbKey = dbKey; } public String getRacId() { return racId; } public void setRacId(String racId) { this.racId = racId; } public Connection getConnection() throws SQLException { return getConnection(username, password); } public Connection getConnection(String username, String password) throws SQLException { initDriver(); java.util.Properties info=(Properties) this.prop.clone(); if (username != null) { info.put("user", username); } if (password != null) { info.put("password", password); } try{ return DriverManager.getConnection(url, info); }catch(SQLException e){ LogUtil.error("JDBC URL ERROR:[{}]",this.url); throw e; } } public Connection getConnectionFromDriver(Properties props) throws SQLException { initDriver(); if (username != null && !props.containsKey("user")) props.put("user", username); if (password != null && !props.containsKey("password")) props.put("password", password); return DriverManager.getConnection(url, props); } private void initDriver() { if(driverClass==null || driverClass.length()==0){ if (url.startsWith("jdbc:")) { int m=url.indexOf(':',5); String dbName = url.substring(5, m).trim(); DatabaseDialect profile = AbstractDialect.getProfile(dbName); if (profile == null) { throw new IllegalArgumentException("the db type " + dbName + " not supported!"); } driverClass=profile.getDriverClass(this.url); } } //注册驱动 try { Class.forName(driverClass); } catch (ClassNotFoundException e) { LogUtil.exception(e); } } public String getUser() { return username; } public String getDriverClass() { return driverClass; } public void setDriverClass(String driverClass) { this.driverClass = driverClass; } public void setUser(String user) { setUsername(user); } public boolean isConnectionPool() { return false; } @Override protected Class<? extends AbstractDataSource> getWrappedClass() { return null; } public void setWrappedDataSource(DataSource ds) {//do nothing... } public void putProperty(String key, Object value) { this.prop.put(key, value); } public Properties getProperties() { return prop; } }