diff --git a/README.md b/README.md index f46f7fa3ae476255430f7083f9e3351a0a09e667..ab11abbac3215f24ed4564cbbc11b8dacc849843 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # mybatis-enhance-actable-0.0.1 -该项目是从之前写过的一个框架中抽取出来的,本身是对Mybatis做的增强功能,为了能够使习惯了hibernate框架的开发者能够快速的入手Mybatis,我给他取名叫做 “A.C.Table” 本意是自动建表的意思,A.C.Table是一个基于Spring和Mybatis的Maven项目,增强了Mybatis的功能,过配置model注解的方式来创建表,修改表结构,目前仅支持Mysql,后续可能会扩展针对其他数据库的支持。 +该项目是从之前写过的一个框架中抽取出来的,本身是对Mybatis做的增强功能,为了能够使习惯了hibernate框架的开发者能够快速的入手Mybatis,我给他取名叫做 “A.C.Table” 本意是自动建表的意思,A.C.Table是一个基于Spring和Mybatis的Maven项目,增强了Mybatis的功能,过配置model注解的方式来创建表,修改表结构,并且实现了共通的CUDR功能提升开发效率,目前仅支持Mysql,后续可能会扩展针对其他数据库的支持。 A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下: @@ -12,11 +12,21 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 5. 再次声明A.C.Table目前仅支持mysql数据库 **使用步骤方法** -1. 使用该功能的项目需要依赖mybatis-enhance-actable-0.0.1-SNAPSHOT.jar +1. 使用该功能的项目需要依赖mybatis-enhance-actable-1.0.1.jar + + 已上传至maven中央仓库,使用时pom文件中增加如下依赖 + + com.gitee.sunchenbin.mybatis.actable + mybatis-enhance-actable + 1.0.1 + 2. 在你的web项目上创建个目录比如config下面创建个文件autoCreateTable.properties文件的内容如下: mybatis.table.auto=update + mybatis.model.pack=com.sunchenbin.store.model + + mybatis.database.type=mysql 本系统提供三种模式: @@ -26,11 +36,14 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 2.3 当mybatis.table.auto=none时,系统不做任何处理。 - 2.4mybatis.model.pack这个配置是用来配置要扫描的用于创建表的对象的包名 + 2.4 mybatis.model.pack这个配置是用来配置要扫描的用于创建表的对象的包名 + + 2.5 mybatis.database.type这个是用来区别数据库的,预计会支持这四种数据库mysql/oracle/sqlserver/postgresql,但目前仅支持mysql 3. spring的配置文件中需要做如下配置: - - +``` + + @@ -45,8 +58,8 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 - 1. classpath*:com/mybatis/enhance/store/mapping/*/*.xml - 2. com.mybatis.enhance.store.dao.* + 1. classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml + 2. com.gitee.sunchenbin.mybatis.actable.dao.* 举例这两个配置配置的详细位置 @@ -57,7 +70,7 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 classpath*:com/sunchenbin/store/mapping/*/*.xml - classpath*:com/mybatis/enhance/store/mapping/*/*.xml + classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml @@ -65,9 +78,10 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 - + +``` **代码用途讲解** @@ -81,12 +95,78 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 5.系统启动后会去自动调用SysMysqlCreateTableManagerImpl.java的createMysqlTable()方法,没错,这就是核心方法了,负责创建、删除、修改表。 - **demo代码的地址** - - 1.码云地址:http://git.oschina.net/sunchenbin/mybatis-enhance-actable-demo - - 2.代码下载地址:https://git.oschina.net/sunchenbin/mybatis-enhance-actable-demo.git + **model的写法例子** +``` +@Table(name = "test") +public class Test extends BaseModel{ + + private static final long serialVersionUID = 5199200306752426433L; + + @Column(name = "id",type = MySqlTypeConstant.INT,length = 11,isKey = true,isAutoIncrement = true) + private Integer id; + + @Column(name = "name",type = MySqlTypeConstant.VARCHAR,length = 111) + private String name; + + @Column(name = "description",type = MySqlTypeConstant.TEXT) + private String description; + + @Column(name = "create_time",type = MySqlTypeConstant.DATETIME) + private Date create_time; - **之前的旧项目地址** + @Column(name = "update_time",type = MySqlTypeConstant.DATETIME) + private Date update_time; - http://git.oschina.net/sunchenbin/Mybatis_BuildTable_V0.2 + @Column(name = "number",type = MySqlTypeConstant.BIGINT,length = 5,isUnique=true) + private Long number; + + @Column(name = "lifecycle",type = MySqlTypeConstant.CHAR,length = 1,isNull=false) + private String lifecycle; + + @Column(name = "dekes",type = MySqlTypeConstant.DOUBLE,length = 5,decimalLength = 2) + private Double dekes; + + // get和set方法这里就不例举了太多 +} +``` + **共通的CUDR功能使用** + + 1.使用方法很简单,大家在manager或者Controller中直接注入BaseMysqlCRUDManager这个接口就可以了 + + 2.注意:接口调用save、delete等方法时传入的对象必须是modle中用于创建表的对象 +代码事例: +``` +@Controller +public class TestController{ + + @Autowired + private TestManager testManager; + + @Autowired + private BaseMysqlCRUDManager baseMysqlCRUDManager; + + /** + * 首页 + */ + @RequestMapping("/testDate") + @ResponseBody + public String testDate(){ + Test2 test2 = new Test2(); + test2.setNumber(3L); + baseMysqlCRUDManager.save(test2); + + Test test = new Test(); + test.setName("aaae333"); + test.setNumber(9L); + test.setDescription("adfsdfe"); + + baseMysqlCRUDManager.delete(test); + baseMysqlCRUDManager.save(test); + int count = testManager.findTestCount(); + System.out.println(count); + List query = baseMysqlCRUDManager.query(test); + String json = JsonUtil.format(query); + return json; + } +} +``` diff --git a/mybatis-enhance-actable/.gitignore b/mybatis-enhance-actable/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b83d22266ac8aa2f8df2edef68082c789727841d --- /dev/null +++ b/mybatis-enhance-actable/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/mybatis-enhance-actable/pom.xml b/mybatis-enhance-actable/pom.xml index 10c33c01c83080a968a2fabf22ba58ef4f139bcd..8d44171da6bb4111843f6d7fd08b2ee2aab7c31d 100644 --- a/mybatis-enhance-actable/pom.xml +++ b/mybatis-enhance-actable/pom.xml @@ -1,57 +1,193 @@ - - 4.0.0 - com.mybatis.enhance.store - mybatis-enhance-actable - 0.0.1-SNAPSHOT - - - 4.1.4.RELEASE - - - - - - - org.springframework - spring-context - ${spring.version} - provided - - - - org.springframework - spring-tx - ${spring.version} - provided - - - - org.slf4j - slf4j-api - 1.7.12 - provided - - - - org.mybatis.scripting - mybatis-velocity - 1.2 - provided - - - - - - - src/main/java - - **/*.properties - **/*.xml - - false - - - - + + + 4.0.0 + com.gitee.sunchenbin.mybatis.actable + mybatis-enhance-actable + 1.0.1 + + + org.sonatype.oss + oss-parent + 7 + + + com.gitee.sunchenbin.mybatis.actable:mybatis-enhance-actable + A.CTable is a Maven project based on Spring and Mybatis, which enhances the function of Mybatis + https://gitee.com/sunchenbin/mybatis-enhance + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + actable + + + + + + sunchenbin + 458757617@qq.com + sunchenbin + https://gitee.com/sunchenbin/mybatis-enhance + + + + + scm:git:git@gitee.com:sunchenbin/mybatis-enhance.git + scm:git:git@gitee.com:sunchenbin/mybatis-enhance.git + https://gitee.com/sunchenbin/mybatis-enhance + 1.0 + + + + 4.1.4.RELEASE + + + + + + + org.springframework + spring-context + ${spring.version} + provided + + + + org.springframework + spring-tx + ${spring.version} + provided + + + + org.slf4j + slf4j-api + 1.7.12 + provided + + + + org.mybatis.scripting + mybatis-velocity + 1.2 + provided + + + + + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + package + + jar-no-fork + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + UTF-8 + UTF-8 + + + + attach-javadocs + package + + jar + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + 1.6 + 1.6 + true + true + UTF-8 + true + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + /usr/local/lib + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.1 + + + + + + + + oss + OSS Snapshots Repository + + https://oss.sonatype.org/content/repositories/snapshots/ + + + oss + OSS Staging Repository + + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + \ No newline at end of file diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/Column.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/Column.java similarity index 75% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/Column.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/Column.java index 99856b2d8ca35bd67e7ca0f7b0f39e2a287c6c2b..7a2686557fdb48ea8f26a7bccff3310f0029ba0e 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/Column.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/Column.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.annotation; +package com.gitee.sunchenbin.mybatis.actable.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -26,63 +26,63 @@ public @interface Column{ /** * 字段名 * - * @return + * @return 字段名 */ public String name(); /** * 字段类型 * - * @return + * @return 字段类型 */ public String type(); /** * 字段长度,默认是255 * - * @return + * @return 字段长度,默认是255 */ public int length() default 255; /** * 小数点长度,默认是0 * - * @return + * @return 小数点长度,默认是0 */ public int decimalLength() default 0; /** * 是否为可以为null,true是可以,false是不可以,默认为true * - * @return + * @return 是否为可以为null,true是可以,false是不可以,默认为true */ public boolean isNull() default true; /** * 是否是主键,默认false * - * @return + * @return 是否是主键,默认false */ public boolean isKey() default false; /** * 是否自动递增,默认false 只有主键才能使用 * - * @return + * @return 是否自动递增,默认false 只有主键才能使用 */ public boolean isAutoIncrement() default false; /** * 默认值,默认为null * - * @return + * @return 默认值,默认为null */ public String defaultValue() default "NULL"; /** * 是否是唯一,默认false * - * @return + * @return 是否是唯一,默认false */ public boolean isUnique() default false; } diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/LengthCount.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/LengthCount.java similarity index 86% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/LengthCount.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/LengthCount.java index 93c0e4fb11aabb8bfc5ca2acdf5f481075b30a21..2157ebdf9bbb956abfdd74d88dfa705516690e69 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/LengthCount.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/LengthCount.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.annotation; +package com.gitee.sunchenbin.mybatis.actable.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -27,7 +27,7 @@ public @interface LengthCount{ /** * 默认是1,0表示不需要设置,1表示需要设置一个,2表示需要设置两个 * - * @return + * @return 默认是1,0表示不需要设置,1表示需要设置一个,2表示需要设置两个 */ public int LengthCount() default 1; } diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/Table.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/Table.java similarity index 90% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/Table.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/Table.java index b2885030130720261851d21c901847c2c7c1682c..2a62b754b24d78d4743bfeeb4770dc3175aa9e1f 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/annotation/Table.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/annotation/Table.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.annotation; +package com.gitee.sunchenbin.mybatis.actable.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -26,7 +26,7 @@ public @interface Table { /** * 表名 - * @return + * @return 表名 */ public String name(); } diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/BaseModel.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/BaseModel.java similarity index 94% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/BaseModel.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/BaseModel.java index efe8cf9d4e28d028f631f04b533acfa01831d66e..b598a9ffd18a7537c097cc3e9d5fe2875bc1a45d 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/BaseModel.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/BaseModel.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.command; +package com.gitee.sunchenbin.mybatis.actable.command; import java.io.Serializable; diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/CreateTableParam.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/CreateTableParam.java similarity index 97% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/CreateTableParam.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/CreateTableParam.java index ea52bbd8d4b1b370bab3ab669c6173fdee4a3cdc..f3c370482c4c93f757d6a2be5fcd9f08bdefee41 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/CreateTableParam.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/CreateTableParam.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.command; +package com.gitee.sunchenbin.mybatis.actable.command; /** * 用于存放创建表的字段信息 diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/SysMysqlColumns.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/SysMysqlColumns.java similarity index 85% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/SysMysqlColumns.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/SysMysqlColumns.java index e935cf12f5511714c807e44055f5fcaf5d0c6a07..a494492a2c023a8ac68a8572408410d02c18cb5a 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/command/SysMysqlColumns.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/command/SysMysqlColumns.java @@ -1,252 +1,252 @@ -package com.mybatis.enhance.store.command; - -/** - * 用于查询表中字段结构详细信息 - * - * @author sunchenbin - * @version 2016年6月23日 下午6:10:56 - */ -public class SysMysqlColumns { - - /** - * 字段名 - */ - public static final String COLUMN_NAME = "column_name"; - /** - * 默认值 - */ - public static final String COLUMN_DEFAULT = "column_default"; - /** - * 是否可为null,值:(YES,NO) - */ - public static final String IS_NULLABLE = "is_nullable"; - /** - * 数据类型 - */ - public static final String DATA_TYPE = "data_type"; - /** - * 长度,如果是0的话是null - */ - public static final String NUMERIC_PRECISION = "numeric_precision"; - /** - * 小数点数 - */ - public static final String NUMERIC_SCALE = "numeric_scale"; - /** - * 是否为主键,是的话是PRI - */ - public static final String COLUMN_KEY = "column_key"; - /** - * 是否为自动增长,是的话为auto_increment - */ - public static final String EXTRA = "extra"; - - private String table_catalog; - /** - * 库名 - */ - private String table_schema; - /** - * 表名 - */ - private String table_name; - /** - * 字段名 - */ - private String column_name; - /** - * 字段位置的排序 - */ - private String ordinal_position; - /** - * 字段默认值 - */ - private String column_default; - /** - * 是否可以为null - */ - private String is_nullable; - /** - * 字段类型 - */ - private String data_type; - private String character_maximum_length; - private String character_octet_length; - /** - * 长度 - */ - private String numeric_precision; - /** - * 小数点数 - */ - private String numeric_scale; - private String character_set_name; - private String collation_name; - /** - * 类型加长度拼接的字符串,例如varchar(100) - */ - private String column_type; - /** - * 主键:PRI;唯一键:UNI - */ - private String column_key; - /** - * 是否为自动增长,是的话为auto_increment - */ - private String extra; - private String privileges; - private String column_comment; - - public String getTable_catalog() { - return table_catalog; - } - - public void setTable_catalog(String table_catalog) { - this.table_catalog = table_catalog; - } - - public String getTable_schema() { - return table_schema; - } - - public void setTable_schema(String table_schema) { - this.table_schema = table_schema; - } - - public String getTable_name() { - return table_name; - } - - public void setTable_name(String table_name) { - this.table_name = table_name; - } - - public String getColumn_name() { - return column_name; - } - - public void setColumn_name(String column_name) { - this.column_name = column_name; - } - - public String getOrdinal_position() { - return ordinal_position; - } - - public void setOrdinal_position(String ordinal_position) { - this.ordinal_position = ordinal_position; - } - - public String getColumn_default() { - return column_default; - } - - public void setColumn_default(String column_default) { - this.column_default = column_default; - } - - public String getIs_nullable() { - return is_nullable; - } - - public void setIs_nullable(String is_nullable) { - this.is_nullable = is_nullable; - } - - public String getData_type() { - return data_type; - } - - public void setData_type(String data_type) { - this.data_type = data_type; - } - - public String getCharacter_maximum_length() { - return character_maximum_length; - } - - public void setCharacter_maximum_length(String character_maximum_length) { - this.character_maximum_length = character_maximum_length; - } - - public String getCharacter_octet_length() { - return character_octet_length; - } - - public void setCharacter_octet_length(String character_octet_length) { - this.character_octet_length = character_octet_length; - } - - public String getNumeric_precision() { - return numeric_precision; - } - - public void setNumeric_precision(String numeric_precision) { - this.numeric_precision = numeric_precision; - } - - public String getNumeric_scale() { - return numeric_scale; - } - - public void setNumeric_scale(String numeric_scale) { - this.numeric_scale = numeric_scale; - } - - public String getCharacter_set_name() { - return character_set_name; - } - - public void setCharacter_set_name(String character_set_name) { - this.character_set_name = character_set_name; - } - - public String getCollation_name() { - return collation_name; - } - - public void setCollation_name(String collation_name) { - this.collation_name = collation_name; - } - - public String getColumn_type() { - return column_type; - } - - public void setColumn_type(String column_type) { - this.column_type = column_type; - } - - public String getColumn_key() { - return column_key; - } - - public void setColumn_key(String column_key) { - this.column_key = column_key; - } - - public String getExtra() { - return extra; - } - - public void setExtra(String extra) { - this.extra = extra; - } - - public String getPrivileges() { - return privileges; - } - - public void setPrivileges(String privileges) { - this.privileges = privileges; - } - - public String getColumn_comment() { - return column_comment; - } - - public void setColumn_comment(String column_comment) { - this.column_comment = column_comment; - } - -} +package com.gitee.sunchenbin.mybatis.actable.command; + +/** + * 用于查询表中字段结构详细信息 + * + * @author sunchenbin + * @version 2016年6月23日 下午6:10:56 + */ +public class SysMysqlColumns { + + /** + * 字段名 + */ + public static final String COLUMN_NAME_KEY = "column_name"; + /** + * 默认值 + */ + public static final String COLUMN_DEFAULT_KEY = "column_default"; + /** + * 是否可为null,值:(YES,NO) + */ + public static final String IS_NULLABLE_KEY = "is_nullable"; + /** + * 数据类型 + */ + public static final String DATA_TYPE_KEY = "data_type"; + /** + * 长度,如果是0的话是null + */ + public static final String NUMERIC_PRECISION_KEY = "numeric_precision"; + /** + * 小数点数 + */ + public static final String NUMERIC_SCALE_KEY = "numeric_scale"; + /** + * 是否为主键,是的话是PRI + */ + public static final String COLUMN_KEY_KEY = "column_key"; + /** + * 是否为自动增长,是的话为auto_increment + */ + public static final String EXTRA_KEY = "extra"; + + private String table_catalog; + /** + * 库名 + */ + private String table_schema; + /** + * 表名 + */ + private String table_name; + /** + * 字段名 + */ + private String column_name; + /** + * 字段位置的排序 + */ + private String ordinal_position; + /** + * 字段默认值 + */ + private String column_default; + /** + * 是否可以为null + */ + private String is_nullable; + /** + * 字段类型 + */ + private String data_type; + private String character_maximum_length; + private String character_octet_length; + /** + * 长度 + */ + private String numeric_precision; + /** + * 小数点数 + */ + private String numeric_scale; + private String character_set_name; + private String collation_name; + /** + * 类型加长度拼接的字符串,例如varchar(100) + */ + private String column_type; + /** + * 主键:PRI;唯一键:UNI + */ + private String column_key; + /** + * 是否为自动增长,是的话为auto_increment + */ + private String extra; + private String privileges; + private String column_comment; + + public String getTable_catalog() { + return table_catalog; + } + + public void setTable_catalog(String table_catalog) { + this.table_catalog = table_catalog; + } + + public String getTable_schema() { + return table_schema; + } + + public void setTable_schema(String table_schema) { + this.table_schema = table_schema; + } + + public String getTable_name() { + return table_name; + } + + public void setTable_name(String table_name) { + this.table_name = table_name; + } + + public String getColumn_name() { + return column_name; + } + + public void setColumn_name(String column_name) { + this.column_name = column_name; + } + + public String getOrdinal_position() { + return ordinal_position; + } + + public void setOrdinal_position(String ordinal_position) { + this.ordinal_position = ordinal_position; + } + + public String getColumn_default() { + return column_default; + } + + public void setColumn_default(String column_default) { + this.column_default = column_default; + } + + public String getIs_nullable() { + return is_nullable; + } + + public void setIs_nullable(String is_nullable) { + this.is_nullable = is_nullable; + } + + public String getData_type() { + return data_type; + } + + public void setData_type(String data_type) { + this.data_type = data_type; + } + + public String getCharacter_maximum_length() { + return character_maximum_length; + } + + public void setCharacter_maximum_length(String character_maximum_length) { + this.character_maximum_length = character_maximum_length; + } + + public String getCharacter_octet_length() { + return character_octet_length; + } + + public void setCharacter_octet_length(String character_octet_length) { + this.character_octet_length = character_octet_length; + } + + public String getNumeric_precision() { + return numeric_precision; + } + + public void setNumeric_precision(String numeric_precision) { + this.numeric_precision = numeric_precision; + } + + public String getNumeric_scale() { + return numeric_scale; + } + + public void setNumeric_scale(String numeric_scale) { + this.numeric_scale = numeric_scale; + } + + public String getCharacter_set_name() { + return character_set_name; + } + + public void setCharacter_set_name(String character_set_name) { + this.character_set_name = character_set_name; + } + + public String getCollation_name() { + return collation_name; + } + + public void setCollation_name(String collation_name) { + this.collation_name = collation_name; + } + + public String getColumn_type() { + return column_type; + } + + public void setColumn_type(String column_type) { + this.column_type = column_type; + } + + public String getColumn_key() { + return column_key; + } + + public void setColumn_key(String column_key) { + this.column_key = column_key; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } + + public String getPrivileges() { + return privileges; + } + + public void setPrivileges(String privileges) { + this.privileges = privileges; + } + + public String getColumn_comment() { + return column_comment; + } + + public void setColumn_comment(String column_comment) { + this.column_comment = column_comment; + } + +} diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/constants/MySqlTypeConstant.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/constants/MySqlTypeConstant.java similarity index 88% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/constants/MySqlTypeConstant.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/constants/MySqlTypeConstant.java index 8aa1d6fa70388c763a0b3899ed5cb7f8b8ae9cad..10c14d8d26f5346c0f36a8c7bc0f7da1e88753f5 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/constants/MySqlTypeConstant.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/constants/MySqlTypeConstant.java @@ -1,6 +1,6 @@ -package com.mybatis.enhance.store.constants; +package com.gitee.sunchenbin.mybatis.actable.constants; -import com.mybatis.enhance.store.annotation.LengthCount; +import com.gitee.sunchenbin.mybatis.actable.annotation.LengthCount; /** diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/constants/OracleTypeConstant.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/constants/OracleTypeConstant.java new file mode 100644 index 0000000000000000000000000000000000000000..33a7f7311e020dab562489e89d1f1fe7f7676034 --- /dev/null +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/constants/OracleTypeConstant.java @@ -0,0 +1,32 @@ +package com.gitee.sunchenbin.mybatis.actable.constants; + +import com.gitee.sunchenbin.mybatis.actable.annotation.LengthCount; + + +/** + * 用于配置Oracle数据库中类型,并且该类型需要设置几个长度 + * 这里配置多少个类型决定了,创建表能使用多少类型 + * 例如:varchar2(1) + * number(5,2) + * date + * + * @author sunchenbin + * @version 2016年6月23日 下午5:59:33 + */ +public class OracleTypeConstant { + + @LengthCount(LengthCount=2) + public static final String NUMBER = "number"; + + @LengthCount + public static final String VARCHAR2 = "varchar2"; + + @LengthCount(LengthCount=0) + public static final String CLOB = "clob"; + + @LengthCount(LengthCount=0) + public static final String DATE = "date"; + + @LengthCount + public static final String CHAR = "char"; +} diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/dao/common/BaseMysqlCRUDMapper.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/common/BaseMysqlCRUDMapper.java similarity index 76% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/dao/common/BaseMysqlCRUDMapper.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/common/BaseMysqlCRUDMapper.java index a42e0fb180ed8869337a661bb886fc5ad878638b..48e24663a8fa89d4b9ea5fba3c56406613f76e6e 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/dao/common/BaseMysqlCRUDMapper.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/common/BaseMysqlCRUDMapper.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.dao.common; +package com.gitee.sunchenbin.mybatis.actable.dao.common; import java.util.List; import java.util.Map; @@ -15,26 +15,25 @@ public interface BaseMysqlCRUDMapper { /** * 保存 - * @param tableMap + * @param tableMap 表结构的map */ public void save(@Param("tableMap") Map> tableMap); /** * 更新 - * @param tableMap + * @param tableMap 表结构的map */ public void update(@Param("tableMap") Map> tableMap); /** * 删除 - * @param tableMap + * @param tableMap 表结构的map */ public void delete(@Param("tableMap") Map> tableMap); /** * 查询 - * @param - * @param tableMap + * @param tableMap 表结构的map */ public List> query(@Param("tableMap") Map> tableMap); diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/dao/system/CreateMysqlTablesMapper.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/system/CreateMysqlTablesMapper.java similarity index 72% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/dao/system/CreateMysqlTablesMapper.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/system/CreateMysqlTablesMapper.java index 80f8050a48c3c04519f8f93153fb326468ff2326..32f65d0695550ff07b1f921aabd617362eb37450 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/dao/system/CreateMysqlTablesMapper.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/dao/system/CreateMysqlTablesMapper.java @@ -1,11 +1,11 @@ -package com.mybatis.enhance.store.dao.system; +package com.gitee.sunchenbin.mybatis.actable.dao.system; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Param; -import com.mybatis.enhance.store.command.SysMysqlColumns; +import com.gitee.sunchenbin.mybatis.actable.command.SysMysqlColumns; /** @@ -17,57 +17,57 @@ public interface CreateMysqlTablesMapper { /** * 根据结构注解解析出来的信息创建表 - * @param tableMap + * @param tableMap 表结构的map */ public void createTable(@Param("tableMap") Map> tableMap); /** * 根据表名查询表在库中是否存在,存在返回1,不存在返回0 - * @param tableName - * @return + * @param tableName 表结构的map + * @return 存在返回1,不存在返回0 */ public int findTableCountByTableName(@Param("tableName") String tableName); /** * 根据表名查询库中该表的字段结构等信息 - * @param tableName - * @return + * @param tableName 表结构的map + * @return 表的字段结构等信息 */ public List findTableEnsembleByTableName(@Param("tableName") String tableName); /** * 增加字段 - * @param tableMap + * @param tableMap 表结构的map */ public void addTableField(@Param("tableMap") Map tableMap); /** * 删除字段 - * @param tableMap + * @param tableMap 表结构的map */ public void removeTableField(@Param("tableMap") Map tableMap); /** * 修改字段 - * @param tableMap + * @param tableMap 表结构的map */ public void modifyTableField(@Param("tableMap") Map tableMap); /** * 删除主键约束,附带修改其他字段属性功能 - * @param tableMap + * @param tableMap 表结构的map */ public void dropKeyTableField(@Param("tableMap") Map tableMap); /** * 删除唯一约束字段,不带修改其他字段属性的功能 - * @param tableMap + * @param tableMap 表结构的map */ public void dropUniqueTableField(@Param("tableMap") Map tableMap); /** * 根据表名删除表 - * @param tableName + * @param tableName 表结构的map */ public void dorpTableByName(@Param("tableName") String tableName); } diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/common/BaseMysqlCRUDManager.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManager.java similarity index 35% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/common/BaseMysqlCRUDManager.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManager.java index 2d27559d9103afcc34067d5e3ff809398c84d70b..8f5b857172ca3f14b8dfbc8fd987678e99a98033 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/common/BaseMysqlCRUDManager.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManager.java @@ -1,24 +1,27 @@ -package com.mybatis.enhance.store.manager.common; +package com.gitee.sunchenbin.mybatis.actable.manager.common; import java.util.List; -public interface BaseMysqlCRUDManager{ +public interface BaseMysqlCRUDManager{ /** * 保存,如果主键有值则进行更新操作 - * @param t + * @param model类型 + * @param t 要保存的model类型数据 */ - void save(T t); + void save(T t); /** * 根据传入对象非空的条件删除 - * @param t + * @param model类型 + * @param t 要删除的model类型数据 */ - void delete(T t); + void delete(T t); /** * 根据传入对象非空的条件进行查询 - * @param t + * @param model类型 + * @param t 要查询的model类型数据 */ - List query(T t); + List query(T t); } diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/common/BaseMysqlCRUDManagerImpl.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManagerImpl.java similarity index 80% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/common/BaseMysqlCRUDManagerImpl.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManagerImpl.java index 4d962fc7ef4cefc3ba2beca66df45530be5f699b..8807be5da15fdf9d2797ca8a933526527e0f2d45 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/common/BaseMysqlCRUDManagerImpl.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/common/BaseMysqlCRUDManagerImpl.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.manager.common; +package com.gitee.sunchenbin.mybatis.actable.manager.common; import java.lang.reflect.Field; import java.util.ArrayList; @@ -6,19 +6,20 @@ 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.mybatis.enhance.store.annotation.Column; -import com.mybatis.enhance.store.annotation.Table; -import com.mybatis.enhance.store.dao.common.BaseMysqlCRUDMapper; +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{ +public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ private static final Logger log = LoggerFactory.getLogger(BaseMysqlCRUDManagerImpl.class); @@ -27,17 +28,17 @@ public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ @Autowired private BaseMysqlCRUDMapper baseMysqlCRUDMapper; - public void save(Object obj){ + 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(); - Field[] declaredFields = obj.getClass().getDeclaredFields(); for (Field field : declaredFields){ try{ // 私有属性需要设置访问权限 @@ -79,7 +80,15 @@ public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ } } - public void delete(Object obj){ + 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); @@ -87,11 +96,9 @@ public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ log.error("必须使用model中的对象!"); return; } + Field[] declaredFields = getAllFields(obj); Map> tableMap = new HashMap>(); Map dataMap = new HashMap(); - - Field[] declaredFields = obj.getClass().getDeclaredFields(); - for (Field field : declaredFields){ // 设置访问权限 field.setAccessible(true); @@ -113,18 +120,17 @@ public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ baseMysqlCRUDMapper.delete(tableMap); } - public List query(Object obj){ + @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(); - - Field[] declaredFields = obj.getClass().getDeclaredFields(); - for (Field field : declaredFields){ // 设置访问权限 field.setAccessible(true); @@ -145,10 +151,10 @@ public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ tableMap.put(tableName.name(), dataMap); List> query = baseMysqlCRUDMapper.query(tableMap); - List list = new ArrayList(); + List list = new ArrayList(); try{ for (Map map : query){ - Object newInstance = obj.getClass().newInstance(); + T newInstance = (T) obj.getClass().newInstance(); Field[] declaredFields2 = newInstance.getClass().getDeclaredFields(); for (Field field : declaredFields2){ field.setAccessible(true); @@ -164,14 +170,27 @@ public class BaseMysqlCRUDManagerImpl implements BaseMysqlCRUDManager{ list.add(newInstance); } }catch (InstantiationException e){ - // TODO Auto-generated catch block e.printStackTrace(); }catch (IllegalAccessException e){ - // TODO Auto-generated catch block 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/manager/handler/StartUpHandler.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/handler/StartUpHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..acbfc8a938f555bda035d7ff4d78908625031b99 --- /dev/null +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/handler/StartUpHandler.java @@ -0,0 +1,15 @@ +package com.gitee.sunchenbin.mybatis.actable.manager.handler; + + +/** + * 启动时执行处理的接口 + * @author chenbin.sun + * + */ +public interface StartUpHandler { + + /** + * 建表开始 + */ + void startHandler(); +} diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/handler/StartUpHandlerImpl.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/handler/StartUpHandlerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..8a8dbab2899d87460c6bb835fd235e0928695e9b --- /dev/null +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/handler/StartUpHandlerImpl.java @@ -0,0 +1,70 @@ +package com.gitee.sunchenbin.mybatis.actable.manager.handler; + +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.gitee.sunchenbin.mybatis.actable.manager.system.SysMysqlCreateTableManager; + +/** + * 启动时进行处理的实现类 + * @author chenbin.sun + * + */ +@SuppressWarnings("restriction") +@Service +public class StartUpHandlerImpl implements StartUpHandler { + + private static final Logger log = LoggerFactory.getLogger(StartUpHandlerImpl.class); + + /** 数据库类型:mysql */ + public static String MYSQL = "mysql"; + + /** 数据库类型:oracle */ + public static String ORACLE = "oracle"; + + /** 数据库类型:sqlserver */ + public static String SQLSERVER = "sqlserver"; + + /** 数据库类型:postgresql */ + public static String POSTGRESQL = "postgresql"; + + /** + * 数据库类型 + */ + @Value("#{configProperties['mybatis.database.type']}") + private String databaseType = MYSQL; + + @Autowired + private SysMysqlCreateTableManager sysMysqlCreateTableManager; + + @PostConstruct + public void startHandler() { + + // 执行mysql的处理方法 + if (MYSQL.equals(databaseType)) { + + log.info("databaseType=mysql,开始执行mysql的处理方法"); + + sysMysqlCreateTableManager.createMysqlTable(); + }else if (ORACLE.equals(databaseType)) { + + log.info("databaseType=oracle,开始执行oracle的处理方法"); + }else if (SQLSERVER.equals(databaseType)) { + + log.info("databaseType=sqlserver,开始执行sqlserver的处理方法"); + }else if (POSTGRESQL.equals(databaseType)) { + + log.info("databaseType=postgresql,开始执行postgresql的处理方法"); + }else{ + + log.info("没有找到符合条件的处理方法!"); + } + } + + +} diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/system/SysMysqlCreateTableManager.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManager.java similarity index 72% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/system/SysMysqlCreateTableManager.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManager.java index 211544684d1977fe55cf3272e64f0ebb4e93a1f9..d71dca34320d06c4f626adc393e27a7a1bcec149 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/system/SysMysqlCreateTableManager.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManager.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.manager.system; +package com.gitee.sunchenbin.mybatis.actable.manager.system; /** diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/system/SysMysqlCreateTableManagerImpl.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManagerImpl.java similarity index 65% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/system/SysMysqlCreateTableManagerImpl.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManagerImpl.java index 4a8671916728f860ed3612a1a366b9c46b6b6dc7..bee758284b45c71de244532c9b5af32130b24e64 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/manager/system/SysMysqlCreateTableManagerImpl.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManagerImpl.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.manager.system; +package com.gitee.sunchenbin.mybatis.actable.manager.system; import java.lang.reflect.Field; import java.util.ArrayList; @@ -8,8 +8,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import javax.annotation.PostConstruct; - import org.apache.commons.lang.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,37 +16,36 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.mybatis.enhance.store.annotation.Column; -import com.mybatis.enhance.store.annotation.LengthCount; -import com.mybatis.enhance.store.annotation.Table; -import com.mybatis.enhance.store.command.CreateTableParam; -import com.mybatis.enhance.store.command.SysMysqlColumns; -import com.mybatis.enhance.store.constants.MySqlTypeConstant; -import com.mybatis.enhance.store.dao.system.CreateMysqlTablesMapper; -import com.mybatis.enhance.store.utils.ClassTools; +import com.gitee.sunchenbin.mybatis.actable.annotation.Column; +import com.gitee.sunchenbin.mybatis.actable.annotation.LengthCount; +import com.gitee.sunchenbin.mybatis.actable.annotation.Table; +import com.gitee.sunchenbin.mybatis.actable.command.CreateTableParam; +import com.gitee.sunchenbin.mybatis.actable.command.SysMysqlColumns; +import com.gitee.sunchenbin.mybatis.actable.constants.MySqlTypeConstant; +import com.gitee.sunchenbin.mybatis.actable.dao.system.CreateMysqlTablesMapper; +import com.gitee.sunchenbin.mybatis.actable.utils.ClassTools; /** - * 项目启动时自动扫描配置的目录中的model,根据配置的规则自动创建或更新表 - * 该逻辑只适用于mysql,其他数据库尚且需要另外扩展,因为sql的语法不同 + * 项目启动时自动扫描配置的目录中的model,根据配置的规则自动创建或更新表 该逻辑只适用于mysql,其他数据库尚且需要另外扩展,因为sql的语法不同 * * @author sunchenbin * @version 2016年6月23日 下午5:58:12 */ @Transactional @Service("sysMysqlCreateTableManager") -public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManager{ +public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManager { - private static final Logger log = LoggerFactory.getLogger(SysMysqlCreateTableManagerImpl.class); + private static final Logger log = LoggerFactory.getLogger(SysMysqlCreateTableManagerImpl.class); @Autowired - private CreateMysqlTablesMapper createMysqlTablesMapper; - + private CreateMysqlTablesMapper createMysqlTablesMapper; + /** * 要扫描的model所在的pack */ - @Value("#{configProperties['mybatis.model.pack']}") + @Value("#{configProperties['mybatis.model.pack']}") private String pack; - + /** * 自动创建模式:update表示更新,create表示删除原表重新创建 */ @@ -58,11 +55,18 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage /** * 读取配置文件的三种状态(创建表、更新表、不做任何事情) */ - @PostConstruct - public void createMysqlTable(){ - + public void createMysqlTable() { + + // 不做任何事情 + if ("none".equals(tableAuto)) { + log.info("配置mybatis.table.auto=none,不需要做任何事情"); + return; + } + + // 获取Mysql的类型,以及类型需要设置几个长度 Map mySqlTypeAndLengthMap = mySqlTypeAndLengthMap(); + // 从包package中获取所有的Class Set> classes = ClassTools.getClasses(pack); // 用于存需要创建的表名+结构 @@ -79,46 +83,50 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage // 用于存需要删除主键的表名+结构 Map> dropKeyTableMap = new HashMap>(); - + // 用于存需要删除唯一约束的表名+结构 Map> dropUniqueTableMap = new HashMap>(); - + // 构建出全部表的增删改的map - allTableMapConstruct(mySqlTypeAndLengthMap, classes, newTableMap, modifyTableMap, addTableMap, removeTableMap, dropKeyTableMap,dropUniqueTableMap); + allTableMapConstruct(mySqlTypeAndLengthMap, classes, newTableMap, modifyTableMap, addTableMap, removeTableMap, + dropKeyTableMap, dropUniqueTableMap); // 根据传入的map,分别去创建或修改表结构 - createOrModifyTableConstruct(newTableMap, modifyTableMap, addTableMap, removeTableMap, dropKeyTableMap,dropUniqueTableMap); + createOrModifyTableConstruct(newTableMap, modifyTableMap, addTableMap, removeTableMap, dropKeyTableMap, + dropUniqueTableMap); } /** * 构建出全部表的增删改的map * * @param mySqlTypeAndLengthMap + * 获取Mysql的类型,以及类型需要设置几个长度 * @param classes + * 从包package中获取所有的Class * @param newTableMap + * 用于存需要创建的表名+结构 * @param modifyTableMap + * 用于存需要更新字段类型等的表名+结构 * @param addTableMap + * 用于存需要增加字段的表名+结构 * @param removeTableMap + * 用于存需要删除字段的表名+结构 * @param dropKeyTableMap + * 用于存需要删除主键的表名+结构 * @param dropUniqueTableMap + * 用于存需要删除唯一约束的表名+结构 */ - private void allTableMapConstruct( - Map mySqlTypeAndLengthMap, - Set> classes, - Map> newTableMap, - Map> modifyTableMap, - Map> addTableMap, - Map> removeTableMap, - Map> dropKeyTableMap, - Map> dropUniqueTableMap){ - if("none".equals(tableAuto)){ - // 不做任何事情 - return; - } - - for (Class clas : classes){ + private void allTableMapConstruct(Map mySqlTypeAndLengthMap, Set> classes, + Map> newTableMap, Map> modifyTableMap, + Map> addTableMap, Map> removeTableMap, + Map> dropKeyTableMap, Map> dropUniqueTableMap) { + for (Class clas : classes) { Table table = clas.getAnnotation(Table.class); + // 没有打注解不需要创建变 + if (null == table) { + continue; + } // 用于存新增表的字段 List newFieldList = new ArrayList(); @@ -135,9 +143,9 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage // 迭代出所有model的所有fields存到newFieldList中 tableFieldsConstruct(mySqlTypeAndLengthMap, clas, newFieldList); - + // 如果配置文件配置的是create,表示将所有的表删掉重新创建 - if("create".equals(tableAuto)){ + if ("create".equals(tableAuto)) { createMysqlTablesMapper.dorpTableByName(table.name()); } @@ -147,34 +155,23 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage // 不存在时 if (exist == 0) { newTableMap.put(table.name(), newFieldList); - }else{ + } else { // 已存在时理论上做修改的操作,这里查出该表的结构 - List tableColumnList = createMysqlTablesMapper.findTableEnsembleByTableName(table.name()); + List tableColumnList = createMysqlTablesMapper + .findTableEnsembleByTableName(table.name()); // 从sysColumns中取出我们需要比较的列的List // 先取出name用来筛选出增加和删除的字段 - List columnNames = ClassTools.getPropertyValueList(tableColumnList, SysMysqlColumns.COLUMN_NAME); + List columnNames = ClassTools.getPropertyValueList(tableColumnList, + SysMysqlColumns.COLUMN_NAME_KEY); // 验证对比从model中解析的fieldList与从数据库查出来的columnList // 1. 找出增加的字段 // 2. 找出删除的字段 // 3. 找出更新的字段 - buildAddAndRemoveAndModifyFields( - mySqlTypeAndLengthMap, - modifyTableMap, - addTableMap, - removeTableMap, - dropKeyTableMap, - dropUniqueTableMap, - table, - newFieldList, - removeFieldList, - addFieldList, - modifyFieldList, - dropKeyFieldList, - dropUniqueFieldList, - tableColumnList, - columnNames); + buildAddAndRemoveAndModifyFields(mySqlTypeAndLengthMap, modifyTableMap, addTableMap, removeTableMap, + dropKeyTableMap, dropUniqueTableMap, table, newFieldList, removeFieldList, addFieldList, + modifyFieldList, dropKeyFieldList, dropUniqueFieldList, tableColumnList, columnNames); } } @@ -184,44 +181,50 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 构建增加的删除的修改的字段 * * @param mySqlTypeAndLengthMap + * 获取Mysql的类型,以及类型需要设置几个长度 * @param modifyTableMap + * 用于存需要更新字段类型等的表名+结构 * @param addTableMap + * 用于存需要增加字段的表名+结构 * @param removeTableMap + * 用于存需要删除字段的表名+结构 * @param dropKeyTableMap + * 用于存需要删除主键的表名+结构 * @param dropUniqueTableMap + * 用于存需要删除唯一约束的表名+结构 * @param table + * 表 * @param newFieldList + * 用于存新增表的字段 * @param removeFieldList + * 用于存删除的字段 * @param addFieldList + * 用于存新增的字段 * @param modifyFieldList + * 用于存修改的字段 * @param dropKeyFieldList + * 用于存删除主键的字段 * @param dropUniqueFieldList + * 用于存删除唯一约束的字段 * @param tableColumnList + * 已存在时理论上做修改的操作,这里查出该表的结构 * @param columnNames + * 从sysColumns中取出我们需要比较的列的List */ - private void buildAddAndRemoveAndModifyFields( - Map mySqlTypeAndLengthMap, - Map> modifyTableMap, - Map> addTableMap, - Map> removeTableMap, - Map> dropKeyTableMap, - Map> dropUniqueTableMap, - Table table, - List newFieldList, - List removeFieldList, - List addFieldList, - List modifyFieldList, - List dropKeyFieldList, - List dropUniqueFieldList, - List tableColumnList, - List columnNames){ + private void buildAddAndRemoveAndModifyFields(Map mySqlTypeAndLengthMap, + Map> modifyTableMap, Map> addTableMap, + Map> removeTableMap, Map> dropKeyTableMap, + Map> dropUniqueTableMap, Table table, List newFieldList, + List removeFieldList, List addFieldList, List modifyFieldList, + List dropKeyFieldList, List dropUniqueFieldList, List tableColumnList, + List columnNames) { // 1. 找出增加的字段 // 根据数据库中表的结构和model中表的结构对比找出新增的字段 buildNewFields(addTableMap, table, newFieldList, addFieldList, columnNames); // 将fieldList转成Map类型,字段名作为主键 Map fieldMap = new HashMap(); - for (Object obj : newFieldList){ + for (Object obj : newFieldList) { CreateTableParam createTableParam = (CreateTableParam) obj; fieldMap.put(createTableParam.getFieldName(), createTableParam); } @@ -230,45 +233,39 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage buildRemoveFields(removeTableMap, table, removeFieldList, columnNames, fieldMap); // 3. 找出更新的字段 - buildModifyFields( - mySqlTypeAndLengthMap, - modifyTableMap, - dropKeyTableMap, - dropUniqueTableMap, - table, - modifyFieldList, - dropKeyFieldList, - dropUniqueFieldList, - tableColumnList, - fieldMap); + buildModifyFields(mySqlTypeAndLengthMap, modifyTableMap, dropKeyTableMap, dropUniqueTableMap, table, + modifyFieldList, dropKeyFieldList, dropUniqueFieldList, tableColumnList, fieldMap); } /** * 根据数据库中表的结构和model中表的结构对比找出修改类型默认值等属性的字段 * * @param mySqlTypeAndLengthMap + * 获取Mysql的类型,以及类型需要设置几个长度 * @param modifyTableMap + * 用于存需要更新字段类型等的表名+结构 * @param dropKeyTableMap + * 用于存需要删除主键的表名+结构 * @param dropUniqueTableMap + * 用于存需要删除唯一约束的表名+结构 * @param table + * 表 * @param modifyFieldList + * 用于存修改的字段 * @param dropKeyFieldList + * 用于存删除主键的字段 * @param dropUniqueFieldList + * 用于存删除唯一约束的字段 * @param tableColumnList + * 已存在时理论上做修改的操作,这里查出该表的结构 * @param fieldMap + * 从sysColumns中取出我们需要比较的列的List */ - private void buildModifyFields( - Map mySqlTypeAndLengthMap, - Map> modifyTableMap, - Map> dropKeyTableMap, - Map> dropUniqueTableMap, - Table table, - List modifyFieldList, - List dropKeyFieldList, - List dropUniqueFieldList, - List tableColumnList, - Map fieldMap){ - for (SysMysqlColumns sysColumn : tableColumnList){ + private void buildModifyFields(Map mySqlTypeAndLengthMap, Map> modifyTableMap, + Map> dropKeyTableMap, Map> dropUniqueTableMap, Table table, + List modifyFieldList, List dropKeyFieldList, List dropUniqueFieldList, + List tableColumnList, Map fieldMap) { + for (SysMysqlColumns sysColumn : tableColumnList) { // 数据库中有该字段时 CreateTableParam createTableParam = fieldMap.get(sysColumn.getColumn_name()); if (createTableParam != null) { @@ -277,12 +274,12 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage if ("PRI".equals(sysColumn.getColumn_key()) && !createTableParam.isFieldIsKey()) { dropKeyFieldList.add(createTableParam); } - + // 原本是唯一,现在不是了,那么要去做删除唯一的操作 if ("UNI".equals(sysColumn.getColumn_key()) && !createTableParam.isFieldIsUnique()) { dropUniqueFieldList.add(createTableParam); } - + // 验证是否有更新 // 1.验证类型 if (!sysColumn.getData_type().toLowerCase().equals(createTableParam.getFieldType().toLowerCase())) { @@ -296,10 +293,10 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage if (length == 1) { // 拼接出类型加长度,比如varchar(1) typeAndLength = typeAndLength + "(" + createTableParam.getFieldLength() + ")"; - }else if (length == 2) { + } else if (length == 2) { // 拼接出类型加长度,比如varchar(1) - typeAndLength = typeAndLength + "(" + createTableParam.getFieldLength() + "," + createTableParam.getFieldDecimalLength() - + ")"; + typeAndLength = typeAndLength + "(" + createTableParam.getFieldLength() + "," + + createTableParam.getFieldDecimalLength() + ")"; } // 判断类型+长度是否相同 if (!sysColumn.getColumn_type().toLowerCase().equals(typeAndLength)) { @@ -327,27 +324,27 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage modifyFieldList.add(createTableParam); continue; } - }else if (!sysColumn.getColumn_default().equals(createTableParam.getFieldDefaultValue())) { + } else if (!sysColumn.getColumn_default().equals(createTableParam.getFieldDefaultValue())) { // 两者不相等时,需要更新该字段 modifyFieldList.add(createTableParam); continue; } - // 7.验证是否可以为null - if (sysColumn.getIs_nullable().equals("NO")) { + // 7.验证是否可以为null(主键不参与是否为null的更新) + if (sysColumn.getIs_nullable().equals("NO") && !createTableParam.isFieldIsKey()) { if (createTableParam.isFieldIsNull()) { // 一个是可以一个是不可用,所以需要更新该字段 modifyFieldList.add(createTableParam); continue; } - }else if (sysColumn.getIs_nullable().equals("YES")) { + } else if (sysColumn.getIs_nullable().equals("YES") && !createTableParam.isFieldIsKey()) { if (!createTableParam.isFieldIsNull()) { // 一个是可以一个是不可用,所以需要更新该字段 modifyFieldList.add(createTableParam); continue; } } - + // 8.验证是否唯一 if (!"UNI".equals(sysColumn.getColumn_key()) && createTableParam.isFieldIsUnique()) { // 原本不是唯一,现在变成了唯一,那么要去做更新 @@ -365,7 +362,7 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage if (dropKeyFieldList.size() > 0) { dropKeyTableMap.put(table.name(), dropKeyFieldList); } - + if (dropUniqueFieldList.size() > 0) { dropUniqueTableMap.put(table.name(), dropUniqueFieldList); } @@ -375,20 +372,19 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 根据数据库中表的结构和model中表的结构对比找出删除的字段 * * @param removeTableMap + * 用于存需要删除字段的表名+结构 * @param table + * 表 * @param removeFieldList + * 用于存删除的字段 * @param columnNames * 数据库中的结构 * @param fieldMap * model中的字段,字段名为key */ - private void buildRemoveFields( - Map> removeTableMap, - Table table, - List removeFieldList, - List columnNames, - Map fieldMap){ - for (String fieldNm : columnNames){ + private void buildRemoveFields(Map> removeTableMap, Table table, List removeFieldList, + List columnNames, Map fieldMap) { + for (String fieldNm : columnNames) { // 判断该字段在新的model结构中是否存在 if (fieldMap.get(fieldNm) == null) { // 不存在,做删除处理 @@ -404,20 +400,19 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 根据数据库中表的结构和model中表的结构对比找出新增的字段 * * @param addTableMap + * 用于存需要增加字段的表名+结构 * @param table + * 表 * @param newFieldList * model中的结构 * @param addFieldList + * 用于存新增的字段 * @param columnNames * 数据库中的结构 */ - private void buildNewFields( - Map> addTableMap, - Table table, - List newFieldList, - List addFieldList, - List columnNames){ - for (Object obj : newFieldList){ + private void buildNewFields(Map> addTableMap, Table table, List newFieldList, + List addFieldList, List columnNames) { + for (Object obj : newFieldList) { CreateTableParam createTableParam = (CreateTableParam) obj; // 循环新的model中的字段,判断是否在数据库中已经存在 if (!columnNames.contains(createTableParam.getFieldName())) { @@ -438,17 +433,16 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * @param clas * 准备做为创建表依据的class * @param newFieldList + * 用于存新增表的字段 */ - private void tableFieldsConstruct(Map mySqlTypeAndLengthMap,Class clas,List newFieldList){ + private void tableFieldsConstruct(Map mySqlTypeAndLengthMap, Class clas, + List newFieldList) { Field[] fields = clas.getDeclaredFields(); - - // 判断是否有父类,如果有拉取父类的field,这里只支持一层继承 - if(clas.getSuperclass()!=null){ - Class clsSup = clas.getSuperclass(); - fields = (Field[]) ArrayUtils.addAll(fields,clsSup.getDeclaredFields()); - } - - for (Field field : fields){ + + // 判断是否有父类,如果有拉取父类的field,这里只支持多层继承 + fields = recursionParents(clas, fields); + + for (Field field : fields) { // 判断方法中是否有指定注解类型的注解 boolean hasAnnotation = field.isAnnotationPresent(Column.class); if (hasAnnotation) { @@ -459,7 +453,12 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage param.setFieldType(column.type().toLowerCase()); param.setFieldLength(column.length()); param.setFieldDecimalLength(column.decimalLength()); - param.setFieldIsNull(column.isNull()); + // 主键或唯一键时设置必须不为null + if (column.isKey() || column.isUnique()) { + param.setFieldIsNull(false); + } else { + param.setFieldIsNull(column.isNull()); + } param.setFieldIsKey(column.isKey()); param.setFieldIsAutoIncrement(column.isAutoIncrement()); param.setFieldDefaultValue(column.defaultValue()); @@ -471,22 +470,44 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage } } + /** + * 递归扫描父类的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; + } + /** * 根据传入的map创建或修改表结构 * * @param newTableMap + * 用于存需要创建的表名+结构 * @param modifyTableMap + * 用于存需要更新字段类型等的表名+结构 * @param addTableMap + * 用于存需要增加字段的表名+结构 * @param removeTableMap + * 用于存需要删除字段的表名+结构 * @param dropKeyTableMap + * 用于存需要删除主键的表名+结构 + * @param dropUniqueTableMap + * 用于存需要删除唯一约束的表名+结构 */ - private void createOrModifyTableConstruct( - Map> newTableMap, - Map> modifyTableMap, - Map> addTableMap, - Map> removeTableMap, - Map> dropKeyTableMap, - Map> dropUniqueTableMap){ + private void createOrModifyTableConstruct(Map> newTableMap, + Map> modifyTableMap, Map> addTableMap, + Map> removeTableMap, Map> dropKeyTableMap, + Map> dropUniqueTableMap) { // 1. 创建表 createTableByMap(newTableMap); // 2. 删除要变更主键的表的原来的字段的主键 @@ -499,19 +520,20 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage removeFieldsByMap(removeTableMap); // 6. 修改字段类型等 modifyFieldsByMap(modifyTableMap); - + } /** * 根据map结构修改表中的字段类型等 * * @param modifyTableMap + * 用于存需要更新字段类型等的表名+结构 */ - private void modifyFieldsByMap(Map> modifyTableMap){ + private void modifyFieldsByMap(Map> modifyTableMap) { // 做修改字段操作 if (modifyTableMap.size() > 0) { - for (Entry> entry : modifyTableMap.entrySet()){ - for (Object obj : entry.getValue()){ + for (Entry> entry : modifyTableMap.entrySet()) { + for (Object obj : entry.getValue()) { Map map = new HashMap(); map.put(entry.getKey(), obj); CreateTableParam fieldProperties = (CreateTableParam) obj; @@ -527,12 +549,13 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 根据map结构删除表中的字段 * * @param removeTableMap + * 用于存需要删除字段的表名+结构 */ - private void removeFieldsByMap(Map> removeTableMap){ + private void removeFieldsByMap(Map> removeTableMap) { // 做删除字段操作 if (removeTableMap.size() > 0) { - for (Entry> entry : removeTableMap.entrySet()){ - for (Object obj : entry.getValue()){ + for (Entry> entry : removeTableMap.entrySet()) { + for (Object obj : entry.getValue()) { Map map = new HashMap(); map.put(entry.getKey(), obj); String fieldName = (String) obj; @@ -548,12 +571,13 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 根据map结构对表中添加新的字段 * * @param addTableMap + * 用于存需要增加字段的表名+结构 */ - private void addFieldsByMap(Map> addTableMap){ + private void addFieldsByMap(Map> addTableMap) { // 做增加字段操作 if (addTableMap.size() > 0) { - for (Entry> entry : addTableMap.entrySet()){ - for (Object obj : entry.getValue()){ + for (Entry> entry : addTableMap.entrySet()) { + for (Object obj : entry.getValue()) { Map map = new HashMap(); map.put(entry.getKey(), obj); CreateTableParam fieldProperties = (CreateTableParam) obj; @@ -569,12 +593,13 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 根据map结构删除要变更表中字段的主键 * * @param dropKeyTableMap + * 用于存需要删除主键的表名+结构 */ - private void dropFieldsKeyByMap(Map> dropKeyTableMap){ + private void dropFieldsKeyByMap(Map> dropKeyTableMap) { // 先去做删除主键的操作,这步操作必须在增加和修改字段之前! if (dropKeyTableMap.size() > 0) { - for (Entry> entry : dropKeyTableMap.entrySet()){ - for (Object obj : entry.getValue()){ + for (Entry> entry : dropKeyTableMap.entrySet()) { + for (Object obj : entry.getValue()) { Map map = new HashMap(); map.put(entry.getKey(), obj); CreateTableParam fieldProperties = (CreateTableParam) obj; @@ -585,17 +610,18 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage } } } - + /** * 根据map结构删除要变更表中字段的唯一约束 * * @param dropUniqueTableMap + * 用于存需要删除唯一约束的表名+结构 */ - private void dropFieldsUniqueByMap(Map> dropUniqueTableMap){ + private void dropFieldsUniqueByMap(Map> dropUniqueTableMap) { // 先去做删除唯一约束的操作,这步操作必须在增加和修改字段之前! if (dropUniqueTableMap.size() > 0) { - for (Entry> entry : dropUniqueTableMap.entrySet()){ - for (Object obj : entry.getValue()){ + for (Entry> entry : dropUniqueTableMap.entrySet()) { + for (Object obj : entry.getValue()) { Map map = new HashMap(); map.put(entry.getKey(), obj); CreateTableParam fieldProperties = (CreateTableParam) obj; @@ -614,11 +640,12 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 根据map结构创建表 * * @param newTableMap + * 用于存需要创建的表名+结构 */ - private void createTableByMap(Map> newTableMap){ + private void createTableByMap(Map> newTableMap) { // 做创建表操作 if (newTableMap.size() > 0) { - for (Entry> entry : newTableMap.entrySet()){ + for (Entry> entry : newTableMap.entrySet()) { Map> map = new HashMap>(); map.put(entry.getKey(), entry.getValue()); log.info("开始创建表:" + entry.getKey()); @@ -629,16 +656,16 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage } /** - * 获取Mysql的类型,以及类型需要设置几个长度,这里构建成map的样式 构建Map(字段名(小写),需要设置几个长度(0表示不需要设置,1表示需要设置一个,2表示需要设置两个)) + * 获取Mysql的类型,以及类型需要设置几个长度,这里构建成map的样式 + * 构建Map(字段名(小写),需要设置几个长度(0表示不需要设置,1表示需要设置一个,2表示需要设置两个)) */ - public Map mySqlTypeAndLengthMap(){ + public Map mySqlTypeAndLengthMap() { Field[] fields = MySqlTypeConstant.class.getDeclaredFields(); Map map = new HashMap(); - for (Field field : fields){ + for (Field field : fields) { LengthCount lengthCount = field.getAnnotation(LengthCount.class); map.put(field.getName().toLowerCase(), lengthCount.LengthCount()); } return map; } - } diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysOracleCreateTableManager.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysOracleCreateTableManager.java new file mode 100644 index 0000000000000000000000000000000000000000..fccac5fa53ad004249f861b6f6c667456d2addf8 --- /dev/null +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysOracleCreateTableManager.java @@ -0,0 +1,13 @@ +package com.gitee.sunchenbin.mybatis.actable.manager.system; + + +/** + * + * @author sunchenbin + * @version 2016年6月23日 下午6:07:21 + */ +public interface SysOracleCreateTableManager { + + public void createOracleTable(); + +} diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysOracleCreateTableManagerImpl.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysOracleCreateTableManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f4dc3d3d30f4c2840caa60576d722d8424424729 --- /dev/null +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysOracleCreateTableManagerImpl.java @@ -0,0 +1,69 @@ +package com.gitee.sunchenbin.mybatis.actable.manager.system; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang.ArrayUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +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.LengthCount; +import com.gitee.sunchenbin.mybatis.actable.annotation.Table; +import com.gitee.sunchenbin.mybatis.actable.command.CreateTableParam; +import com.gitee.sunchenbin.mybatis.actable.command.SysMysqlColumns; +import com.gitee.sunchenbin.mybatis.actable.constants.OracleTypeConstant; +import com.gitee.sunchenbin.mybatis.actable.dao.system.CreateMysqlTablesMapper; +import com.gitee.sunchenbin.mybatis.actable.utils.ClassTools; + +/** + * 项目启动时自动扫描配置的目录中的model,根据配置的规则自动创建或更新表 + * 该逻辑只适用于mysql,其他数据库尚且需要另外扩展,因为sql的语法不同 + * + * @author sunchenbin + * @version 2016年6月23日 下午5:58:12 + */ +@Transactional +@Service("sysOracleCreateTableManager") +public class SysOracleCreateTableManagerImpl implements SysOracleCreateTableManager{ + + private static final Logger log = LoggerFactory.getLogger(SysOracleCreateTableManagerImpl.class); + + @Autowired + private CreateMysqlTablesMapper createMysqlTablesMapper; + + /** + * 要扫描的model所在的pack + */ + @Value("#{configProperties['mybatis.model.pack']}") + private String pack; + + /** + * 自动创建模式:update表示更新,create表示删除原表重新创建 + */ + @Value("#{configProperties['mybatis.table.auto']}") + private String tableAuto; + + /** + * 读取配置文件的三种状态(创建表、更新表、不做任何事情) + */ + public void createOracleTable(){ + + // 不做任何事情 + if("none".equals(tableAuto)){ + log.info("配置mybatis.table.auto=none,不需要做任何事情"); + return; + } + + // TODO: 暂时还没有写 + } +} diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/mapping/common/BaseMysqlCRUDMapper.xml b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/common/BaseMysqlCRUDMapper.xml similarity index 95% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/mapping/common/BaseMysqlCRUDMapper.xml rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/common/BaseMysqlCRUDMapper.xml index 7dba3c1484219be054ffe14938c294a298e27a4a..b6522630da9f9dba00dc9c0a20f8466594d88922 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/mapping/common/BaseMysqlCRUDMapper.xml +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/mapping/common/BaseMysqlCRUDMapper.xml @@ -1,6 +1,6 @@ - + - select * from information_schema.columns where table_name = #{tableName} diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/utils/ClassTools.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/utils/ClassTools.java similarity index 98% rename from mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/utils/ClassTools.java rename to mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/utils/ClassTools.java index e31c66728df8c4abc69956891ea285372689cf4a..1d59074daa0486c8b9ff911765721c5bc6f5d7db 100644 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/utils/ClassTools.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/utils/ClassTools.java @@ -1,4 +1,4 @@ -package com.mybatis.enhance.store.utils; +package com.gitee.sunchenbin.mybatis.actable.utils; import java.io.File; import java.io.FileFilter; @@ -27,8 +27,8 @@ public class ClassTools{ /** * 从包package中获取所有的Class * - * @param pack - * @return + * @param pack 扫描的包 + * @return 该包下的class */ public static Set> getClasses(String pack){ diff --git a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/mapping/system/CreateMysqlTablesMapper.xml b/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/mapping/system/CreateMysqlTablesMapper.xml deleted file mode 100644 index 1d85149f4ed9d87765d82376e0f9cd2451072a14..0000000000000000000000000000000000000000 --- a/mybatis-enhance-actable/src/main/java/com/mybatis/enhance/store/mapping/system/CreateMysqlTablesMapper.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - `${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 edbb9490b96ef6e97c02a1188427d8a9cf3981bb..e8663e652639b50fa3bdac167d271faed3465cca 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 -Build-Jdk: 1.7.0_21 -Built-By: ubuntu +Built-By: chenbin.sun +Build-Jdk: 1.8.0_91 Created-By: Maven Integration for Eclipse diff --git a/mybatis-enhance-actable/target/classes/META-INF/maven/com.mybatis.enhance.store/mybatis-enhance-actable/pom.properties b/mybatis-enhance-actable/target/classes/META-INF/maven/com.mybatis.enhance.store/mybatis-enhance-actable/pom.properties deleted file mode 100644 index a3f51779afc07eb04b350d4bb72ec9ed9280979f..0000000000000000000000000000000000000000 --- a/mybatis-enhance-actable/target/classes/META-INF/maven/com.mybatis.enhance.store/mybatis-enhance-actable/pom.properties +++ /dev/null @@ -1,7 +0,0 @@ -#Generated by Maven Integration for Eclipse -#Sun Jul 09 16:11:30 CST 2017 -version=0.0.1-SNAPSHOT -groupId=com.mybatis.enhance.store -m2e.projectName=mybatis-enhance-actable -m2e.projectLocation=E\:\\workspace_ACTable\\mybatis-enhance\\mybatis-enhance-actable -artifactId=mybatis-enhance-actable diff --git a/mybatis-enhance-actable/target/classes/META-INF/maven/com.mybatis.enhance.store/mybatis-enhance-actable/pom.xml b/mybatis-enhance-actable/target/classes/META-INF/maven/com.mybatis.enhance.store/mybatis-enhance-actable/pom.xml deleted file mode 100644 index 10c33c01c83080a968a2fabf22ba58ef4f139bcd..0000000000000000000000000000000000000000 --- a/mybatis-enhance-actable/target/classes/META-INF/maven/com.mybatis.enhance.store/mybatis-enhance-actable/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - 4.0.0 - com.mybatis.enhance.store - mybatis-enhance-actable - 0.0.1-SNAPSHOT - - - 4.1.4.RELEASE - - - - - - - org.springframework - spring-context - ${spring.version} - provided - - - - org.springframework - spring-tx - ${spring.version} - provided - - - - org.slf4j - slf4j-api - 1.7.12 - provided - - - - org.mybatis.scripting - mybatis-velocity - 1.2 - provided - - - - - - - src/main/java - - **/*.properties - **/*.xml - - false - - - - - \ No newline at end of file diff --git a/mybatis-enhance-actable/target/classes/com/mybatis/enhance/store/mapping/common/BaseMysqlCRUDMapper.xml b/mybatis-enhance-actable/target/classes/com/mybatis/enhance/store/mapping/common/BaseMysqlCRUDMapper.xml deleted file mode 100644 index 7dba3c1484219be054ffe14938c294a298e27a4a..0000000000000000000000000000000000000000 --- a/mybatis-enhance-actable/target/classes/com/mybatis/enhance/store/mapping/common/BaseMysqlCRUDMapper.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - diff --git "a/mybatis-enhance-actable/\344\275\277\347\224\250\350\257\264\346\230\216.txt" "b/mybatis-enhance-actable/\344\275\277\347\224\250\350\257\264\346\230\216.txt" index 5852a96e133df695c2378e9c77805580b4d18229..03fdfee9a26054155e6d33492bed3f49adf42d01 100644 --- "a/mybatis-enhance-actable/\344\275\277\347\224\250\350\257\264\346\230\216.txt" +++ "b/mybatis-enhance-actable/\344\275\277\347\224\250\350\257\264\346\230\216.txt" @@ -1,13 +1,23 @@ -######### mybatis增加功能自动创建表################ -1. 该版本修复了以往的一些bug,并且增加了对唯一约束的支持 -2. 从原有的框架中剥离出来,支持任意结构的spring+mybatis的框架使用 -3. 再次声明mybatis-enhance-actable-0.0.1-SNAPSHOT目前仅支持mysql数据库 +# mybatis-enhance-actable-0.0.1 -##使用步骤方法 +该项目是从之前写过的一个框架中抽取出来的,本身是对Mybatis做的增强功能,为了能够使习惯了hibernate框架的开发者能够快速的入手Mybatis,我给他取名叫做 “A.C.Table” 本意是自动建表的意思,A.C.Table是一个基于Spring和Mybatis的Maven项目,增强了Mybatis的功能,过配置model注解的方式来创建表,修改表结构,并且实现了共通的CUDR功能提升开发效率,目前仅支持Mysql,后续可能会扩展针对其他数据库的支持。 + +A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下: + + **######### mybatis增加功能自动创建表——A.C.Table版本说明################** +1. 该版本修复了修改主键同时修改其类型引起的error +2. 该版本修复了根据model创建时没有创建父类中的字段的问题(ps:目前只支持扫描一层继承) +3. 该笨笨增加了对唯一约束的支持 +4. 从原有的框架中剥离出来,支持任意结构的spring+mybatis的框架使用 +5. 再次声明A.C.Table目前仅支持mysql数据库 +6. 使用了jdk1.7 + + **使用步骤方法** 1. 使用该功能的项目需要依赖mybatis-enhance-actable-0.0.1-SNAPSHOT.jar 2. 在你的web项目上创建个目录比如config下面创建个文件autoCreateTable.properties文件的内容如下: mybatis.table.auto=update + mybatis.model.pack=com.sunchenbin.store.model 本系统提供三种模式: @@ -22,7 +32,7 @@ 3. spring的配置文件中需要做如下配置: - + @@ -37,8 +47,8 @@ - 1. classpath*:com/mybatis/enhance/store/mapping/*/*.xml - 2. com.mybatis.enhance.store.dao.* + 1. classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml + 2. com.gitee.sunchenbin.mybatis.actable.dao.* 举例这两个配置配置的详细位置 @@ -49,7 +59,7 @@ classpath*:com/sunchenbin/store/mapping/*/*.xml - classpath*:com/mybatis/enhance/store/mapping/*/*.xml + classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml @@ -57,18 +67,94 @@ - + -##代码用途讲解 +**代码用途讲解** + + 1.SysMysqlColumns.java这个对象里面配置的是mysql的数据类型,这里配置的类型越多,意味着创建表时能使用的类型越多 + + 2.LengthCount.java是一个自定义的注解,用于标记在SysMysqlColumns.java里面配置的数据类型上的,标记该类型需要设置几个长度,如datetime/varchar(1)/decimal(5,2),分别是需要设置0个1个2个 + + 3.Column.java也是一个自定义的注解,用于标记model中的字段上,作为创建表的依据如不标记,不会被扫描到,有几个属性用来设置字段名、字段类型、长度等属性的设置,详细请看代码上的注释 + + 4.Table.java也是一个自定义的注解,用于标记在model对象上,有一个属性name,用于设置该model生成表后的表名,如不设置该注解,则该model不会被扫描到 + + 5.系统启动后会去自动调用SysMysqlCreateTableManagerImpl.java的createMysqlTable()方法,没错,这就是核心方法了,负责创建、删除、修改表。 + + **model的写法例子** +``` +@Table(name = "test") +public class Test extends BaseModel{ -1.SysMysqlColumns.java这个对象里面配置的是mysql的数据类型,这里配置的类型越多,意味着创建表时能使用的类型越多 + private static final long serialVersionUID = 5199200306752426433L; -2.LengthCount.java是一个自定义的注解,用于标记在SysMysqlColumns.java里面配置的数据类型上的,标记该类型需要设置几个长度,如datetime/varchar(1)/decimal(5,2),分别是需要设置0个1个2个 + @Column(name = "id",type = MySqlTypeConstant.INT,length = 11,isKey = true,isAutoIncrement = true) + private Integer id; -3.Column.java也是一个自定义的注解,用于标记model中的字段上,作为创建表的依据如不标记,不会被扫描到,有几个属性用来设置字段名、字段类型、长度等属性的设置,详细请看代码上的注释 + @Column(name = "name",type = MySqlTypeConstant.VARCHAR,length = 111) + private String name; -4.Table.java也是一个自定义的注解,用于标记在model对象上,有一个属性name,用于设置该model生成表后的表名,如不设置该注解,则该model不会被扫描到 + @Column(name = "description",type = MySqlTypeConstant.TEXT) + private String description; -ok,系统启动后会去自动调用SysMysqlCreateTableManagerImpl.java的createMysqlTable()方法,没错,这就是核心方法了,负责创建、删除、修改表。 \ No newline at end of file + @Column(name = "create_time",type = MySqlTypeConstant.DATETIME) + private Date create_time; + + @Column(name = "update_time",type = MySqlTypeConstant.DATETIME) + private Date update_time; + + @Column(name = "number",type = MySqlTypeConstant.BIGINT,length = 5,isUnique=true) + private Long number; + + @Column(name = "lifecycle",type = MySqlTypeConstant.CHAR,length = 1,isNull=false) + private String lifecycle; + + @Column(name = "dekes",type = MySqlTypeConstant.DOUBLE,length = 5,decimalLength = 2) + private Double dekes; + + // get和set方法这里就不例举了太多 +} +``` + **共通的CUDR功能使用** + + 1.使用方法很简单,大家在manager或者Controller中直接注入BaseMysqlCRUDManager这个接口就可以了 + + 2.注意:接口调用save、delete等方法时传入的对象必须是modle中用于创建表的对象 +代码事例: +``` +@Controller +public class TestController{ + + @Autowired + private TestManager testManager; + + @Autowired + private BaseMysqlCRUDManager baseMysqlCRUDManager; + + /** + * 首页 + */ + @RequestMapping("/testDate") + @ResponseBody + public String testDate(){ + Test2 test2 = new Test2(); + test2.setNumber(3L); + baseMysqlCRUDManager.save(test2); + + Test test = new Test(); + test.setName("aaae333"); + test.setNumber(9L); + test.setDescription("adfsdfe"); + + baseMysqlCRUDManager.delete(test); + baseMysqlCRUDManager.save(test); + int count = testManager.findTestCount(); + System.out.println(count); + List query = baseMysqlCRUDManager.query(test); + String json = JsonUtil.format(query); + return json; + } +} +```