使用DB模式操作多数据库查询方言的切换

sunnyrainsky 发布于 2013/12/21 18:18
阅读 1K+
收藏 1

@JFinal 你好,想跟你请教个问题:我要操作多数据库,有mysql,oracle和sqlserver的,配置如下

cp = new C3p0Plugin("jdbc:oracle:thin:@xxx.xx.xx.xx:1521:ora10yw","ha","h2009a");
cp.setDriverClass("oracle.jdbc.driver.OracleDriver");
me.add(cp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
arp.setShowSql(true);
me.add(arp);
arp.setDialect(new OracleDialect());
arp.setContainerFactory(new CaseInsensitiveContainerFactory());

cpmysqlswjcms = new C3p0Plugin("jdbc:mysql://xxx.xx.xx.xx/swjcms?characterEncoding=GBK&zeroDateTimeBehavior=convertToNull","vhhadmin","vhhadmin");
cpmysqlswjcms.setDriverClass("com.mysql.jdbc.Driver");
me.add(cpmysqlswjcms);

cpmysqlRWDB = new C3p0Plugin("jdbc:mysql://xxx.xx.xx.xx/RWDB?characterEncoding=GBK&zeroDateTimeBehavior=convertToNull","vhhadmin","vhhadmin");
cpmysqlRWDB.setDriverClass("com.mysql.jdbc.Driver");
me.add(cpmysqlRWDB);

在查询时,使用DB模式,直接写sql,
String sitessql = "select * ";
String sitesqlexceptselect = "from ST_STBPRP_B where STTP in ("+sitetype+")";
// DbKit.setDialect(new MysqlDialect());
Page<Record> siterecords = Db.paginate(Config.cpmysqlRWDB.getDataSource(),1,10,sitessql,sitesqlexceptselect);
跟踪执行里面,分页查询时怎么默认用的oracle的数据库方言,断点代码在Db.class,dialect默认是oracle的,

DbKit.dialect.forPaginate(sql, pageNumber, pageSize, select, sqlExceptSelect);

,而没有使用mysql的,好像也没有地方单独指定进行切换,这个问题怎么解决,是我多数据库的配置有误吗?急救,谢谢,使用的最新jfinal1.5版本

加载中
0
JFinal
JFinal

     JFinal ActiveRecodPlugin 中的 Dialect 是共享的,所以如果需要动态切换 dialect,需要使用 DbKit.setDialect(...) 来实现。但此法在目前只能用于单线程。

    JFinal 后续会设计一个极简的完美支持多线程、多数据源、多方言、嵌套事务的方案彻底提升 ActiveRecord 功能一个等级

0
宏哥
宏哥

引用来自“JFinal”的答案

     JFinal ActiveRecodPlugin 中的 Dialect 是共享的,所以如果需要动态切换 dialect,需要使用 DbKit.setDialect(...) 来实现。但此法在目前只能用于单线程。

    JFinal 后续会设计一个极简的完美支持多线程、多数据源、多方言、嵌套事务的方案彻底提升 ActiveRecord 功能一个等级

Dialet 实际上本质是无法支持的

比如那个connect by.

建议加强原生的结果集操作进行更多支持, 这才是 jFinal 走向严谨的商务应用的更好选择.

0
JFinal
JFinal

引用来自“宏哥”的答案

引用来自“JFinal”的答案

     JFinal ActiveRecodPlugin 中的 Dialect 是共享的,所以如果需要动态切换 dialect,需要使用 DbKit.setDialect(...) 来实现。但此法在目前只能用于单线程。

    JFinal 后续会设计一个极简的完美支持多线程、多数据源、多方言、嵌套事务的方案彻底提升 ActiveRecord 功能一个等级

Dialet 实际上本质是无法支持的

比如那个connect by.

建议加强原生的结果集操作进行更多支持, 这才是 jFinal 走向严谨的商务应用的更好选择.

    JFinal ActiveRecordPlugin 中的 Dialect 仅仅对基本的增删改查及分页有支持,是为了支持这类操作:

User.dao.findById(123);

从而不用这样写: User.dao.find("select * from where id=?", 123),省点代码。

    JFinal 的 Dialect 是为不同数据库生成基本的增删改查代码而存在的,并不是为了跨数据库,与 @宏哥 的理念一致JFinal 不会考虑使用Dialect实现跨数据库。

0
opal
opal

怎么简单的问题,还要绕来绕绕去,能拿到connection,就能得到metadata,就能知道jdbc连的是什么数据库,就能知道要使用哪个dialect,根本不需要手工设置dialect

对哪些需要手工设置dialect的,感到比较失望

0
sunnyrainsky
sunnyrainsky
多谢各位的回复,大牛的设计挺不错,准备尝试下,之前一个小项目写接口操作oracle数据库,感觉jfinal比较方便,所以继续在项目中实践,现在的项目跨数据库操作是家常便饭了,期待jfinal在多数据库操作支持上能做的更好
返回顶部
顶部