package jef.database.routing.jdbc; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import jef.database.SessionFactory; import jef.database.DbClient; import jef.database.datasource.AbstractDataSource; import jef.database.datasource.DataSourceLookup; import jef.database.datasource.RoutingDataSource; import jef.database.innerpool.JConnection; /** * 将EF-ORM封装为一个标准的JDBC DataSource。 * * <pre> * 使用此DataSource进行JDBC操作,可以享受由EF-ORM带来的以下特性—— * 1、数据库SQL改写,支持本地化操作。目前支持的SQL特性包括 * 数据库函数转换 * SQL || /concat运算符转换 * 日期函数、Interval关键字等转换 * 表名/列名 as alias的兼容处理。 * Oracle Start with.. connect by * limit ? offset ?关键字的分页 * 2、分库分表路由 * 支持insert / update /select /delete四类语句,要求均为单表操作。 * 分库条件:对于insert语句采用values值计算目标,对于另外三种语句根据where值计算目标。 * insert场景下,路由条件必须完整。 * 其他三种语句下,可以支持不完整的路由条件(往往会引起多表和多库查询) * * 支持的特性—— * 单库CRUD操作 * 跨库count / max /min /sum函数 * 跨库group by / having * 跨库distinct * 跨库limit分页 * 跨库排序 * 不支持的特性—— * 多表关联 * 跨库时:select avg(x) from table * </pre> */ public class JDataSource extends AbstractDataSource { private SessionFactory db; public JDataSource() { } public JDataSource(SessionFactory lookup) { this.db = lookup; } /** * 构造 * * @param lookup */ public JDataSource(DataSourceLookup lookup) { this.db = new DbClient(new RoutingDataSource(lookup)); } @Override public Connection getConnection() throws SQLException { return new JConnection(db); } @Override public Connection getConnection(String username, String password) throws SQLException { return getConnection(); } @Override protected Class<? extends DataSource> getWrappedClass() { return null; } /** * Return the dbclient * @return */ public DbClient getDbClient() { if(db instanceof DbClient){ return (DbClient)db; } throw new UnsupportedOperationException(); } }