jiapeng 7 years ago
parent
commit
d2e055a366

+ 2 - 0
jfwAptOrm/src/main/java/org/jfw/apt/orm/DataAccessObjectHandler.java

@ -18,6 +18,7 @@ import org.jfw.apt.orm.daoHandler.DeleteBatchHandler;
18 18
import org.jfw.apt.orm.daoHandler.DeleteHandler;
19 19
import org.jfw.apt.orm.daoHandler.DeleteWithBatchHandler;
20 20
import org.jfw.apt.orm.daoHandler.DeleteWithHandler;
21
import org.jfw.apt.orm.daoHandler.InsertAndGenKeyHandler;
21 22
import org.jfw.apt.orm.daoHandler.InsertBatchHandler;
22 23
import org.jfw.apt.orm.daoHandler.InsertHandler;
23 24
import org.jfw.apt.orm.daoHandler.OracleLimitQueryHandler;
@ -162,6 +163,7 @@ public class DataAccessObjectHandler extends CodeGenHandler {
162 163
		supportedClass.add(PostgreSQLLimitSelectHandler.class);
163 164
		supportedClass.add(OracleLimitQueryHandler.class);
164 165
		supportedClass.add(OracleLimitSelectHandler.class);
166
		supportedClass.add(InsertAndGenKeyHandler.class);
165 167
		
166 168
167 169
	}

+ 13 - 0
jfwAptOrm/src/main/java/org/jfw/apt/orm/annotation/dao/method/operator/InsertAndGenKey.java

@ -0,0 +1,13 @@
1
package org.jfw.apt.orm.annotation.dao.method.operator;
2

3
import java.lang.annotation.ElementType;
4
import java.lang.annotation.Retention;
5
import java.lang.annotation.RetentionPolicy;
6
import java.lang.annotation.Target;
7

8
@Target(ElementType.METHOD)
9
@Retention(RetentionPolicy.SOURCE)
10
public @interface InsertAndGenKey {
11
	String value();
12
	boolean isLong() default true;
13
}

+ 5 - 1
jfwAptOrm/src/main/java/org/jfw/apt/orm/core/enums/DE.java

