Pārlūkot izejas kodu

处理多数据源分页插件支持多重数据库

Caratacus 8 gadi atpakaļ
vecāks
revīzija
ee838202a8

+ 13 - 16
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/DialectFactory.java

@@ -38,9 +38,6 @@ import com.baomidou.mybatisplus.toolkit.StringUtils;
  */
 public class DialectFactory {
 
-	// 数据库方言
-	private static IDialect dialect = null;
-
 	/**
 	 * <p>
 	 * 生成翻页执行 SQL
@@ -59,10 +56,8 @@ public class DialectFactory {
 	 */
 	public static String buildPaginationSql(Pagination page, String buildSql, String dialectType, String dialectClazz)
 			throws Exception {
-		if (null == dialect) {
-			dialect = getiDialect(dialectType, dialectClazz);
-		}
-		return dialect.buildPaginationSql(buildSql, page.getOffset(), page.getLimit());
+		// fix #172
+		return getiDialect(dialectType, dialectClazz).buildPaginationSql(buildSql, page.getOffset(), page.getLimit());
 	}
 
 	/**
@@ -78,6 +73,7 @@ public class DialectFactory {
 	 * @throws Exception
 	 */
 	private static IDialect getiDialect(String dialectType, String dialectClazz) throws Exception {
+		IDialect dialect = null;
 		if (StringUtils.isNotEmpty(dialectType)) {
 			dialect = getDialectByDbtype(dialectType);
 		} else {
@@ -110,24 +106,25 @@ public class DialectFactory {
 	 * @throws Exception
 	 */
 	private static IDialect getDialectByDbtype(String dbtype) throws Exception {
+		IDialect dialect = null;
 		if (DBType.MYSQL.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new MySqlDialect();
+			dialect = MySqlDialect.INSTANCE;
 		} else if (DBType.ORACLE.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new OracleDialect();
+			dialect = OracleDialect.INSTANCE;
 		} else if (DBType.DB2.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new DB2Dialect();
+			dialect = DB2Dialect.INSTANCE;
 		} else if (DBType.H2.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new H2Dialect();
+			dialect = H2Dialect.INSTANCE;
 		} else if (DBType.SQLSERVER.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new SQLServerDialect();
+			dialect = SQLServerDialect.INSTANCE;
 		} else if (DBType.SQLSERVER2005.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new SQLServer2005Dialect();
+			dialect = SQLServer2005Dialect.INSTANCE;
 		} else if (DBType.POSTGRE.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new PostgreDialect();
+			dialect = PostgreDialect.INSTANCE;
 		} else if (DBType.HSQL.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new HSQLDialect();
+			dialect = HSQLDialect.INSTANCE;
 		} else if (DBType.SQLITE.getDb().equalsIgnoreCase(dbtype)) {
-			dialect = new SQLiteDialect();
+			dialect = SQLiteDialect.INSTANCE;
 		} else {
 			throw new MybatisPlusException("The database is not supported!dbtype:" + dbtype);
 		}

+ 1 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/IDialect.java

@@ -36,5 +36,5 @@ public interface IDialect {
 	 *            界限
 	 * @return 分页语句
 	 */
-	String buildPaginationSql(String originalSql, int offset, int limit);
+	public String buildPaginationSql(String originalSql, int offset, int limit);
 }

+ 2 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/DB2Dialect.java

@@ -30,6 +30,8 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class DB2Dialect implements IDialect {
 
+	public static final DB2Dialect INSTANCE = new DB2Dialect();
+
 	private static String getRowNumber(String originalSql) {
 		StringBuilder rownumber = new StringBuilder(50).append("rownumber() over(");
 		int orderByIndex = originalSql.toLowerCase().indexOf("order by");
@@ -65,5 +67,4 @@ public class DB2Dialect implements IDialect {
 		}
 		return null;
 	}
-
 }

+ 3 - 2
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/H2Dialect.java

@@ -27,6 +27,8 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class H2Dialect implements IDialect {
 
+	public static final H2Dialect INSTANCE = new H2Dialect();
+
 	public String buildPaginationSql(String originalSql, int offset, int limit) {
 		StringBuffer sql = new StringBuffer(originalSql);
 		sql.append(" limit ").append(limit);
@@ -35,5 +37,4 @@ public class H2Dialect implements IDialect {
 		}
 		return sql.toString();
 	}
-
-}
+	}

+ 2 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/HSQLDialect.java

@@ -27,10 +27,11 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class HSQLDialect implements IDialect {
 
+	public static final HSQLDialect INSTANCE = new HSQLDialect();
+
 	public String buildPaginationSql(String originalSql, int offset, int limit) {
 		StringBuilder sql = new StringBuilder(originalSql);
 		sql.append(" limit ").append(offset).append(",").append(limit);
 		return sql.toString();
 	}
-
 }

+ 2 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/MySqlDialect.java

@@ -27,10 +27,11 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class MySqlDialect implements IDialect {
 
+	public static final MySqlDialect INSTANCE = new MySqlDialect();
+
 	public String buildPaginationSql(String originalSql, int offset, int limit) {
 		StringBuilder sql = new StringBuilder(originalSql);
 		sql.append(" LIMIT ").append(offset).append(",").append(limit);
 		return sql.toString();
 	}
-
 }

+ 2 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/OracleDialect.java

@@ -27,6 +27,8 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class OracleDialect implements IDialect {
 
+	public static final OracleDialect INSTANCE = new OracleDialect();
+
 	public String buildPaginationSql(String originalSql, int offset, int limit) {
 		StringBuilder sql = new StringBuilder();
 		sql.append("SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( ");
@@ -34,5 +36,4 @@ public class OracleDialect implements IDialect {
 		sql.append(") WHERE ROW_ID > ").append(offset);
 		return sql.toString();
 	}
-
 }

+ 2 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/PostgreDialect.java

@@ -27,10 +27,11 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class PostgreDialect implements IDialect {
 
+	public static final PostgreDialect INSTANCE = new PostgreDialect();
+
 	public String buildPaginationSql(String originalSql, int offset, int limit) {
 		StringBuffer sql = new StringBuffer(originalSql);
 		sql.append(" limit ").append(limit).append(" offset ").append(offset);
 		return sql.toString();
 	}
-
 }

+ 2 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/SQLServer2005Dialect.java

@@ -28,6 +28,8 @@ import com.baomidou.mybatisplus.toolkit.StringUtils;
  */
 public class SQLServer2005Dialect implements IDialect {
 
+	public static final SQLServer2005Dialect INSTANCE = new SQLServer2005Dialect();
+
 	private static String getOrderByPart(String sql) {
 		String loweredString = sql.toLowerCase();
 		int orderByIndex = loweredString.indexOf("order by");
@@ -67,5 +69,4 @@ public class SQLServer2005Dialect implements IDialect {
 				.append(offset + limit).append(" ORDER BY __row_number__");
 		return sql.toString();
 	}
-
 }

+ 3 - 2
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/SQLServerDialect.java

@@ -27,11 +27,12 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class SQLServerDialect implements IDialect {
 
-	public String buildPaginationSql( String originalSql, int offset, int limit ) {
+	public static final SQLServerDialect INSTANCE = new SQLServerDialect();
+
+	public String buildPaginationSql(String originalSql, int offset, int limit) {
 		StringBuffer sql = new StringBuffer(originalSql);
 		sql.append(" OFFSET ").append(offset).append(" ROWS FETCH NEXT ");
 		sql.append(limit).append(" ROWS ONLY");
 		return sql.toString();
 	}
-
 }

+ 2 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/dialects/SQLiteDialect.java

@@ -27,10 +27,11 @@ import com.baomidou.mybatisplus.plugins.pagination.IDialect;
  */
 public class SQLiteDialect implements IDialect {
 
+	public static final SQLiteDialect INSTANCE = new SQLiteDialect();
+
 	public String buildPaginationSql(String originalSql, int offset, int limit) {
 		StringBuffer sql = new StringBuffer(originalSql);
 		sql.append(" limit ").append(limit).append(" offset ").append(offset);
 		return sql.toString();
 	}
-
 }

+ 1 - 7
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/ServiceImplTest.java

@@ -17,11 +17,7 @@ package com.baomidou.mybatisplus.test.mysql;
 
 import com.baomidou.mybatisplus.test.mysql.entity.User;
 import com.baomidou.mybatisplus.test.mysql.service.IUserService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -35,13 +31,11 @@ import java.util.List;
  * @author hubin
  * @date 2017-01-30
  */
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration({ "classpath:spring/spring-servlet.xml" })
 public class ServiceImplTest {
 	@Autowired
 	private IUserService userService;
 
-	@Test
+	//@Test
 	public void testInsertBatch() throws IOException {
 		List<User> userList = new ArrayList<User>();
 		for (int i = 0; i < 10; i++) {