背景
通常情况下,我们使用工具生成对象和表映射关系,这在mapper对应的xml中以resultMap体现。
获取ResultMap
mybatis将配置全部放在Configuration对象里,故而可以使用Configuration对象获取。
/**
* 功能描述:表列缓存
*
* @author konglcwqy
* @date 2022/4/26 9:51
* @param null
* @return
*/
private Map<String, ResultMap> FIELD_COLUMN_CACHE = new HashMap<String, ResultMap>();
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
@PostConstruct
public void init() {
Collection<ResultMap> resultMaps = this.sqlSessionTemplate.getConfiguration().getResultMaps();
Iterator<ResultMap> iterator = resultMaps.iterator();
ResultMap value = null;
while (iterator.hasNext()) {
try {
value = iterator.next();
FIELD_COLUMN_CACHE.put(value.getType().getName(), value);
} catch (Exception e) {
}
}
}
一个实例
本实例是根据ResultMap生成增删改的sql。
定义一些属性
private static final FastDateFormat FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String CW_INFO_KEY = "CW_INFO";
定义映射信息
package com.zasd.project.system.cw;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
/**
*
*
* @author konglcwqy
* @description
* @date 2022/4/26 11:34
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class CwInfo implements Serializable {
/**
* 功能描述:操作:1 新增 2 修改 3 删除
*
* @author konglcwqy
* @date 2022/4/26 11:35
* @param null
* @return
*/
private Integer operator;
/**
* 功能描述:类名
*
* @author konglcwqy
* @date 2022/4/26 11:36
* @param null
* @return
*/
private String className;
/**
* 功能描述:className对应的对象数据
*
* @author konglcwqy
* @date 2022/4/26 11:36
* @param null
* @return
*/
private String data;
/**
* 功能描述:表名
*
* @author konglcwqy
* @date 2022/4/26 14:56
* @param null
* @return
*/
private String tableName;
/**
* 功能描述:主键
*
* @author konglcwqy
* @date 2022/4/26 15:19
* @param null
* @return
*/
private String primaryKey;
}
获取属性值
/**
* 功能描述:获取属性值
*
* @param field
* @param obj
* @return java.lang.Object
* @author konglcwqy
* @date 2022/4/26 11:33
*/
public Object concat(Field field, Object obj) throws Exception {
if (field == null) {
return null;
}
field.setAccessible(true);
Class<?> type = field.getType();
Object value = field.get(obj);
if (ObjectUtil.isEmpty(value)) {
return null;
}
if (type == String.class) {
return "'" + value + "'";
}
if (type == Date.class) {
return "'" + FORMAT.format(value) + "'";
}
return value;
}
获取不为空的列和值
/**
* 功能描述:获取不为空的列和值
*
* @param info
* @return java.lang.String
* @author konglcwqy
* @date 2022/4/26 11:37
*/
public Map<String, Object> columnAndValue(String info) throws Exception {
if (StringUtils.isEmpty(info)) {
return null;
}
CwInfo cwInfo = MAPPER.readValue(info, CwInfo.class);
String className = cwInfo.getClassName();
String data = cwInfo.getData();
Integer operator = cwInfo.getOperator();
//校验数据正确性
if (StringUtils.isEmpty(data) || StringUtils.isEmpty(className) || operator == null) {
return null;
}
//获取列
ResultMap resultMap = FIELD_COLUMN_CACHE.get(className);
if (resultMap == null) {
return null;
}
//解析列
List<ResultMapping> resultMappings = resultMap.getResultMappings();
if (resultMappings == null || resultMappings.size() == 0) {
return null;
}
Class<?> clazz = Class.forName(className);
Object cwBean = MAPPER.readValue(data, clazz);
String propertyName = null;
Field field = null;
Object value = null;
Map<String, Object> result = new HashMap<String, Object>();
for (ResultMapping resultMapping : resultMappings) {
propertyName = resultMapping.getProperty();
field = clazz.getDeclaredField(propertyName);
if (field == null) {
continue;
}
value = this.concat(field, cwBean);
if (ObjectUtil.isNotEmpty(value)) {
result.put(resultMapping.getColumn().trim().toLowerCase(), value);
}
}
if (!result.isEmpty()) {
result.put(CW_INFO_KEY, cwInfo);
}
return result.isEmpty() ? null : result;
}
新增sql
/**
* 功能描述:获取新增sql
*
* @param info
* @return java.lang.String
* @author konglcwqy
* @date 2022/4/26 15:03
*/
public String getInsertSql(String info) throws Exception {
Map<String, Object> columnAndValue = this.columnAndValue(info);
if (columnAndValue == null || columnAndValue.size() == 0) {
return null;
}
CwInfo cwInfo = (CwInfo) columnAndValue.get(CW_INFO_KEY);
columnAndValue.remove(CW_INFO_KEY);
StringJoiner columns = new StringJoiner(",");
StringJoiner values = new StringJoiner(",");
for (Map.Entry<String, Object> entrySet : columnAndValue.entrySet()) {
columns.add(entrySet.getKey());
values.add(entrySet.getValue().toString());
}
String tableName = cwInfo.getTableName();
String sql = "insert into " + tableName + " (" + columns.toString() + ") values " + "(" + values.toString() + ")";
return sql;
}
按照主键修改sql
/**
* 功能描述:获取按照主键修改sql
*
* @param info
* @return java.lang.String
* @author konglcwqy
* @date 2022/4/26 15:14
*/
public String getUpdateByPrimaryKeySql(String info) throws Exception {
Map<String, Object> columnAndValue = this.columnAndValue(info);
if (columnAndValue == null || columnAndValue.size() == 0) {
return null;
}
CwInfo cwInfo = (CwInfo) columnAndValue.get(CW_INFO_KEY);
columnAndValue.remove(CW_INFO_KEY);
//主键信息
String primaryKey = cwInfo.getPrimaryKey();
if (StringUtils.isEmpty(primaryKey)) {
return null;
}
primaryKey = primaryKey.toLowerCase();
Object primaryKeyValue = columnAndValue.get(primaryKey);
if (ObjectUtil.isEmpty(primaryKeyValue)) {
return null;
}
columnAndValue.remove(primaryKeyValue);
StringJoiner sj = new StringJoiner(",");
for (Map.Entry<String, Object> entrySet : columnAndValue.entrySet()) {
sj.add(entrySet.getKey() + " = " + entrySet.getValue());
}
String tableName = cwInfo.getTableName();
String sql = "update " + tableName + " set " + sj.toString() + " where " + primaryKey + " = " + primaryKeyValue;
return sql;
}
按照条件删除sql
/**
* 功能描述:获取条件删除sql
*
* @param info
* @return java.lang.String
* @author konglcwqy
* @date 2022/4/26 15:14
*/
public String getDeleteSql(String info) throws Exception {
Map<String, Object> columnAndValue = this.columnAndValue(info);
if (columnAndValue == null || columnAndValue.size() == 0) {
return null;
}
CwInfo cwInfo = (CwInfo) columnAndValue.get(CW_INFO_KEY);
columnAndValue.remove(CW_INFO_KEY);
StringJoiner sj = new StringJoiner(" and ");
for (Map.Entry<String, Object> entrySet : columnAndValue.entrySet()) {
sj.add(entrySet.getKey() + " = " + entrySet.getValue());
}
String tableName = cwInfo.getTableName();
String sql = "delete from " + tableName + " where " + sj.toString();
return sql;
}