Dorado 5 : 9.5.方言自定义 (RF1)

Dorado实现数据库编程时为了提高存取数据库的效率以及获取数据库本身支持的特殊功能。提供了方言处理机制。在配置DataSource的时候需要指定Dialect。

方言指定

在配置datasource时,通过dialect属性指定使用的方言:

<datasource name="hr" type="JDBC">
<minEvictableIdleTimeMillis>30000</minEvictableIdleTimeMillis>
<timeBetweenEvictionRunsMillis>30000</timeBetweenEvictionRunsMillis>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://127.0.0.1:3306/hr</url>
<dialect>com.bstek.dorado.data.db.dialect.MySQLDialect</dialect>
<user>root</user>
<password>dorado</password>
<minIdle>0</minIdle>
<maxIdle>0</maxIdle>
<maxActive>0</maxActive>
<loginTimeout>0</loginTimeout>
<maxWait>0</maxWait>
</datasource>

dorado目前可以支持的方言有:

方言实现类

支持的数据库

com.bstek.dorado.data.db.dialect.OracleDialect

Oracle8,9

com.bstek.dorado.data.db.dialect.Oracle10gDialect

Oracle10

com.bstek.dorado.data.db.dialect.MSSQLDialect

Microsoft SQL Server 2000/2005

com.bstek.dorado.data.db.dialect.MySQLDialect

Mysql

com.bstek.dorado.data.db.dialect.SybaseDialect

Sybase

com.bstek.dorado.data.db.dialect.DB2Dialect

DB2 7/8/9

com.bstek.dorado.data.db.dialect.PostgreDialect

Postgre

com.bstek.dorado.data.db.dialect.InterbaseDialect

Interbase

com.bstek.dorado.data.db.dialect.InformixDialect

Informix

com.bstek.dorado.data.db.dialect.AccessDialect

Access

com.bstek.dorado.data.db.dialect.HSQLDBDialect

HSQL

以上的方言由dorado默认提供。

自定义方言类

在dorado默认提供的方言之外,对于某些特殊的数据库如果目前还未有方言实现,则开发人员可以自定义方言类。自定义方言类必须继承dorado默认提供的方言DefaultDialect:

import com.bstek.dorado.data.db.dialect.DefaultDialect;

public class MyDialect extends DefaultDialect {

/**

  • 获取分页查询的sql语句

  • @param sql 待分页处理的查询sql
  • @param pageSize 每页的记录数
  • @param pageIndex 当前请求的分页索引号
    */
    public String getPagingSql(String sql, int pageSize, int pageIndex) {
    //该处需要利用参数sql,根据数据库的特性实现分页sql语句的拼装。
    //例如mysql: select * from employee limit 100;
    }

    /**
  • 设定方言是否支持数据库查询分页处理机制
    */
    public boolean supportsPagingSql() {
    return true;
    }
    }

扩展该类时,需要实现其中两个方法:
getPagingSql()方法根据给定的sql语句返回一个拥有分页处理功能的sql语句。

public String getPagingSql (String sql, int pageSize, int pageIndex)

以及supportsPagingsql方法的定义

public boolean supportsPagingSql()

实现范例(MySQLDialect)

MySQLDialect.java

import com.bstek.dorado.data.db.dialect.DefaultDialect;

public class MySQLDialect extends DefaultDialect {

/**

  • 获取分页查询的sql语句

  • @param sql 待分页处理的查询sql
  • @param pageSize 每页的记录数
  • @param pageIndex 当前请求的分页索引号
    */
    public String getPagingSql(String sql, int pageSize, int pageIndex) {
    //该处需要利用参数sql,根据数据库的特性实现分页sql语句的拼装。
    //例如mysql: select * from employee limit 100;
    int offset = (pageSize * (pageIndex - 1));
    boolean hasOffset = (pageIndex > 1);

    StringBuffer pageSql = new StringBuffer();
    pageSql.append(sql);
    pageSql.append(hasOffset ?
    " limit " + offset + ", " + (offset + pageSize) :
    " limit " + pageSize);
    return pageSql.toString();
    }

    /**
  • 设定方言是否支持数据库查询分页处理机制
    */
    public boolean supportsPagingSql() {
    return true;
    }
    }