diff --git a/pom.xml b/pom.xml index e6509a3..fdfd55d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 xin.xihc spring-jba - 1.7.8-SNAPSHOT + 1.7.8 spring-jba JavaBean Access(Java对象访问),简易ORM操作mysql数据库,1.7.0+不向下兼容,请知悉 https://gitee.com/leo_xi/spring-jba diff --git a/src/main/java/xin/xihc/jba/db/DB_MySql_Opera.java b/src/main/java/xin/xihc/jba/db/DB_MySql_Opera.java index dfce7cc..293d296 100644 --- a/src/main/java/xin/xihc/jba/db/DB_MySql_Opera.java +++ b/src/main/java/xin/xihc/jba/db/DB_MySql_Opera.java @@ -31,37 +31,42 @@ public class DB_MySql_Opera implements I_TableOperation { /** - * @OnUpdateCurrentTimestamp注解适用的类型 + * .@OnUpdateCurrentTimestamp注解适用的类型 */ - public static final LinkedList onUpdateApplied = new LinkedList<>(); + public static final LinkedList ON_UPDATE_APPLIED = new LinkedList<>(); /** java类型- mySQL类型 对应map */ - private static Map javaClassToMysqlFieldName = new HashMap<>(); + private static Map JAVA_CLASS_TO_MYSQL_FIELDNAME = new HashMap<>(); + + /** char的最长的长度,超过后字段类型为varchar */ + private static final int CHAR_MAX_LENGTH = 64; + /** varchar的最长的长度,超过字段类型为text */ + private static final int VARCHAR_MAX_LENGTH = 20000; static { - // javaClassToMysqlFieldName.put(byte.class, "tinyint"); - javaClassToMysqlFieldName.put(Byte.class, "tinyint"); - // javaClassToMysqlFieldName.put(short.class, "smallint"); - javaClassToMysqlFieldName.put(Short.class, "smallint"); - // javaClassToMysqlFieldName.put(int.class, "int"); - javaClassToMysqlFieldName.put(Integer.class, "int"); - // javaClassToMysqlFieldName.put(long.class, "bigint"); - javaClassToMysqlFieldName.put(Long.class, "bigint"); - // javaClassToMysqlFieldName.put(String.class, "varchar"); // String为默认,不需要加上 - // javaClassToMysqlFieldName.put(double.class, "double"); - javaClassToMysqlFieldName.put(Double.class, "double"); - // javaClassToMysqlFieldName.put(float.class, "double"); - javaClassToMysqlFieldName.put(Float.class, "double"); - javaClassToMysqlFieldName.put(BigDecimal.class, "decimal"); - javaClassToMysqlFieldName.put(java.util.Date.class, "datetime"); - javaClassToMysqlFieldName.put(java.sql.Timestamp.class, "timestamp"); - javaClassToMysqlFieldName.put(java.sql.Date.class, "date"); - javaClassToMysqlFieldName.put(java.sql.Time.class, "time"); - // javaClassToMysqlFieldName.put(boolean.class, "tinyint"); - javaClassToMysqlFieldName.put(Boolean.class, "tinyint"); - - onUpdateApplied.add(Date.class); - onUpdateApplied.add(Timestamp.class); + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(byte.class, "tinyint"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(Byte.class, "tinyint"); + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(short.class, "smallint"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(Short.class, "smallint"); + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(int.class, "int"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(Integer.class, "int"); + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(long.class, "bigint"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(Long.class, "bigint"); + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(String.class, "varchar"); // String为默认,不需要加上 + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(double.class, "double"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(Double.class, "double"); + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(float.class, "double"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(Float.class, "double"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(BigDecimal.class, "decimal"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(java.util.Date.class, "datetime"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(java.sql.Timestamp.class, "timestamp"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(java.sql.Date.class, "date"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(java.sql.Time.class, "time"); + // JAVA_CLASS_TO_MYSQL_FIELDNAME.put(boolean.class, "tinyint"); + JAVA_CLASS_TO_MYSQL_FIELDNAME.put(Boolean.class, "tinyint"); + + ON_UPDATE_APPLIED.add(Date.class); + ON_UPDATE_APPLIED.add(Timestamp.class); } /** 数据库schema */ @@ -127,12 +132,11 @@ public void createTable(TableProperties tbl) { * 根据数据库列类型返回java数据类型 * * @param dataType 列类型 - * @return */ private Class getClassByColumnDataType(String dataType) { - Set keySet = javaClassToMysqlFieldName.keySet(); + Set keySet = JAVA_CLASS_TO_MYSQL_FIELDNAME.keySet(); for (Class key : keySet) { - if (javaClassToMysqlFieldName.get(key).equals(dataType)) { + if (JAVA_CLASS_TO_MYSQL_FIELDNAME.get(key).equals(dataType)) { return key; } } @@ -143,7 +147,6 @@ private Class getClassByColumnDataType(String dataType) { * 将表中列的属性转为ColumnProperties * * @param dbColumns 表的列属性列表 - * @return */ private List convert2ColumnProperties(List dbColumns) { if (dbColumns.size() < 1) { @@ -181,7 +184,7 @@ private List convert2ColumnProperties(List db } // 是否自动更新时间戳 if ("on update CURRENT_TIMESTAMP".equalsIgnoreCase(item.getExtra())) { - prop.onUpdateCurrentTimestamp(onUpdateApplied.contains(prop.type())); + prop.onUpdateCurrentTimestamp(ON_UPDATE_APPLIED.contains(prop.type())); } result.add(prop); } @@ -211,8 +214,8 @@ public void updateTable(TableProperties tbl) { if (find.isPresent()) { ColumnProperties dbCol = find.get(); existsColumnsName.add(dbCol.colName()); - if (!Objects.equals(javaClassToMysqlFieldName.get(col.type()), - javaClassToMysqlFieldName.get(dbCol.type())) || !dbCol.equals(col)) {// 如果对应的数据库字段类型不一样 + if (!Objects.equals(JAVA_CLASS_TO_MYSQL_FIELDNAME.get(col.type()), + JAVA_CLASS_TO_MYSQL_FIELDNAME.get(dbCol.type())) || !dbCol.equals(col)) {// 如果对应的数据库字段类型不一样 sqls.add("MODIFY " + columnPro(col, after, false, dbCol)); } existsColumnsName.add(dbCol.colName()); @@ -270,16 +273,16 @@ private boolean needPrecision(Class clazz) { private String columnPro(ColumnProperties col, String after, boolean isCreate, ColumnProperties dbCol) { StringBuilder temp = new StringBuilder(); temp.append(col.colName() + " "); - if (javaClassToMysqlFieldName.containsKey(col.type())) { - temp.append(javaClassToMysqlFieldName.get(col.type())); + if (JAVA_CLASS_TO_MYSQL_FIELDNAME.containsKey(col.type())) { + temp.append(JAVA_CLASS_TO_MYSQL_FIELDNAME.get(col.type())); if (needPrecision(col.type())) { // 需要精度的 temp.append("(" + col.length() + "," + col.precision() + ")"); } } else { - if (CommonUtil.isNotNullEmpty(col.length()) && col.length() > 20000) { + if (CommonUtil.isNotNullEmpty(col.length()) && col.length() > VARCHAR_MAX_LENGTH) { temp.append("text BINARY"); } else { - if (col.length() > 0 && col.length() <= 32) { + if (col.length() > 0 && col.length() <= CHAR_MAX_LENGTH) { temp.append("char(" + col.length() + ") BINARY"); } else { temp.append("varchar(" + col.length() + ") BINARY"); @@ -323,7 +326,7 @@ private String columnPro(ColumnProperties col, String after, boolean isCreate, C } // 是否自动更新时间戳 - if (onUpdateApplied.contains(col.type()) && col.onUpdateCurrentTimestamp()) { + if (ON_UPDATE_APPLIED.contains(col.type()) && col.onUpdateCurrentTimestamp()) { temp.append(" ON UPDATE CURRENT_TIMESTAMP "); } diff --git a/src/main/java/xin/xihc/jba/scan/TableManager.java b/src/main/java/xin/xihc/jba/scan/TableManager.java index dded09c..75c6f75 100644 --- a/src/main/java/xin/xihc/jba/scan/TableManager.java +++ b/src/main/java/xin/xihc/jba/scan/TableManager.java @@ -226,7 +226,7 @@ static void scanFieldAnnotations(TableProperties tblProp, Field field) { // 是否自动更新时间戳 OnUpdateCurrentTimestamp onUpdateCurrentTimestamp = field.getAnnotation(OnUpdateCurrentTimestamp.class); if (null != onUpdateCurrentTimestamp) { - colP.onUpdateCurrentTimestamp(DB_MySql_Opera.onUpdateApplied.contains(field.getType())); + colP.onUpdateCurrentTimestamp(DB_MySql_Opera.ON_UPDATE_APPLIED.contains(field.getType())); } // 添加到缓存