Skip to content

Commit 900ab64

Browse files
committed
更新文档,重点强调@Transient注解
1 parent 5c312c3 commit 900ab64

File tree

3 files changed

+124
-0
lines changed

3 files changed

+124
-0
lines changed

src/main/java/tk/mybatis/mapper/mapperhelper/SqlHelper.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,49 @@ public static String getDynamicTableName(Class<?> entityClass, String tableName,
5555
}
5656
}
5757

58+
/**
59+
* <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
60+
*
61+
* @param column
62+
* @return
63+
*/
64+
public static String getBindCache(EntityColumn column) {
65+
StringBuilder sql = new StringBuilder();
66+
sql.append("<bind name=\"");
67+
sql.append(column.getProperty()).append("_cache\" ");
68+
sql.append("value=\"").append(column.getProperty()).append("\"/>");
69+
return sql.toString();
70+
}
71+
72+
/**
73+
* <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
74+
*
75+
* @param column
76+
* @return
77+
*/
78+
public static String getBindValue(EntityColumn column, String value) {
79+
StringBuilder sql = new StringBuilder();
80+
sql.append("<bind name=\"");
81+
sql.append(column.getProperty()).append("_bind\" ");
82+
sql.append("value=\"").append(value).append("\"/>");
83+
return sql.toString();
84+
}
85+
86+
/**
87+
* <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
88+
*
89+
* @param column
90+
* @return
91+
*/
92+
public static String getIfCacheNotNull(EntityColumn column, String contents) {
93+
StringBuilder sql = new StringBuilder();
94+
sql.append("<if test=\"").append(column.getProperty()).append("_cache != null\">");
95+
sql.append(contents);
96+
sql.append("</if>");
97+
return sql.toString();
98+
}
99+
100+
58101
/**
59102
* 判断自动!=null的条件结构
60103
*

src/main/java/tk/mybatis/mapper/provider/base/BaseInsertProvider.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,81 @@ public BaseInsertProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
4747
super(mapperClass, mapperHelper);
4848
}
4949

50+
/*
51+
public SqlNode insert(MappedStatement ms) {
52+
Class<?> entityClass = getEntityClass(ms);
53+
StringBuilder sql = new StringBuilder();
54+
//获取全部列
55+
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
56+
//Identity列只能有一个
57+
Boolean hasIdentityKey = false;
58+
//处理所有的主键策略
59+
for (EntityColumn column : columnList) {
60+
//序列的情况,直接写入sql中,不需要额外的获取值
61+
if (StringUtil.isNotEmpty(column.getSequenceName())) {
62+
} else if (column.isIdentity()) {
63+
//这种情况下,如果原先的字段有值,需要先缓存起来,否则就一定会使用自动增长
64+
//这是一个bind节点
65+
sql.append(SqlHelper.getBindCache(column));
66+
//如果是Identity列,就需要插入selectKey
67+
//如果已经存在Identity列,抛出异常
68+
if (hasIdentityKey) {
69+
//jdbc类型只需要添加一次
70+
if (column.getGenerator() != null && column.getGenerator().equals("JDBC")) {
71+
continue;
72+
}
73+
throw new RuntimeException(ms.getId() + "对应的实体类" + entityClass.getCanonicalName() + "中包含多个MySql的自动增长列,最多只能有一个!");
74+
}
75+
//插入selectKey
76+
newSelectKeyMappedStatement(ms, column);
77+
hasIdentityKey = true;
78+
} else if (column.isUuid()) {
79+
//uuid的情况,直接插入bind节点
80+
sql.append(SqlHelper.getBindValue(column, getUUID()));
81+
}
82+
}
83+
sql.append("INSERT INTO ");
84+
sql.append(SqlHelper.getDynamicTableName(entityClass, tableName(entityClass)));
85+
sql.append("(");
86+
if(sql.charAt(sql.length() - 1) == ','){
87+
sql.setCharAt(sql.length() - 1, ')');
88+
} else {
89+
90+
}
91+
//插入全部的(列名,列名...)
92+
sql.append("(").append(EntityHelper.getAllColumns(entityClass)).append(")");
93+
sql.append(" VALUES (");
94+
List<SqlNode> ifNodes = new ArrayList<SqlNode>();
95+
//处理所有的values(属性值,属性值...)
96+
for (EntityColumn column : columnList) {
97+
//优先使用传入的属性值,当原属性property!=null时,用原属性
98+
//自增的情况下,如果默认有值,就会备份到property_cache中,所以这里需要先判断备份的值是否存在
99+
if (column.isIdentity()) {
100+
sql.append(SqlHelper.getIfCacheNotNull(column, "#{" + column.getProperty() + "_cache },"));
101+
} else {
102+
//其他情况值仍然存在原property中
103+
sql.append(SqlHelper.getIfNotNull(column, column.getColumnHolder(), isNotEmpty())).append(",");
104+
}
105+
//当属性为null时,如果存在主键策略,会自动获取值,如果不存在,则使用null
106+
//序列的情况
107+
if (StringUtil.isNotEmpty(column.getSequenceName())) {
108+
sql.append(SqlHelper.getIfNotNull(column, column.getColumnHolder(), isNotEmpty())).append(",");
109+
ifNodes.add(getIfIsNull(column, new StaticTextSqlNode(getSeqNextVal(column) + " ,")));
110+
} else if (column.isIdentity()) {
111+
ifNodes.add(getIfCacheIsNull(column, new StaticTextSqlNode(column.getColumnHolder() + ",")));
112+
} else if (column.isUuid()) {
113+
ifNodes.add(getIfIsNull(column, new StaticTextSqlNode("#{" + column.getProperty() + "_bind },")));
114+
} else {
115+
//当null的时候,如果不指定jdbcType,oracle可能会报异常,指定VARCHAR不影响其他
116+
ifNodes.add(getIfIsNull(column, new StaticTextSqlNode(column.getColumnHolder() + ",")));
117+
}
118+
}
119+
//values(#{property},#{property}...)
120+
sqlNodes.add(new TrimSqlNode(ms.getConfiguration(), new MixedSqlNode(ifNodes), "VALUES (", null, ")", ","));
121+
return new MixedSqlNode(sqlNodes);
122+
}
123+
*/
124+
50125
/**
51126
* 插入全部
52127
*

wiki/mapper3/3.Use.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ public interface UserInfoMapper extends Mapper<UserInfo> {
4848

4949
通过[使用Mapper专用的MyBatis生成器插件](http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/7.UseMBG.md)可以直接生成符合要求带注解的实体类。
5050

51+
52+
###重点强调`@Transient`注解
53+
54+
许多人由于不仔细看文档,频繁在这个问题上出错。
55+
56+
如果你的实体类中包含了不是数据库表中的字段,你需要给这个字段加上`@Transient`注解,这样通用Mapper在处理单表操作时就不会将标注的属性当成表字段处理!
5157
<br><br><br><br>
5258

5359
<br><br><br><br>

0 commit comments

Comments
 (0)