Caratacus 8 роки тому
батько
коміт
585ac88b11

+ 11 - 5
mybatis-plus/src/main/java/com/baomidou/mybatisplus/activerecord/Model.java

@@ -57,12 +57,18 @@ public abstract class Model<T extends Model> implements Serializable {
 	 * </p>
 	 */
 	public boolean insertOrUpdate() {
-		if (StringUtils.checkValNotNull(pkVal())) {
-			// update
-			return SqlHelper.retBool(sqlSession().update(sqlStatement(SqlMethod.UPDATE_BY_ID), this));
-		} else {
+		if (StringUtils.checkValNull(pkVal())) {
 			// insert
-			return SqlHelper.retBool(sqlSession().insert(sqlStatement(SqlMethod.INSERT_ONE), this));
+			return insert();
+		} else {
+			/*
+			 * 更新成功直接返回,失败执行插入逻辑
+			 */
+			boolean rlt = updateById();
+			if (!rlt) {
+				return insert();
+			}
+			return rlt;
 		}
 	}
 

+ 5 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/entity/GlobalConfiguration.java

@@ -88,10 +88,13 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	private String identifierQuote;
 	// 缓存当前Configuration的SqlSessionFactory
 	private SqlSessionFactory sqlSessionFactory;
-
+	// 缓存已注入CRUD的Mapper信息
 	private Set<String> mapperRegistryCache = new ConcurrentSkipListSet<String>();
+	// 单例重用SqlSession
 	private SqlSession sqlSession;
+	// 批量SqlSession
 	private SqlSession sqlsessionBatch;
+
 	public GlobalConfiguration() {
 		// 构造方法
 	}
@@ -365,6 +368,7 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	public static SqlSession getSqlsessionBatch(Configuration configuration) {
 		return GlobalConfig(configuration).getSqlsessionBatch();
 	}
+
 	/**
 	 * 设置元数据相关属性
 	 *

+ 4 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/enums/SqlLike.java

@@ -32,6 +32,10 @@ public enum SqlLike {
 	 * RIGHT
 	 */
 	RIGHT("right", "右边%"),
+	/**
+	 * CUSTOM
+	 */
+	CUSTOM("custom", "定制"),
 	/**
 	 * DEFAULT
 	 */

+ 35 - 24
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/AutoSqlInjector.java

@@ -15,14 +15,15 @@
  */
 package com.baomidou.mybatisplus.mapper;
 
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
+import com.baomidou.mybatisplus.entity.GlobalConfiguration;
+import com.baomidou.mybatisplus.entity.TableFieldInfo;
+import com.baomidou.mybatisplus.entity.TableInfo;
+import com.baomidou.mybatisplus.enums.FieldStrategy;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.enums.SqlMethod;
+import com.baomidou.mybatisplus.toolkit.SqlReservedWords;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
+import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
@@ -39,15 +40,13 @@ import org.apache.ibatis.scripting.LanguageDriver;
 import org.apache.ibatis.scripting.defaults.RawSqlSource;
 import org.apache.ibatis.session.Configuration;
 
-import com.baomidou.mybatisplus.entity.GlobalConfiguration;
-import com.baomidou.mybatisplus.entity.TableFieldInfo;
-import com.baomidou.mybatisplus.entity.TableInfo;
-import com.baomidou.mybatisplus.enums.FieldStrategy;
-import com.baomidou.mybatisplus.enums.IdType;
-import com.baomidou.mybatisplus.enums.SqlMethod;
-import com.baomidou.mybatisplus.toolkit.SqlReservedWords;
-import com.baomidou.mybatisplus.toolkit.StringUtils;
-import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * <p>
@@ -169,6 +168,12 @@ public class AutoSqlInjector implements ISqlInjector {
 		// to do nothing
 	}
 
+	/**
+	 * 避免扫描到BaseMapper
+	 * 
+	 * @param mapperClass
+	 * @return
+	 */
 	protected Class<?> extractModelClass(Class<?> mapperClass) {
 		if (mapperClass == BaseMapper.class) {
 			logger.warn(" Current Class is BaseMapper ");
@@ -834,10 +839,13 @@ public class AutoSqlInjector implements ISqlInjector {
 	 */
 	@SuppressWarnings("serial")
 	private void createSelectMappedStatement(String mappedStatement, SqlSource sqlSource, final Class<?> resultType) {
-		MappedStatement ms = new MappedStatement.Builder(configuration, mappedStatement, sqlSource, SqlCommandType.SELECT).resultMaps(
-				new ArrayList<ResultMap>() {{
-					add(new ResultMap.Builder(configuration, "defaultResultMap", resultType, new ArrayList<ResultMapping>(0)).build());
-				}}).build();
+		MappedStatement ms = new MappedStatement.Builder(configuration, mappedStatement, sqlSource, SqlCommandType.SELECT)
+				.resultMaps(new ArrayList<ResultMap>() {
+					{
+						add(new ResultMap.Builder(configuration, "defaultResultMap", resultType, new ArrayList<ResultMapping>(0))
+								.build());
+					}
+				}).build();
 		// 缓存
 		configuration.addMappedStatement(ms);
 	}
@@ -854,9 +862,12 @@ public class AutoSqlInjector implements ISqlInjector {
 	@SuppressWarnings("serial")
 	private void createUpdateMappedStatement(String mappedStatement, SqlSource sqlSource, SqlCommandType sqlCommandType) {
 		MappedStatement ms = new MappedStatement.Builder(configuration, mappedStatement, sqlSource, sqlCommandType).resultMaps(
-				new ArrayList<ResultMap>() {{
-					add(new ResultMap.Builder(configuration, "defaultResultMap", int.class, new ArrayList<ResultMapping>(0)).build());
-				}}).build();
+				new ArrayList<ResultMap>() {
+					{
+						add(new ResultMap.Builder(configuration, "defaultResultMap", int.class, new ArrayList<ResultMapping>(0))
+								.build());
+					}
+				}).build();
 		// 缓存
 		configuration.addMappedStatement(ms);
 	}

+ 9 - 5
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/SqlRunner.java

@@ -16,7 +16,6 @@
 package com.baomidou.mybatisplus.mapper;
 
 import com.baomidou.mybatisplus.entity.GlobalConfiguration;
-import com.baomidou.mybatisplus.entity.TableInfo;
 import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
 import org.apache.ibatis.session.SqlSession;
@@ -38,6 +37,7 @@ public class SqlRunner {
 
 	// 默认FACTORY
 	public static SqlSessionFactory FACTORY;
+
 	public static final String INSERT = "com.baomidou.mybatisplus.mapper.SqlRunner.Insert";
 	public static final String DELETE = "com.baomidou.mybatisplus.mapper.SqlRunner.Delete";
 	public static final String UPDATE = "com.baomidou.mybatisplus.mapper.SqlRunner.Update";
@@ -48,16 +48,17 @@ public class SqlRunner {
 
 	// 单例Query
 	public static final SqlRunner DEFAULT = new SqlRunner();
+
 	private SqlSessionFactory sqlSessionFactory;
 
+	private Class<?> clazz;
+
 	public SqlRunner() {
 		this.sqlSessionFactory = FACTORY;
 	}
 
 	public SqlRunner(Class<?> clazz) {
-		TableInfo tableInfo = SqlHelper.table(clazz);
-		GlobalConfiguration globalConfiguration = GlobalConfiguration.GlobalConfig(tableInfo.getConfigMark());
-		this.sqlSessionFactory = globalConfiguration.getSqlSessionFactory();
+		this.clazz = clazz;
 	}
 
 	public boolean insert(String sql, Object... args) {
@@ -135,7 +136,10 @@ public class SqlRunner {
 	 * <p/>
 	 */
 	private SqlSession sqlSession() {
-		return sqlSessionFactory.openSession(true);
+		if (clazz != null) {
+			return SqlHelper.sqlSession(clazz);
+		}
+		return GlobalConfiguration.getSqlSession(FACTORY.getConfiguration());
 	}
 
 }

+ 20 - 14
mybatis-plus/src/main/java/com/baomidou/mybatisplus/spring/MybatisMapperRefresh.java

@@ -38,7 +38,12 @@ import org.springframework.util.ResourceUtils;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Field;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * <p>
@@ -83,7 +88,7 @@ public class MybatisMapperRefresh implements Runnable {
 	private static Map<String, List<Resource>> jarMapper = new HashMap<String, List<Resource>>();
 
 	public MybatisMapperRefresh(Resource[] mapperLocations, SqlSessionFactory sqlSessionFactory, int delaySeconds,
-								int sleepSeconds, boolean enabled) {
+			int sleepSeconds, boolean enabled) {
 		this.mapperLocations = mapperLocations;
 		this.sqlSessionFactory = sqlSessionFactory;
 		this.delaySeconds = delaySeconds;
@@ -102,7 +107,7 @@ public class MybatisMapperRefresh implements Runnable {
 	}
 
 	public void run() {
-		final GlobalConfiguration mybatisGlobalCache = GlobalConfiguration.GlobalConfig(configuration);
+		final GlobalConfiguration globalConfig = GlobalConfiguration.GlobalConfig(configuration);
 		/*
 		 * 启动 XML 热加载
 		 */
@@ -145,7 +150,7 @@ public class MybatisMapperRefresh implements Runnable {
 							for (String filePath : fileSet) {
 								File file = new File(filePath);
 								if (file != null && file.isFile() && file.lastModified() > beforeTime) {
-									mybatisGlobalCache.setRefresh(true);
+									globalConfig.setRefresh(true);
 									List<Resource> removeList = jarMapper.get(filePath);
 									if (removeList != null && !removeList.isEmpty()) {// 如果是jar包中的xml,将刷新jar包中存在的所有xml,后期再修改加载jar中修改过后的xml
 										for (Resource resource : removeList) {
@@ -156,10 +161,10 @@ public class MybatisMapperRefresh implements Runnable {
 									}
 								}
 							}
-							if (mybatisGlobalCache.isRefresh()) {
+							if (globalConfig.isRefresh()) {
 								beforeTime = SystemClock.now();
 							}
-							mybatisGlobalCache.setRefresh(true);
+							globalConfig.setRefresh(true);
 						} catch (Exception exception) {
 							exception.printStackTrace();
 						}
@@ -239,20 +244,21 @@ public class MybatisMapperRefresh implements Runnable {
 			String id = resultMapNode.getStringAttribute("id", resultMapNode.getValueBasedIdentifier());
 			configuration.getResultMapNames().remove(id);
 			configuration.getResultMapNames().remove(namespace + "." + id);
-			clearResultMap(resultMapNode,namespace);
+			clearResultMap(resultMapNode, namespace);
 		}
 	}
 
-	private void clearResultMap(XNode xNode,String namespace){
+	private void clearResultMap(XNode xNode, String namespace) {
 		for (XNode resultChild : xNode.getChildren()) {
-			if ("association".equals(resultChild.getName())
-					|| "collection".equals(resultChild.getName())
+			if ("association".equals(resultChild.getName()) || "collection".equals(resultChild.getName())
 					|| "case".equals(resultChild.getName())) {
 				if (resultChild.getStringAttribute("select") == null) {
-					configuration.getResultMapNames().remove(resultChild.getStringAttribute("id",resultChild.getValueBasedIdentifier()));
-					configuration.getResultMapNames().remove(namespace+"."+resultChild.getStringAttribute("id",resultChild.getValueBasedIdentifier()));
-					if(resultChild.getChildren()!=null&&!resultChild.getChildren().isEmpty()){
-						clearResultMap(resultChild,namespace);
+					configuration.getResultMapNames().remove(
+							resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
+					configuration.getResultMapNames().remove(
+							namespace + "." + resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
+					if (resultChild.getChildren() != null && !resultChild.getChildren().isEmpty()) {
+						clearResultMap(resultChild, namespace);
 					}
 				}
 			}

+ 5 - 2
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/StringUtils.java

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.toolkit;
 
+import com.baomidou.mybatisplus.enums.SqlLike;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -23,8 +25,6 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import com.baomidou.mybatisplus.enums.SqlLike;
-
 /**
  * <p>
  * String 工具类
@@ -266,6 +266,9 @@ public class StringUtils {
 		case RIGHT:
 			builder.append(str).append("%");
 			break;
+		case CUSTOM:
+			builder.append(str);
+			break;
 		default:
 			builder.append("%").append(str).append("%");
 		}