瀏覽代碼

增加#TableField(el = "")表达式,当该Field为对象时, 可使用#{对象.属性}来映射到数据表

junyu_shi 8 年之前
父節點
當前提交
2cb966b5c3

+ 7 - 2
mybatis-plus/src/main/java/com/baomidou/mybatisplus/annotations/TableField.java

@@ -25,8 +25,8 @@ import java.lang.annotation.Target;
  * 表字段标识
  * </p>
  * 
- * @author hubin
- * @Date 2016-01-23
+ * @author hubin sjy
+ * @Date 2016-09-09
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
@@ -47,4 +47,9 @@ public @interface TableField {
 	 * 
 	 */
 	boolean exist() default true;
+
+	/**
+	 * 当该Field为类对象时, 可使用#{对象.属性}来映射到数据表.
+	 */
+	String el() default "";
 }

+ 9 - 12
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/AutoSqlInjector.java

@@ -44,8 +44,8 @@ import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
  * SQL 自动注入器
  * </p>
  * 
- * @author hubin
- * @Date 2016-01-23
+ * @author hubin sjy
+ * @Date 2016-09-09
  */
 public class AutoSqlInjector implements ISqlInjector {
 	protected static final Logger logger = Logger.getLogger("AutoSqlInjector");
@@ -178,7 +178,7 @@ public class AutoSqlInjector implements ISqlInjector {
 				placeholderBuilder.append("\n\t<if test=\"").append(fieldInfo.getProperty()).append("!=null\">");
 			}
 			fieldBuilder.append(fieldInfo.getColumn()).append(",");
-			placeholderBuilder.append("#{").append(fieldInfo.getProperty()).append("},");
+			placeholderBuilder.append("#{").append(fieldInfo.getEl()).append("},");
 			if (selective) {
 				fieldBuilder.append("</if>");
 				placeholderBuilder.append("</if>");
@@ -228,7 +228,7 @@ public class AutoSqlInjector implements ISqlInjector {
 		List<TableFieldInfo> fieldList = table.getFieldList();
 		for (TableFieldInfo fieldInfo : fieldList) {
 			fieldBuilder.append(fieldInfo.getColumn()).append(",");
-			placeholderBuilder.append("#{item.").append(fieldInfo.getProperty()).append("},");
+			placeholderBuilder.append("#{item.").append(fieldInfo.getEl()).append("},");
 		}
 		fieldBuilder.append("\n</trim>");
 		placeholderBuilder.append("\n</trim>");
@@ -260,7 +260,6 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * </p>
 	 * 
 	 * @param mapperClass
-	 * @param modelClass
 	 * @param table
 	 */
 	protected void injectDeleteByMapSql(Class<?> mapperClass, TableInfo table) {
@@ -339,7 +338,7 @@ public class AutoSqlInjector implements ISqlInjector {
 			sqlMethod = SqlMethod.UPDATE_BATCH_BY_ID_ORACLE;
 			List<TableFieldInfo> fieldList = table.getFieldList();
 			for (TableFieldInfo fieldInfo : fieldList) {
-				set.append(fieldInfo.getColumn()).append("=#{item.").append(fieldInfo.getProperty()).append("},");
+				set.append(fieldInfo.getColumn()).append("=#{item.").append(fieldInfo.getEl()).append("},");
 			}
 		} else if (DBType.MYSQL == dbType) {
 			List<TableFieldInfo> fieldList = table.getFieldList();
@@ -349,7 +348,7 @@ public class AutoSqlInjector implements ISqlInjector {
 				set.append("\n<foreach collection=\"list\" item=\"i\" index=\"index\">");
 				set.append("\n<if test=\"i.").append(fieldInfo.getProperty()).append("!=null\">");
 				set.append("\nWHEN ").append("#{i.").append(table.getKeyProperty());
-				set.append("} THEN #{i.").append(fieldInfo.getProperty()).append("}");
+				set.append("} THEN #{i.").append(fieldInfo.getEl()).append("}");
 				set.append("\n</if>");
 				set.append("\n</foreach>");
 				set.append("\n</trim>");			
@@ -434,7 +433,6 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * 注入实体查询一条记录 SQL 语句
 	 * </p>
 	 * 
-	 * @param sqlMethod
 	 * @param mapperClass
 	 * @param modelClass
 	 * @param table
@@ -451,7 +449,6 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * 注入实体查询总记录数 SQL 语句
 	 * </p>
 	 * 
-	 * @param sqlMethod
 	 * @param mapperClass
 	 * @param modelClass
 	 * @param table
@@ -482,7 +479,7 @@ public class AutoSqlInjector implements ISqlInjector {
 		List<TableFieldInfo> fieldList = table.getFieldList();
 		for (TableFieldInfo fieldInfo : fieldList) {
 			where.append("\n<if test=\"ew.entity.").append(fieldInfo.getProperty()).append("!=null\">\n");
-			where.append(" AND ").append(fieldInfo.getColumn()).append("=#{ew.entity.").append(fieldInfo.getProperty()).append("}");
+			where.append(" AND ").append(fieldInfo.getColumn()).append("=#{ew.entity.").append(fieldInfo.getEl()).append("}");
 			where.append("\n</if>");
 		}
 		where.append("\n</where>\n</if>");
@@ -511,7 +508,7 @@ public class AutoSqlInjector implements ISqlInjector {
 			if ( selective ) {
 				set.append("\n<if test=\"et.").append(fieldInfo.getProperty()).append("!=null\">\n");
 			}
-			set.append(fieldInfo.getColumn()).append("=#{et.").append(fieldInfo.getProperty()).append("},");
+			set.append(fieldInfo.getColumn()).append("=#{et.").append(fieldInfo.getEl()).append("},");
 			if ( selective ) {
 				set.append("\n</if>");
 			}
@@ -595,7 +592,7 @@ public class AutoSqlInjector implements ISqlInjector {
 		List<TableFieldInfo> fieldList = table.getFieldList();
 		for (TableFieldInfo fieldInfo : fieldList) {
 			where.append("\n<if test=\"ew.").append(fieldInfo.getProperty()).append("!=null\">\n");
-			where.append(" AND ").append(fieldInfo.getColumn()).append("=#{ew.").append(fieldInfo.getProperty()).append("}");
+			where.append(" AND ").append(fieldInfo.getColumn()).append("=#{ew.").append(fieldInfo.getEl()).append("}");
 			where.append("\n</if>");
 		}
 		where.append("\n</where>");

+ 23 - 2
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/TableFieldInfo.java

@@ -20,8 +20,8 @@ package com.baomidou.mybatisplus.toolkit;
  * 数据库表字段反射信息
  * </p>
  *
- * @author hubin
- * @Date 2016-02-29
+ * @author hubin sjy
+ * @Date 2016-09-09
  */
 public class TableFieldInfo {
 
@@ -43,11 +43,24 @@ public class TableFieldInfo {
 	 */
 	private String property;
 
+	/**
+	 * 属性表达式#{property}, 可以指定jdbcType, typeHandler等
+	 */
+	private String el;
+
+	public TableFieldInfo(boolean related, String column, String property, String el) {
+		this.related = related;
+		this.column = column;
+		this.property = property;
+		this.el = el;
+	}
+
 
 	public TableFieldInfo( boolean related, String column, String property ) {
 		this.related = related;
 		this.column = DBKeywordsProcessor.convert(column);
 		this.property = property;
+		this.el = property;
 	}
 
 
@@ -55,6 +68,7 @@ public class TableFieldInfo {
 		this.related = false;
 		this.column = DBKeywordsProcessor.convert(column);
 		this.property = column;
+		this.el = column;
 	}
 
 
@@ -87,4 +101,11 @@ public class TableFieldInfo {
 		this.property = property;
 	}
 
+	public String getEl() {
+		return el;
+	}
+
+	public void setEl(String el) {
+		this.el = el;
+	}
 }

+ 21 - 5
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/TableInfoHelper.java

@@ -34,8 +34,8 @@ import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
  * 实体类反射表辅助类
  * </p>
  * 
- * @author hubin
- * @Date 2016-01-23
+ * @author hubin sjy
+ * @Date 2016-09-09
  */
 public class TableInfoHelper {
 
@@ -116,13 +116,29 @@ public class TableInfoHelper {
 
 			/* 获取注解属性,自定义字段 */
 			TableField tableField = field.getAnnotation(TableField.class);
-			if (tableField != null && StringUtils.isNotEmpty(tableField.value())) {
-				fieldList.add(new TableFieldInfo(true, tableField.value(), field.getName()));
+			if (tableField != null) {
+				String columnName = field.getName();
+				if (StringUtils.isNotEmpty(tableField.value())) {
+					columnName = tableField.value();
+				}
+				// iTODO 是否能再加点其他判断, 保证传入参数格式正确
+				String el = field.getName();
+				if (StringUtils.isNotEmpty(tableField.el())) {
+					el = tableField.el();
+				}
+
+				// iTODO 可以传入多个参数以逗号分开
+				String[] columns = columnName.split(",");
+				String[] els = el.split(",");
+				for (int i = 0; i < columns.length; i++) {
+					fieldList.add(new TableFieldInfo(true, columns[i], field.getName(), els[i]));
+				}
+
 				continue;
 			}
 
 			/**
-			 * 字段
+			 * 字段, 使用camelToUnderline转换驼峰写法为下划线分割法, 如果已制定TableField, 便不会执行这里
 			 */
 			if (MybatisConfiguration.DB_COLUMN_UNDERLINE) {
 				/* 开启字段下划线申明 */

+ 22 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/UserMapperTest.java

@@ -21,6 +21,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.baomidou.mybatisplus.test.mysql.entity.Role;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 
@@ -91,10 +92,30 @@ public class UserMapperTest {
         System.err.println(" debug run 查询执行 user 表数据变化! ");
         userMapper.deleteAll();
 
+        /**
+         * sjy
+         * 测试@TableField的el属性
+         */
+        Role role = new Role();
+        role.setId(IdWorker.getId());
+        role.setName("admin");
+
+        User userA = new User();
+        userA.setId(IdWorker.getId());
+        userA.setName("junyu_shi");
+        userA.setRole(role);
+
+        int rlt = userMapper.insert(userA);
+        User whereUser = userMapper.selectOne(userA);
+        userA.setAge(18);
+        userMapper.updateById(userA);
+        userMapper.deleteSelective(userA);
+        System.err.println("--------- @TableField el() --------- " + rlt);
+
         /**
          * 注解插件测试
          */
-        int rlt = userMapper.insertInjector(new User(1L, "1", 1, 1));
+        rlt = userMapper.insertInjector(new User(1L, "1", 1, 1));
         System.err.println("--------- insertInjector --------- " + rlt);
 
         /**

+ 67 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/entity/Role.java

@@ -0,0 +1,67 @@
+package com.baomidou.mybatisplus.test.mysql.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 测试角色类
+ *
+ * @author springwind
+ * @Date 2016-09-09
+ */
+@TableName(value = "role")
+public class Role implements Serializable {
+
+	@TableField(exist = false)
+	private static final long serialVersionUID = 1L;
+
+	/** 主键 */
+	@TableId
+	private Long id;
+
+	/** 角色 */
+	private String name;
+
+	/** 排序 */
+	private Integer sort;
+
+	/** 描述 */
+	private String description;
+
+	public Long getId() {
+		return this.id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getSort() {
+		return this.sort;
+	}
+
+	public void setSort(Integer sort) {
+		this.sort = sort;
+	}
+
+	public String getDescription() {
+		return this.description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+}

+ 13 - 2
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/entity/User.java

@@ -27,8 +27,8 @@ import com.baomidou.mybatisplus.annotations.TableName;
  * 测试用户类
  * </p>
  * 
- * @author hubin
- * @Date 2016-01-23
+ * @author hubin sjy
+ * @Date 2016-09-09
  */
 /* 表名 value 注解【 驼峰命名可无 】, resultMap 注解测试【 映射 xml 的 resultMap 内容 】 */
 @TableName(resultMap = "userMap")
@@ -50,6 +50,9 @@ public class User implements Serializable {
 	@TableField(value = "test_type")
 	private Integer testType;
 
+	@TableField(value = "roleId,roleName", el = "role.id,role.name")
+	private Role role;
+
 	public User() {
 
 	}
@@ -122,6 +125,14 @@ public class User implements Serializable {
 		this.testType = testType;
 	}
 
+	public Role getRole() {
+		return role;
+	}
+
+	public void setRole(Role role) {
+		this.role = role;
+	}
+
 	/**
 	 * 测试类型
 	 */