@ -6,6 +6,8 @@ import org.jfw.apt.orm.core.defaultImpl.*;
6 6
public enum DE {
7 7
	invalid_de(AbstractColumnHandler.class, null, false,false,false, false, null, null),
8 8
9
10
	
9 11
	boolean_de(BooleanHandler.class, "CHAR(1)",false,true,true,true,null,null),
10 12
	Boolean_de(WBooleanHandler.class, "CHAR(1)", true,true,true,true,null,null),
11 13
	
@ -86,8 +88,10 @@ public enum DE {
86 88
	DoubleChar(FixLenStringHandler.class,"CHAR(2)",true,true,true,true,null,null),
87 89
	
88 90
	md5_de(FixLenStringHandler.class,"CHAR(32)",false,true,true,true,null,null),
89
	Md5_de(FixLenStringHandler.class,"CHAR(32)",true,true,true,true,null,null)	
91
	Md5_de(FixLenStringHandler.class,"CHAR(32)",true,true,true,true,null,null)	,
90 92
	
93
	bigSerial(LongHandler.class,"bigserial",false,false,false,true,null,null),
94
	serial(IntHandler.class,"serial",false,false,false,true,null,null)
91 95
92 96
	;
93 97

+ 171 - 0
jfwAptOrm/src/main/java/org/jfw/apt/orm/daoHandler/InsertAndGenKeyHandler.java

@ -0,0 +1,171 @@
1
package org.jfw.apt.orm.daoHandler;
2

3
import java.util.ArrayList;
4
import java.util.LinkedList;
5
import java.util.List;
6
import java.util.ListIterator;
7

8
import javax.lang.model.element.Element;
9

10
import org.jfw.apt.exception.AptException;
11
import org.jfw.apt.orm.annotation.dao.method.operator.InsertAndGenKey;
12
import org.jfw.apt.orm.core.ColumnHandlerFactory;
13
import org.jfw.apt.orm.core.ColumnWriterCache;
14
import org.jfw.apt.orm.core.model.CalcColumn;
15
import org.jfw.apt.orm.core.model.Column;
16
import org.jfw.apt.orm.core.model.DataEntry;
17
import org.jfw.apt.orm.core.model.DataEntryFactory;
18
import org.jfw.apt.orm.core.model.Table;
19

20
public class InsertAndGenKeyHandler extends BaseDaoHandler {
21
	protected List<ColumnWriterCache> sqlparams = new ArrayList<ColumnWriterCache>();
22
	protected Table fromTable;
23
	private boolean isLong = false;
24
	private String keyName;
25

26
	protected boolean doReplaceSource;
27

28
	@Override
29
	protected void prepare() throws AptException {
30
		this.sqlparams.clear();
31
	}
32

33
	@Override
34
	protected void writeMethodContent() throws AptException {
35
		this.prepareTable();
36
		this.prepareSqlParams();
37
		this.prepareSQL();
38

39
		if (this.doReplaceSource) {
40
			cw.l("try{");
41
		}
42
		cw.bL("java.sql.PreparedStatement ps = con.prepareStatement(sql");
43
		cw.el(",1);");
44
		cw.l("try{");
45

46
		this.handleSqlParameters();
47
		cw.l("ps.executeUpdate();");
48
		String rsname = cw.getMethodTempVarName();
49
		cw.bL("java.sql.ResultSet ").w(rsname).el(" =  ps.getGeneratedKeys();");
50
		cw.l("try{");
51
		cw.bL("if(").w(rsname).el(".next()){");
52
		cw.bL("return ").w(rsname).w(".get").w(this.isLong ? "Long" : "Int").w("(\"").w(this.keyName).el("\");");
53
		cw.l("}else{");
54
		cw.l("return -1;").l("}");
55
		cw.l("}finally{").writeClosing(rsname).l("}");
56
		cw.l("}finally{").writeClosing("ps").l("}");
57
		if (this.doReplaceSource) {
58
			cw.l("}finally{");
59
			this.replaceResource();
60
			cw.l("}");
61
		}
62

63
	}
64

65
	protected void handleSqlParameters() throws AptException {
66
		for (ListIterator<ColumnWriterCache> it = this.sqlparams.listIterator(); it.hasNext();) {
67
			it.next().writeValue();
68
		}
69
	}
70

71
	protected void prepareTable() throws AptException {
72
		String entryJavaName = null;
73
			if (this.me.getParams().size() != 2)
74
				throw new AptException(ref, "method paramters size must be 2 and the second paramter with @" + Table.class.getName());
75
			entryJavaName = this.me.getParams().get(1).getTypeName();
76
				this.fromTable = (Table) DataEntryFactory.get(entryJavaName, DataEntry.TABLE);
77
		if (null == this.fromTable)
78
			throw new AptException(ref, "class[" + entryJavaName + "] not with @" + org.jfw.apt.orm.annotation.entry.Table.class.getName());
79

80
	}
81

82

83

84
	@Override
85
	protected void checkJdbc() throws AptException {
86
		super.checkJdbc();
87
		InsertAndGenKey ing = this.ref.getAnnotation(InsertAndGenKey.class);
88
		this.isLong = ing.isLong();
89
		this.keyName = ing.value();
90
		String rt = this.me.getReturnType();
91
		if(isLong){
92
			if (!"long".equals(rt))
93
				throw new AptException(ref, "mehtod must return long");
94
		}else{
95
			if (!"int".equals(rt))
96
				throw new AptException(ref, "mehtod must return int");
97
	}}
98

99
	protected void replaceResource() {
100
		for (ColumnWriterCache cwc : this.sqlparams) {
101
			if (cwc.isReplaceResource())
102
				cwc.replaceResource();
103
		}
104

105
	}
106

107

108

109
	@Override
110
	public boolean match(Element ele) {
111
		return null != ele.getAnnotation(InsertAndGenKey.class);
112
	}
113

114
	protected void prepareSqlParams() {
115
		this.doReplaceSource = false;
116
		String pn = this.me.getParams().get(1).getName();
117
		LinkedList<Column> list = new LinkedList<Column>();
118
		for (ListIterator<CalcColumn> it = this.fromTable.getAllColumn().listIterator(); it.hasNext();) {
119
			Column col = (Column) it.next();
120
			if (col.isInsertable()) {
121
				if (null == col.getFixSqlValueWithInsert()) {
122
					list.add(col);
123
				} else {
124
					list.add(0, col);
125
				}
126
			}
127
		}
128

129
		cw.bL("String sql=\"INSERT INTO ").w(this.fromTable.getFromSentence()).w(" (");
130

131
		boolean first = true;
132
		for (ListIterator<Column> it = list.listIterator(); it.hasNext();) {
133
			if (first)
134
				first = false;
135
			else
136
				cw.w(",");
137
			Column col = it.next();
138
			cw.w(col.getSqlName());
139
		}
140
		cw.w(") VALUES (");
141
		first = true;
142
		for (ListIterator<Column> it = list.listIterator(); it.hasNext();) {
143
			if (first)
144
				first = false;
145
			else
146
				cw.w(",");
147
			Column col = it.next();
148
			if (null == col.getFixSqlValueWithInsert()) {
149
				cw.w("?");
150
				ColumnWriterCache cwc = ColumnWriterCache.build(pn + "." + col.getGetter() + "()", true, col.isNullable(), cw,
151
						ColumnHandlerFactory.get(col.getHandlerClass()));
152
				cwc.setDynamic(false);
153
				if (cwc.isReplaceResource())
154
					this.doReplaceSource = true;
155
				cwc.setDynamic(false);
156
				this.sqlparams.add(cwc);
157
			} else {
158
				cw.ws(col.getFixSqlValueWithInsert());
159
			}
160
		}
161
		cw.el(")\";");
162

163
		for (ColumnWriterCache cwc : this.sqlparams) {
164
			cwc.prepare();
165
		}
166

167
	}
168

169
	protected void prepareSQL() {
170
	}
171
}