-
Notifications
You must be signed in to change notification settings - Fork 12
Yong Zhu edited this page Mar 5, 2018
·
9 revisions
根据当前数据库方言类型,用pagin方法可以将一个SQL文本翻译成对应当前方言的分页SQL:
DataSource dataSource= new HikariDataSource();//连接池
dataSource.setJdbcUrl("...");//连接池配置
dataSource.setDriverClassName("...");//连接池配置
...
Dialect d=Dialect.guessDialect(dataSource); //根据数据源判断方言类型,
//Dialect d=Dialect.guessDialect(connection); //或根据连接来判断方言类型
//Dialect d=Dialect.MySQL5Dialect; //或手工指定数据库方言类型
String result=d.pagin(3, 10, "select * from users where age>?"); //创建分页SQL
上例中可以看出,Dialect实例的来源有三种:
- 从DataSource中推测当前方言。 jDialects将从DataSource实例中新建连接、判断当前数据库方言,并最终将连接归还给连接池。
- 从connection中推测当前方言。 注意guessDialect(Connection conn)这种用法不负责关闭连接。
- 手工指定方言。Dialect本身是一个枚举(Enum)类型,可以从当前支持的75种数据库方言中手工指定一个最符合当前数据库的方言。
调用pagin方法来获取分页SQL时,第一个参数为页数,第二个参数为每页的记录数,第三个参数为待变换的SQL文本。jDialects不负责查询总记录数,这不是分页所必需的参数。
上例的运行结果:
当方言为MySQL5Dialect, 结果为: "select * from users where age>? limit 20, 10"
当方言为Oracle8iDialect, 结果为: "select * from ( select row_.*, rownum rownum_ from ( select * from users where age>? ) row_ ) where rownum_ <= 30 and rownum_ > 20"
当方言为Oracle12cDialect, 结果为: "select * from users where age>? offset 20 rows fetch next 10 rows only"
当方言为Sybase11Dialect, 抛出DialectExcepiton异常并提示: "Sybase11Dialect" does not support physical pagination
大多数情况下,都会获得一个分页SQL文本,但有个别数据库不支持物理分页,将会抛出DialectException异常。具体有哪些数据库不支持分页,如果想详细了解的话,可以参见项目根目录的DatabaseDialects.xls文件。