2929import java .util .Iterator ;
3030import java .util .List ;
3131import java .util .Map ;
32+ import java .util .stream .Collectors ;
3233
3334/**
3435 * Reason:
@@ -56,23 +57,15 @@ public void buildSql(String scheam, String tableName, List<String> fields) {
5657 }
5758
5859 private void buildInsertSql (String scheam , String tableName , List <String > fields ) {
59-
60- tableName = DtStringUtil .getTableFullPath (scheam ,tableName );
61-
62- String sqlTmp = "insert into " + tableName + " (${fields}) values (${placeholder})" ;
63-
64- List <String > adaptFields = Lists .newArrayList ();
65- fields .forEach (field -> adaptFields .add (DtStringUtil .addQuoteForStr (field )));
66-
67- String fieldsStr = StringUtils .join (adaptFields , "," );
68- String placeholder = "" ;
69-
70- for (String fieldName : fields ) {
71- placeholder += ",?" ;
72- }
73- placeholder = placeholder .replaceFirst ("," , "" );
74- sqlTmp = sqlTmp .replace ("${fields}" , fieldsStr ).replace ("${placeholder}" , placeholder );
75- this .sql = sqlTmp ;
60+ tableName = DtStringUtil .getTableFullPath (scheam , tableName );
61+ String columns = fields .stream ()
62+ .map (this ::quoteIdentifier )
63+ .collect (Collectors .joining (", " ));
64+
65+ String placeholders = fields .stream ()
66+ .map (f -> "?" )
67+ .collect (Collectors .joining (", " ));
68+ this .sql = "INSERT INTO " + tableName + "(" + columns + ")" + " VALUES (" + placeholders + ")" ;
7669 }
7770
7871 /**
@@ -94,7 +87,8 @@ public String buildUpdateSql(String scheam, String tableName, List<String> field
9487 + updateKeySql (realIndexes ) + ") " );
9588
9689
97- String updateSql = getUpdateSql (fieldNames , fullField , "T1" , "T2" , keyColList (realIndexes ));
90+ String updateSql1 = buildUpdateSqlForAllValue (fieldNames , fullField , "T1" , "T2" , keyColList (realIndexes ));
91+ String updateSql = buildUpdateSqlForNotnullValue (fieldNames , fullField , "T1" , "T2" , keyColList (realIndexes ));
9892
9993 if (StringUtils .isNotEmpty (updateSql )) {
10094 sb .append (" WHEN MATCHED THEN UPDATE SET " );
@@ -149,24 +143,47 @@ protected List<String> keyColList(Map<String, List<String>> realIndexes) {
149143 * @param indexCols index column
150144 * @return
151145 */
152- public String getUpdateSql (List <String > updateColumn , List <String > fullColumn , String leftTable , String rightTable , List <String > indexCols ) {
146+ public String buildUpdateSqlForAllValue (List <String > updateColumn , List <String > fullColumn , String leftTable , String rightTable , List <String > indexCols ) {
153147 String prefixLeft = StringUtils .isBlank (leftTable ) ? "" : DtStringUtil .addQuoteForStr (leftTable ) + "." ;
154148 String prefixRight = StringUtils .isBlank (rightTable ) ? "" : DtStringUtil .addQuoteForStr (rightTable ) + "." ;
155- List <String > list = new ArrayList <>();
156- for (String col : fullColumn ) {
157- // filter index column
158- if (indexCols == null || indexCols .size () == 0 || containsIgnoreCase (indexCols ,col )) {
159- continue ;
160- }
161- if (containsIgnoreCase (updateColumn ,col )) {
162- list .add (prefixLeft + DtStringUtil .addQuoteForStr (col ) + "=" + prefixRight + DtStringUtil .addQuoteForStr (col ));
149+
150+ String sql = fullColumn .stream ().filter (col -> {
151+ return !(indexCols == null || indexCols .size () == 0 || containsIgnoreCase (indexCols , col ));
152+ }).map (col -> {
153+ String leftCol = prefixLeft + DtStringUtil .addQuoteForStr (col );
154+ String rightCol = prefixRight + DtStringUtil .addQuoteForStr (col );
155+
156+ if (containsIgnoreCase (updateColumn , col )) {
157+ return (leftCol + "=" + rightCol );
163158 } else {
164- list . add ( prefixLeft + DtStringUtil . addQuoteForStr ( col ) + "=null" );
159+ return ( leftCol + "=null" );
165160 }
166- }
167- return StringUtils .join (list , "," );
161+ }).collect (Collectors .joining ("," ));
162+
163+ return sql ;
168164 }
169165
166+ public String buildUpdateSqlForNotnullValue (List <String > updateColumn , List <String > fullColumn , String leftTable , String rightTable , List <String > indexCols ) {
167+ String prefixLeft = StringUtils .isBlank (leftTable ) ? "" : DtStringUtil .addQuoteForStr (leftTable ) + "." ;
168+ String prefixRight = StringUtils .isBlank (rightTable ) ? "" : DtStringUtil .addQuoteForStr (rightTable ) + "." ;
169+
170+ String sql = fullColumn .stream ().filter (col -> {
171+ return !(indexCols == null || indexCols .size () == 0 || containsIgnoreCase (indexCols , col ));
172+ }).map (col -> {
173+ String leftCol = prefixLeft + DtStringUtil .addQuoteForStr (col );
174+ String rightCol = prefixRight + DtStringUtil .addQuoteForStr (col );
175+
176+ if (containsIgnoreCase (updateColumn , col )) {
177+ return leftCol + "= nvl(" + rightCol + "," + leftCol + ")" ;
178+ }
179+ return "" ;
180+ }).collect (Collectors .joining ("," ));
181+
182+ return sql ;
183+ }
184+
185+
186+
170187
171188 /**
172189 * build connect sql by index column, such as T1."A"=T2."A"
@@ -212,6 +229,8 @@ public boolean containsIgnoreCase(List<String> l, String s) {
212229 return false ;
213230 }
214231
215-
232+ public String quoteIdentifier (String identifier ) {
233+ return "\" " + identifier + "\" " ;
234+ }
216235
217236}
0 commit comments