package com.easyooo.framework.support.mybatis.impl; import java.text.MessageFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.easyooo.framework.support.mybatis.Dialect; import com.easyooo.framework.support.mybatis.Order; /** * MySQL方言 * * @author Killer */ public class MySQLDialect implements Dialect { final String PAGING_SQL_TPL = "{0} LIMIT ?,?"; final String COUNTING_SQL_TPL = "SELECT COUNT(1) FROM "; final Pattern COUNTING_PATTERN = Pattern.compile("select[\\s\\S]*?[\\s]from[\\s]", Pattern.CASE_INSENSITIVE); final String COUNTING_SUB_SQL_TPL = "SELECT COUNT(1) FROM ({0}) T"; static final Pattern COUNT_SUB_PATTERN = Pattern.compile("(\\s+group\\s+by)|(\\s+union\\s+)", Pattern.CASE_INSENSITIVE); @Override public String getPagingSQL(String sql) { return MessageFormat.format(PAGING_SQL_TPL, sql); } @Override public String getCountingSQL(String sql) { if(COUNT_SUB_PATTERN.matcher(sql).find()){ return MessageFormat.format(COUNTING_SUB_SQL_TPL, sql); }else{ StringBuffer buffer = new StringBuffer(); Matcher matcher = COUNTING_PATTERN.matcher(sql); if(matcher.find()){ matcher.appendReplacement(buffer, COUNTING_SQL_TPL); } matcher.appendTail( buffer); return buffer.toString(); } } @Override public Order[] order() { return new Order[]{Order.OFFSET, Order.LIMIT}; } }