diff --git a/README.md b/README.md index ab11abbac3215f24ed4564cbbc11b8dacc849843..a26a0e7073bce40a78a99e04d5618c7aa518bd18 100644 --- a/README.md +++ b/README.md @@ -5,20 +5,22 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下: **######### mybatis增加功能自动创建表——A.C.Table版本说明################** -1. 该版本修复了修改主键同时修改其类型引起的error -2. 该版本修复了根据model创建时没有创建父类中的字段的问题(ps:目前只支持扫描一层继承) -3. 该笨笨增加了对唯一约束的支持 -4. 从原有的框架中剥离出来,支持任意结构的spring+mybatis的框架使用 -5. 再次声明A.C.Table目前仅支持mysql数据库 +1. 该版本修复了修改主键同时修改其类型引起的error(版本1.0.1) +2. 该版本修复了根据model创建时没有创建父类中的字段的问题(ps:目前只支持扫描一层继承)(版本1.0.1) +3. 该笨笨增加了对唯一约束的支持(版本1.0.1) +4. 从原有的框架中剥离出来,支持任意结构的spring+mybatis的框架使用(版本1.0.1) +5. 再次声明A.C.Table目前仅支持mysql数据库(版本1.0.1) +6. 修复了不同数据库中有相同表名时,启动报错的问题。(版本1.0.2) +7. 修复了model属性名与表字段名不一致时公共的查询方法查不出数据的问题。(版本1.0.2) **使用步骤方法** -1. 使用该功能的项目需要依赖mybatis-enhance-actable-1.0.1.jar +1. 使用该功能的项目需要依赖mybatis-enhance-actable-1.0.2.jar 已上传至maven中央仓库,使用时pom文件中增加如下依赖 com.gitee.sunchenbin.mybatis.actable mybatis-enhance-actable - 1.0.1 + 1.0.2 2. 在你的web项目上创建个目录比如config下面创建个文件autoCreateTable.properties文件的内容如下: diff --git a/mybatis-enhance-actable/pom.xml b/mybatis-enhance-actable/pom.xml index 8d44171da6bb4111843f6d7fd08b2ee2aab7c31d..906e96556fe34a205395c7a1f0ba349e271d0794 100644 --- a/mybatis-enhance-actable/pom.xml +++ b/mybatis-enhance-actable/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.gitee.sunchenbin.mybatis.actable mybatis-enhance-actable - 1.0.1 + 1.0.2 org.sonatype.oss diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/common/BaseMysqlCRUDMapper.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/common/BaseMysqlCRUDMapper.java index 48e24663a8fa89d4b9ea5fba3c56406613f76e6e..948a5a51e66b0432ad5ad1bf22df8d7edaafb4d3 100644 --- a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/common/BaseMysqlCRUDMapper.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/common/BaseMysqlCRUDMapper.java @@ -1,42 +1,42 @@ -package com.gitee.sunchenbin.mybatis.actable.dao.common; - -import java.util.List; -import java.util.Map; - -import org.apache.ibatis.annotations.Param; - - -/** - * 创建更新表结构的Mapper - * @author sunchenbin - * - */ -public interface BaseMysqlCRUDMapper { - - /** - * 保存 - * @param tableMap 表结构的map - */ - public void save(@Param("tableMap") Map> tableMap); - - /** - * 更新 - * @param tableMap 表结构的map - */ - public void update(@Param("tableMap") Map> tableMap); - - /** - * 删除 - * @param tableMap 表结构的map - */ - public void delete(@Param("tableMap") Map> tableMap); - - /** - * 查询 - * @param tableMap 表结构的map - */ - public List> query(@Param("tableMap") Map> tableMap); - - - -} +package com.gitee.sunchenbin.mybatis.actable.dao.common; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + + +/** + * 创建更新表结构的Mapper + * @author sunchenbin + * + */ +public interface BaseMysqlCRUDMapper { + + /** + * 保存 + * @param tableMap 表结构的map + */ + public void save(@Param("tableMap") Map> tableMap); + + /** + * 更新 + * @param tableMap 表结构的map + */ + public void update(@Param("tableMap") Map> tableMap); + + /** + * 删除 + * @param tableMap 表结构的map + */ + public void delete(@Param("tableMap") Map> tableMap); + + /** + * 查询 + * @param tableMap 表结构的map + */ + public List> query(@Param("tableMap") Map> tableMap); + + + +} diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManager.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManager.java index 8f5b857172ca3f14b8dfbc8fd987678e99a98033..b8026fd2e6d43d90d5a8e79b13118b66fa605c6f 100644 --- a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManager.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManager.java @@ -1,27 +1,27 @@ -package com.gitee.sunchenbin.mybatis.actable.manager.common; - -import java.util.List; - -public interface BaseMysqlCRUDManager{ - - /** - * 保存,如果主键有值则进行更新操作 - * @param model类型 - * @param t 要保存的model类型数据 - */ - void save(T t); - - /** - * 根据传入对象非空的条件删除 - * @param model类型 - * @param t 要删除的model类型数据 - */ - void delete(T t); - - /** - * 根据传入对象非空的条件进行查询 - * @param model类型 - * @param t 要查询的model类型数据 - */ - List query(T t); -} +package com.gitee.sunchenbin.mybatis.actable.manager.common; + +import java.util.List; + +public interface BaseMysqlCRUDManager{ + + /** + * 保存,如果主键有值则进行更新操作 + * @param model类型 + * @param t 要保存的model类型数据 + */ + void save(T t); + + /** + * 根据传入对象非空的条件删除 + * @param model类型 + * @param t 要删除的model类型数据 + */ + void delete(T t); + + /** + * 根据传入对象非空的条件进行查询 + * @param model类型 + * @param t 要查询的model类型数据 + */ + List query(T t); +} diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManagerImpl.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManagerImpl.java index 8807be5da15fdf9d2797ca8a933526527e0f2d45..502c68404bc973d27227cdc1880a79f4d3b1bdc9 100644 --- a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManagerImpl.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManagerImpl.java @@ -1,196 +1,196 @@ -package com.gitee.sunchenbin.mybatis.actable.manager.common; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang.ArrayUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.gitee.sunchenbin.mybatis.actable.annotation.Column; -import com.gitee.sunchenbin.mybatis.actable.annotation.Table; -import com.gitee.sunchenbin.mybatis.actable.dao.common.BaseMysqlCRUDMapper; - -@Transactional -@Service("baseMysqlCRUDManager") -public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ - - private static final Logger log = LoggerFactory.getLogger(BaseMysqlCRUDManagerImpl.class); - - private static final String KEYFIELDMAP = "keyFieldMap"; - - @Autowired - private BaseMysqlCRUDMapper baseMysqlCRUDMapper; - - public void save(T obj){ - boolean isSave = true; - Table tableName = obj.getClass().getAnnotation(Table.class); - if ((tableName == null) || (tableName.name() == null || tableName.name() == "")) { - log.error("必须使用model中的对象!"); - return; - } - Field[] declaredFields = getAllFields(obj); - Map> tableMap = new HashMap>(); - Map dataMap = new HashMap(); - Map keyFieldMap = new HashMap(); - for (Field field : declaredFields){ - try{ - // 私有属性需要设置访问权限 - field.setAccessible(true); - Column column = field.getAnnotation(Column.class); - if (column == null) { - log.info("该field没有配置注解不是表中在字段!"); - continue; - } - - // 如果是主键,并且不是空的时候,这时候应该是更新操作 - if (column.isKey() && field.get(obj) != null && Integer.parseInt((String) field.get(obj)) > 0) { - isSave = false; - keyFieldMap.put(field.getName(), field.get(obj)); - } - - // 如果是自增,并且是保存的场合,不需要添加到map中做保存 - if (isSave && column.isAutoIncrement()) { - log.info("字段:" + field.getName() + "是自增的不需要添加到map中"); - continue; - } - - dataMap.put(field.getName(), field.get(obj)); - }catch (IllegalArgumentException e){ - e.printStackTrace(); - }catch (IllegalAccessException e){ - e.printStackTrace(); - } - } - if (isSave) { - tableMap.put(tableName.name(), dataMap); - // 执行保存操作 - baseMysqlCRUDMapper.save(tableMap); - }else{ - dataMap.put(KEYFIELDMAP, keyFieldMap); - tableMap.put(tableName.name(), dataMap); - // 执行更新操作根据主键 - baseMysqlCRUDMapper.update(tableMap); - } - } - - private Field[] getAllFields(T obj) { - Field[] declaredFields = obj.getClass().getDeclaredFields(); - - // 递归扫描父类的filed - declaredFields = recursionParents(obj.getClass(), declaredFields); - return declaredFields; - } - - public void delete(T obj){ - - // 得到表名 - Table tableName = obj.getClass().getAnnotation(Table.class); - if ((tableName == null) || (tableName.name() == null || tableName.name() == "")) { - log.error("必须使用model中的对象!"); - return; - } - Field[] declaredFields = getAllFields(obj); - Map> tableMap = new HashMap>(); - Map dataMap = new HashMap(); - for (Field field : declaredFields){ - // 设置访问权限 - field.setAccessible(true); - // 得到字段的配置 - Column column = field.getAnnotation(Column.class); - if (column == null) { - log.info("该field没有配置注解不是表中在字段!"); - continue; - } - try{ - dataMap.put(column.name(), field.get(obj)); - }catch (IllegalArgumentException e){ - e.printStackTrace(); - }catch (IllegalAccessException e){ - e.printStackTrace(); - } - } - tableMap.put(tableName.name(), dataMap); - baseMysqlCRUDMapper.delete(tableMap); - } - - @SuppressWarnings("unchecked") - public List query(T obj){ - // 得到表名 - Table tableName = obj.getClass().getAnnotation(Table.class); - if ((tableName == null) || (tableName.name() == null || tableName.name() == "")) { - log.error("必须使用model中的对象!"); - return null; - } - Field[] declaredFields = getAllFields(obj); - Map> tableMap = new HashMap>(); - Map dataMap = new HashMap(); - for (Field field : declaredFields){ - // 设置访问权限 - field.setAccessible(true); - // 得到字段的配置 - Column column = field.getAnnotation(Column.class); - if (column == null) { - log.info("该field没有配置注解不是表中在字段!"); - continue; - } - try{ - dataMap.put(column.name(), field.get(obj)); - }catch (IllegalArgumentException e){ - e.printStackTrace(); - }catch (IllegalAccessException e){ - e.printStackTrace(); - } - } - tableMap.put(tableName.name(), dataMap); - List> query = baseMysqlCRUDMapper.query(tableMap); - - List list = new ArrayList(); - try{ - for (Map map : query){ - T newInstance = (T) obj.getClass().newInstance(); - Field[] declaredFields2 = newInstance.getClass().getDeclaredFields(); - for (Field field : declaredFields2){ - field.setAccessible(true); - // 得到字段的配置 - Column column = field.getAnnotation(Column.class); - if (column == null) { - log.info("该field没有配置注解不是表中在字段!"); - continue; - } - String name = field.getName(); - field.set(newInstance, map.get(name)); - } - list.add(newInstance); - } - }catch (InstantiationException e){ - e.printStackTrace(); - }catch (IllegalAccessException e){ - e.printStackTrace(); - } - - return list; - } - - /** - * 递归扫描父类的fields - * @param clas - * @param fields - */ - @SuppressWarnings("rawtypes") - private Field[] recursionParents(Class clas, Field[] fields) { - if(clas.getSuperclass()!=null){ - Class clsSup = clas.getSuperclass(); - fields = (Field[]) ArrayUtils.addAll(fields,clsSup.getDeclaredFields()); - fields = recursionParents(clsSup, fields); - } - return fields; - } - -} +package com.gitee.sunchenbin.mybatis.actable.manager.common; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.ArrayUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.gitee.sunchenbin.mybatis.actable.annotation.Column; +import com.gitee.sunchenbin.mybatis.actable.annotation.Table; +import com.gitee.sunchenbin.mybatis.actable.dao.common.BaseMysqlCRUDMapper; + +@Transactional +@Service("baseMysqlCRUDManager") +public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ + + private static final Logger log = LoggerFactory.getLogger(BaseMysqlCRUDManagerImpl.class); + + private static final String KEYFIELDMAP = "keyFieldMap"; + + @Autowired + private BaseMysqlCRUDMapper baseMysqlCRUDMapper; + + public void save(T obj){ + boolean isSave = true; + Table tableName = obj.getClass().getAnnotation(Table.class); + if ((tableName == null) || (tableName.name() == null || tableName.name() == "")) { + log.error("必须使用model中的对象!"); + return; + } + Field[] declaredFields = getAllFields(obj); + Map> tableMap = new HashMap>(); + Map dataMap = new HashMap(); + Map keyFieldMap = new HashMap(); + for (Field field : declaredFields){ + try{ + // 私有属性需要设置访问权限 + field.setAccessible(true); + Column column = field.getAnnotation(Column.class); + if (column == null) { + log.info("该field没有配置注解不是表中在字段!"); + continue; + } + + // 如果是主键,并且不是空的时候,这时候应该是更新操作 + if (column.isKey() && field.get(obj) != null && (new Integer(field.get(obj).toString())) > 0) { + isSave = false; + keyFieldMap.put(field.getName(), field.get(obj)); + } + + // 如果是自增,并且是保存的场合,不需要添加到map中做保存 + if (isSave && column.isAutoIncrement()) { + log.info("字段:" + field.getName() + "是自增的不需要添加到map中"); + continue; + } + + dataMap.put(column.name(), field.get(obj)); + }catch (IllegalArgumentException e){ + e.printStackTrace(); + }catch (IllegalAccessException e){ + e.printStackTrace(); + } + } + if (isSave) { + tableMap.put(tableName.name(), dataMap); + // 执行保存操作 + baseMysqlCRUDMapper.save(tableMap); + }else{ + dataMap.put(KEYFIELDMAP, keyFieldMap); + tableMap.put(tableName.name(), dataMap); + // 执行更新操作根据主键 + baseMysqlCRUDMapper.update(tableMap); + } + } + + private Field[] getAllFields(T obj) { + Field[] declaredFields = obj.getClass().getDeclaredFields(); + + // 递归扫描父类的filed + declaredFields = recursionParents(obj.getClass(), declaredFields); + return declaredFields; + } + + public void delete(T obj){ + + // 得到表名 + Table tableName = obj.getClass().getAnnotation(Table.class); + if ((tableName == null) || (tableName.name() == null || tableName.name() == "")) { + log.error("必须使用model中的对象!"); + return; + } + Field[] declaredFields = getAllFields(obj); + Map> tableMap = new HashMap>(); + Map dataMap = new HashMap(); + for (Field field : declaredFields){ + // 设置访问权限 + field.setAccessible(true); + // 得到字段的配置 + Column column = field.getAnnotation(Column.class); + if (column == null) { + log.info("该field没有配置注解不是表中在字段!"); + continue; + } + try{ + dataMap.put(column.name(), field.get(obj)); + }catch (IllegalArgumentException e){ + e.printStackTrace(); + }catch (IllegalAccessException e){ + e.printStackTrace(); + } + } + tableMap.put(tableName.name(), dataMap); + baseMysqlCRUDMapper.delete(tableMap); + } + + @SuppressWarnings("unchecked") + public List query(T obj){ + // 得到表名 + Table tableName = obj.getClass().getAnnotation(Table.class); + if ((tableName == null) || (tableName.name() == null || tableName.name() == "")) { + log.error("必须使用model中的对象!"); + return null; + } + Field[] declaredFields = getAllFields(obj); + Map> tableMap = new HashMap>(); + Map dataMap = new HashMap(); + for (Field field : declaredFields){ + // 设置访问权限 + field.setAccessible(true); + // 得到字段的配置 + Column column = field.getAnnotation(Column.class); + if (column == null) { + log.info("该field没有配置注解不是表中在字段!"); + continue; + } + try{ + dataMap.put(column.name(), field.get(obj)); + }catch (IllegalArgumentException e){ + e.printStackTrace(); + }catch (IllegalAccessException e){ + e.printStackTrace(); + } + } + tableMap.put(tableName.name(), dataMap); + List> query = baseMysqlCRUDMapper.query(tableMap); + + List list = new ArrayList(); + try{ + for (Map map : query){ + T newInstance = (T) obj.getClass().newInstance(); + Field[] declaredFields2 = newInstance.getClass().getDeclaredFields(); + for (Field field : declaredFields2){ + field.setAccessible(true); + // 得到字段的配置 + Column column = field.getAnnotation(Column.class); + if (column == null) { + log.info("该field没有配置注解不是表中在字段!"); + continue; + } + String name = column.name(); + field.set(newInstance, map.get(name)); + } + list.add(newInstance); + } + }catch (InstantiationException e){ + e.printStackTrace(); + }catch (IllegalAccessException e){ + e.printStackTrace(); + } + + return list; + } + + /** + * 递归扫描父类的fields + * @param clas + * @param fields + */ + @SuppressWarnings("rawtypes") + private Field[] recursionParents(Class clas, Field[] fields) { + if(clas.getSuperclass()!=null){ + Class clsSup = clas.getSuperclass(); + fields = (Field[]) ArrayUtils.addAll(fields,clsSup.getDeclaredFields()); + fields = recursionParents(clsSup, fields); + } + return fields; + } + +} diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/common/BaseMysqlCRUDMapper.xml b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/common/BaseMysqlCRUDMapper.xml index b6522630da9f9dba00dc9c0a20f8466594d88922..9f1059958fdb5892fc629a3abd576573bc60fe3f 100644 --- a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/common/BaseMysqlCRUDMapper.xml +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/common/BaseMysqlCRUDMapper.xml @@ -1,86 +1,86 @@ - - - - - - - - - - - - - - - - + + + + + + + + insert into `${key}`( + + + `${field}` + + + ) + + values( + + + #{fieldvalue} + + + ) + + + + + + + + + update `${key}` + + set + + + + `${field}` = #{fieldvalue} + + + + + where + + + + `${field}` = #{fieldvalue} + + + + + + + + + + + + + + diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/system/CreateMysqlTablesMapper.xml b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/system/CreateMysqlTablesMapper.xml index ae0c3a4b0271f88b91f1b627ef477c59afeead19..3674d53e171e528c53da2afb1745ed22792e0561 100644 --- a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/system/CreateMysqlTablesMapper.xml +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/system/CreateMysqlTablesMapper.xml @@ -1,133 +1,133 @@ - - - - - - - - `${fields.fieldName}` ${fields.fieldType} - - - `${fields.fieldName}` ${fields.fieldType}(${fields.fieldLength}) - - - `${fields.fieldName}` - ${fields.fieldType}(${fields.fieldLength},${fields.fieldDecimalLength}) - - - NULL - - - NOT NULL - - - AUTO_INCREMENT - - - - - DEFAULT #{fields.fieldDefaultValue} - - - - - DEFAULT #{fields.fieldDefaultValue} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + `${fields.fieldName}` ${fields.fieldType} + + + `${fields.fieldName}` ${fields.fieldType}(${fields.fieldLength}) + + + `${fields.fieldName}` + ${fields.fieldType}(${fields.fieldLength},${fields.fieldDecimalLength}) + + + NULL + + + NOT NULL + + + AUTO_INCREMENT + + + + + DEFAULT #{fields.fieldDefaultValue} + + + + + DEFAULT #{fields.fieldDefaultValue} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mybatis-enhance-actable/target/classes/META-INF/MANIFEST.MF b/mybatis-enhance-actable/target/classes/META-INF/MANIFEST.MF index e8663e652639b50fa3bdac167d271faed3465cca..ed92e517ef7efb5e34f6160da1247a3ca6746d56 100644 --- a/mybatis-enhance-actable/target/classes/META-INF/MANIFEST.MF +++ b/mybatis-enhance-actable/target/classes/META-INF/MANIFEST.MF @@ -1,5 +1,5 @@ Manifest-Version: 1.0 -Built-By: chenbin.sun +Built-By: SSH4557 Build-Jdk: 1.8.0_91 Created-By: Maven Integration for Eclipse