SqlProviderQuery.java 7.7 KB
Newer Older
M
MaxKey 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
18 19 20 21 22 23 24 25 26 27 28
/**
 * 
 */
package org.apache.mybatis.jpa.persistence.provider;

import java.util.Map;
import org.apache.ibatis.jdbc.SQL;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.mybatis.jpa.PageResultsSqlCache;
import org.apache.mybatis.jpa.persistence.FieldColumnMapper;
M
MaxKey 已提交
29
import org.apache.mybatis.jpa.persistence.JpaBaseEntity;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
30 31 32 33 34 35 36 37 38 39 40 41
import org.apache.mybatis.jpa.persistence.JpaBaseService;
import org.apache.mybatis.jpa.persistence.JpaPagination;
import org.apache.mybatis.jpa.persistence.MapperMetadata;
import org.apache.mybatis.jpa.persistence.MapperMetadata.SQL_TYPE;
import org.apache.mybatis.jpa.util.BeanUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Crystal.Sea
 *
 */
M
MaxKey 已提交
42
public class SqlProviderQuery <T extends JpaBaseEntity>{
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55
	
	private static final Logger _logger 	= 	LoggerFactory.getLogger(SqlProviderQuery.class);


	public String get(Map<String, Object>  parametersMap) {
		Class<?> entityClass=(Class<?>)parametersMap.get(MapperMetadata.ENTITY_CLASS);
		MapperMetadata.buildColumnList(entityClass);
		if (MapperMetadata.sqlsMap.containsKey(MapperMetadata.getTableName(entityClass) + SQL_TYPE.GET_SQL)) {
			return MapperMetadata.sqlsMap.get(MapperMetadata.getTableName(entityClass) + SQL_TYPE.GET_SQL);
		}
		
		FieldColumnMapper idFieldColumnMapper=MapperMetadata.getIdColumn(entityClass.getSimpleName());
		SQL sql=new SQL();
M
v2.4  
MaxKey 已提交
56
		sql.SELECT(selectColumnMapper(entityClass));  
M
MaxKey 已提交
57
        sql.FROM(MapperMetadata.getTableName(entityClass)+" sel_tmp_table ");  
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71
        sql.WHERE(idFieldColumnMapper.getColumnName()+" = #{"+idFieldColumnMapper.getFieldName()+"}");  
        String getSql=sql.toString(); 
        _logger.trace("Get SQL \n"+getSql);
        MapperMetadata.sqlsMap.put(MapperMetadata.getTableName(entityClass) + SQL_TYPE.GET_SQL,getSql);
        return getSql;  
    }
	
	public String findAll(Map<String, Object>  parametersMap) {  
		Class<?> entityClass=(Class<?>)parametersMap.get(MapperMetadata.ENTITY_CLASS);
		MapperMetadata.buildColumnList(entityClass);
		if (MapperMetadata.sqlsMap.containsKey(MapperMetadata.getTableName(entityClass) + SQL_TYPE.FINDALL_SQL)) {
			return MapperMetadata.sqlsMap.get(MapperMetadata.getTableName(entityClass) + SQL_TYPE.FINDALL_SQL);
		}
		SQL sql=new SQL();
M
v2.4  
MaxKey 已提交
72
		sql.SELECT(selectColumnMapper(entityClass));  
M
MaxKey 已提交
73
        sql.FROM(MapperMetadata.getTableName(entityClass)+" sel_tmp_table ");  
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
74 75 76 77 78
        String findAllSql=sql.toString(); 
        _logger.trace("Find All SQL \n"+findAllSql);
        MapperMetadata.sqlsMap.put(MapperMetadata.getTableName(entityClass) + SQL_TYPE.FINDALL_SQL,findAllSql);
        return findAllSql;  
    }
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
79 80 81 82

