数据库方言Dialect

使用Hibernate,在配置hibernate.cfg.xml时需指定使用数据库的方言:
例:
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

以下是各数据库对应的方言(Dialect):

数据库            方言(Dialect)
DB2=org.hibernate.dialect.DB2Dialect

DB2 AS/400=org.hibernate.dialect.DB2400Dialect

DB2 OS390=org.hibernate.dialect.DB2390Dialect

PostgreSQL=org.hibernate.dialect.PostgreSQLDialect

MySQL5=org.hibernate.dialect.MySQL5Dialect

MySQL5 with InnoDB=org.hibernate.dialect.MySQL5InnoDBDialect

MySQL with MyISAM=org.hibernate.dialect.MySQLMyISAMDialect

Oracle(any version=org.hibernate.dialect.OracleDialect

oracle 9i=org.hibernate.dialect.Oracle9iDialect

Oracle 10g=org.hibernate.dialect.Oracle10gDialect

Oracle 11g=org.hibernate.dialect.Oracle10gDialect

Sybase=org.hibernate.dialect.SybaseASE15Dialect

Sybase Anywhere=org.hibernate.dialect.SybaseAnywhereDialect

Microsoft SQL Server 2000=org.hibernate.dialect.SQLServerDialect

Microsoft SQL Server 2005=org.hibernate.dialect.SQLServer2005Dialect

Microsoft SQL Server 2008=org.hibernate.dialect.SQLServer2008Dialect

SAP DB=org.hibernate.dialect.SAPDBDialect

Informix=org.hibernate.dialect.InformixDialect

HypersonicSQL=org.hibernate.dialect.HSQLDialect

H2 Database=org.hibernate.dialect.H2Dialect

Ingres=org.hibernate.dialect.IngresDialect

Progress=org.hibernate.dialect.ProgressDialect

Mckoi SQL=org.hibernate.dialect.MckoiDialect

Interbase=org.hibernate.dialect.InterbaseDialect

Pointbase=org.hibernate.dialect.PointbaseDialect

FrontBase=org.hibernate.dialect.FrontbaseDialect

Firebird=org.hibernate.dialect.FirebirdDialect
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用MyBatis实现分页,可以使用拦截器OffsetLimitInterceptor来实现。下面是实现分页的步骤: 1. 定义一个实现了Interceptor接口的分页拦截器类OffsetLimitInterceptor。 2. 在intercept()方法中,获取MappedStatement对象,检查该对象中是否有分页信息。 3. 如果存在分页信息,获取分页参数,根据数据库方言dialectClass来生成对应的分页SQL。 4. 将生成的SQL设置到BoundSql对象中,替换原有的SQL语句。 5. 调用invocation.proceed()方法执行SQL语句。 6. 在执行完SQL语句后,获取分页结果,将其封装到Page对象中,并返回该对象。 以下是指定数据库方言dialectClass的示例代码: ``` public class OffsetLimitInterceptor implements Interceptor { private String dialectClass; public Object intercept(Invocation invocation) throws Throwable { // 获取MappedStatement对象和分页参数 MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameter = invocation.getArgs()[1]; BoundSql boundSql = mappedStatement.getBoundSql(parameter); String sql = boundSql.getSql(); Object parameterObject = boundSql.getParameterObject(); Page page = getPage(parameterObject); // 如果存在分页信息,根据dialectClass生成对应的分页SQL if (page != null) { String pageSql = generatePageSql(sql, page); // 将生成的SQL设置到BoundSql对象中,替换原有的SQL语句 BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), pageSql, boundSql.getParameterMappings(), boundSql.getParameterObject()); MappedStatement newMappedStatement = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql)); invocation.getArgs()[0] = newMappedStatement; } // 执行原有的SQL语句 Object result = invocation.proceed(); // 封装分页结果 if (page != null) { page.setResult((List) result); return page; } else { return result; } } // 根据数据库方言dialectClass生成对应的分页SQL private String generatePageSql(String sql, Page page) { if (dialectClass.equals("mysql")) { return sql + " limit " + page.getStartRow() + "," + page.getPageSize(); } else if (dialectClass.equals("oracle")) { return "select * from (select rownum rn, t.* from (" + sql + ") t where rownum <= " + page.getEndRow() + ") where rn >= " + page.getStartRow(); } else { throw new RuntimeException("Unsupported dialectClass:" + dialectClass); } } private Page getPage(Object parameterObject) { if (parameterObject instanceof Page) { return (Page) parameterObject; } else { return null; } } private MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSource newSqlSource) { MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType()); builder.resource(ms.getResource()); builder.parameterMap(ms.getParameterMap()); builder.resultMaps(ms.getResultMaps()); builder.fetchSize(ms.getFetchSize()); builder.timeout(ms.getTimeout()); builder.statementType(ms.getStatementType()); builder.keyGenerator(ms.getKeyGenerator()); builder.keyProperty(StringUtils.join(ms.getKeyProperties(), ",")); builder.keyColumn(StringUtils.join(ms.getKeyColumns(), ",")); builder.databaseId(ms.getDatabaseId()); builder.lang(ms.getLang()); builder.resultOrdered(ms.isResultOrdered()); builder.resultSets(StringUtils.join(ms.getResultSets(), ",")); builder.cache(ms.getCache()); builder.flushCacheRequired(ms.isFlushCacheRequired()); builder.useCache(ms.isUseCache()); return builder.build(); } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties properties) { this.dialectClass = properties.getProperty("dialectClass"); } private static class BoundSqlSqlSource implements SqlSource { private BoundSql boundSql; public BoundSqlSqlSource(BoundSql boundSql) { this.boundSql = boundSql; } public BoundSql getBoundSql(Object parameterObject) { return boundSql; } } } ``` 在MyBatis的配置文件中,配置该拦截器并指定数据库方言dialectClass: ``` <plugins> <plugin interceptor="com.example.OffsetLimitInterceptor"> <property name="dialectClass" value="mysql"/> </plugin> </plugins> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值