	public String execute(T entity) {
		MapperMetadata.buildColumnList(entity.getClass());
		SQL sql=new SQL();
M
v2.4  
MaxKey 已提交
83
		sql.SELECT(selectColumnMapper(entity.getClass()));  
M
MaxKey 已提交
84
        sql.FROM(MapperMetadata.getTableName(entity.getClass())+" sel_tmp_table ");  
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
85 86
        
        for(FieldColumnMapper fieldColumnMapper  : MapperMetadata.fieldsMap.get(entity.getClass().getSimpleName())) {
M
fix  
MaxKey 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
        	 String fieldValue = BeanUtil.getValue(entity, fieldColumnMapper.getFieldName());
        	 String fieldType=fieldColumnMapper.getFieldType().toLowerCase();
        	 
        	 _logger.trace("ColumnName "+fieldColumnMapper.getColumnName()
        	 				+" , FieldType "+fieldType
        	 				+" , value " + fieldValue);
        	
        	if(fieldValue==null
        		||(fieldType.equals("string")&&fieldValue.equals(""))
        		||(fieldType.startsWith("byte")&&fieldValue==null)
        		||(fieldType.equals("int")&&fieldValue.equals("0"))
        		||(fieldType.equals("long")&&fieldValue.equals("0"))
        		||(fieldType.equals("integer")&&fieldValue.equals("0"))
        		||(fieldType.equals("float")&&fieldValue.equals("0.0"))
        		||(fieldType.equals("double")&&fieldValue.equals("0.0"))
        		) {
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
103 104 105 106 107 108 109 110
				//skip null field value
			}else {
				sql.WHERE(fieldColumnMapper.getColumnName() + "=#{" + fieldColumnMapper.getFieldName() + "}");
			}
		}
		
		return sql.toString();
	}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
111
	
M
v2.4  
MaxKey 已提交
112
	public String selectColumnMapper(Class<?> entityClass) {
M
MaxKey 已提交
113
		StringBuffer selectColumn =new StringBuffer("sel_tmp_table.* ");
M
v2.4  
MaxKey 已提交
114 115 116
		int columnCount = 0;
		for(FieldColumnMapper fieldColumnMapper  : MapperMetadata.fieldsMap.get(entityClass.getSimpleName())) {
			columnCount ++;
M
MaxKey 已提交
117 118 119 120 121 122 123 124
			//不同的属性和数据库字段不一致的需要进行映射
			if(!fieldColumnMapper.getColumnName().equalsIgnoreCase(fieldColumnMapper.getFieldName())) {
				selectColumn.append(",")
							.append(fieldColumnMapper.getColumnName())
							.append(" ")
							.append(fieldColumnMapper.getFieldName());
			}
			_logger.debug("Column "+ columnCount + " , ColumnName : "+fieldColumnMapper.getColumnName()+" , FieldName : " + fieldColumnMapper.getFieldName());
M
v2.4  
MaxKey 已提交
125 126 127 128
		}
		return selectColumn.toString();
	}
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
129 130 131 132
	/**
	 * @param entity
	 * @return insert sql String
	 */
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
133
	public String executePageResultsCount(T entity) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
134 135 136
		JpaPagination pagination=(JpaPagination)entity;
		//获取缓存数据
		PageResultsSqlCache pageResultsSqlCache=JpaBaseService.pageResultsBoundSqlCache.get(pagination.getPageResultSelectUUID());
M
MaxKey 已提交
137
		//多个空格 tab 替换成1个空格
M
fix  
MaxKey 已提交
138
		String selectSql=pageResultsSqlCache.getSql().replaceAll("\r\n+", " \n").replaceAll("\n+", " \n").replaceAll("\t", " ").replaceAll(" +"," ");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
139
		BoundSql boundSql=(BoundSql)pageResultsSqlCache.getBoundSql();
M
MaxKey 已提交
140
		_logger.trace("Count original SQL  :\n" + selectSql);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
141
		
M
MaxKey 已提交
142
		StringBuffer sql=new StringBuffer(SqlSyntax.SELECT +" "+ SqlSyntax.Functions.COUNT_ONE +" countrows_ ");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
143 144 145 146 147 148 149 150 151 152 153 154
		StringBuffer countSql=new StringBuffer();
		
		if(boundSql.getParameterMappings()==null ||boundSql.getParameterMappings().isEmpty()) {
			countSql.append(selectSql);
		}else {
			for (ParameterMapping parameterMapping:boundSql.getParameterMappings()) {
				countSql.append(selectSql.substring(0, selectSql.indexOf("?")));
				countSql.append("#{"+parameterMapping.getProperty()+"}");
				selectSql=selectSql.substring(selectSql.indexOf("?")+1);
			}
			countSql.append(selectSql);
		}
M
MaxKey 已提交
155 156
		String countSqlLowerCase = countSql.toString().toLowerCase();
		_logger.trace("Count SQL LowerCase  :\n" + countSqlLowerCase);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
157
		
M
MaxKey 已提交
158 159 160 161 162 163 164 165 166
		if(countSqlLowerCase.indexOf(SqlSyntax.DISTINCT + " ")>0 //去重
				||countSqlLowerCase.indexOf(" " + SqlSyntax.GROUPBY + " ")>0 //分组
				||countSqlLowerCase.indexOf(" " + SqlSyntax.HAVING + " ")>0 //聚合函数
				||(countSqlLowerCase.indexOf(" " + SqlSyntax.FROM + " ") 
						!= countSqlLowerCase.lastIndexOf(" " + SqlSyntax.FROM + " ")
				) //嵌套
				) {
			_logger.trace("Count SQL Complex ");
			sql.append(SqlSyntax.FROM).append(" (").append(countSql).append(" ) count_table_");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
167
		}else {
M
MaxKey 已提交
168 169 170 171 172 173 174 175
			int fromIndex = countSqlLowerCase.indexOf(" " + SqlSyntax.FROM + " ");
			int orderByIndex = countSqlLowerCase.indexOf(" " + SqlSyntax.ORDERBY + " ");
			_logger.trace("Count SQL from Index "+ fromIndex +" , order by " +orderByIndex);
			if(orderByIndex > -1) {
				sql.append(countSql.substring(fromIndex,orderByIndex));
			}else {
				sql.append(countSql.substring(fromIndex));
			}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
176 177 178 179 180 181 182 183
		}
		//删除缓存
		JpaBaseService.pageResultsBoundSqlCache.remove(pagination.getPageResultSelectUUID());
		_logger.trace("Count SQL : \n" + sql);
		return sql.toString();
	}
	
}