反射+注释,根据实体类对象生成SQL语句工具类

最近在写一个公司内部项目,由于觉得配置Hibernate过于繁琐,索性使用了spring的jdbc,可是又要写很多的sql语句,为了偷偷懒,于是就写个能通过实体类对象生成SQL语句的工具类。

目前只在MySql数据库上实验通过,其他数据库未测试。

本工具类还有很多不足之处,不过好在可以满足自己一些简单的日常使用。

上代码了。

字段类型:

1 package net.tjnwdseip.util;
2    
3 public enum FieldType {
4    
5      STRING,NUMBER,DATE
6 }
字段注释:
01 package net.tjnwdseip.util;
02    
03 import java.lang.annotation.Documented;
04 import java.lang.annotation.ElementType;
05 import java.lang.annotation.Retention;
06 import java.lang.annotation.RetentionPolicy;
07 import java.lang.annotation.Target;
08    
09 @Documented
10 @Retention (RetentionPolicy.RUNTIME)
11 @Target (ElementType.FIELD)
12 public <A class =referer href= "http://my.oschina.net/interface" target=_blank> @interface </A>  FieldAnnotation {
13    
14      String fieldName();
15        
16      FieldType fieldType();
17        
18      boolean pk();
19 }
表名注释:
01 package net.tjnwdseip.util;
02    
03 import java.lang.annotation.Documented;
04 import java.lang.annotation.ElementType;
05 import java.lang.annotation.Retention;
06 import java.lang.annotation.RetentionPolicy;
07 import java.lang.annotation.Target;
08    
09 @Documented
10 @Retention (RetentionPolicy.RUNTIME)
11 @Target (ElementType.TYPE)
12 public <A class =referer href= "http://my.oschina.net/interface" target=_blank> @interface </A>  TableAnnotation {
13    
14      String tableName();
15 }
SQL语句生成工具类:
001 package net.tjnwdseip.util;
002    
003 import java.lang.reflect.Field;
004 import java.lang.reflect.InvocationTargetException;
005 import java.lang.reflect.Method;
006 import java.util.ArrayList;
007 import java.util.HashMap;
008 import java.util.Iterator;
009 import java.util.List;
010    
011 /**
012  
013   * @ClassName: CreateSqlTools
014   * @Description: TODO(根据实体类对象生成SQL语句)
015   * <A class=referer href="http://my.oschina.net/arthor" target=_blank>@author</A>  LiYang
016   * @date 2012-5-4 下午10:07:03
017  
018   */
019 public class CreateSqlTools {
020    
021      /**
022      
023       * @Title: getTableName
024       * @Description: TODO(获取表名)
025       * @param @param obj
026       * @param @return 设定文件
027       * @return String 返回类型
028       * @throws
029       */
030      private static String getTableName(Object obj) {
031          String tableName = null ;
032          if (obj.getClass().isAnnotationPresent(TableAnnotation. class )) {
033              tableName = obj.getClass().getAnnotation(TableAnnotation. class )
034                      .tableName();
035          }
036          return tableName;
037      }
038    
039      /**
040      
041       * @Title: getAnnoFieldList
042       * @Description: TODO(获取所有有注释的字段,支持多重继承)
043       * @param @param obj
044       * @param @return 设定文件
045       * @return List<Field> 返回类型
046       * @throws
047       */
048      @SuppressWarnings ( "rawtypes" )
049      private static List<Field> getAnnoFieldList(Object obj) {
050          List<Field> list = new ArrayList<Field>();
051          Class superClass = obj.getClass().getSuperclass();
052          while ( true ) {
053              if (superClass != null ) {
054                  Field[] superFields = superClass.getDeclaredFields();
055                  if (superFields != null && superFields.length > 0 ) {
056                      for (Field field : superFields) {
057                          if (field.isAnnotationPresent(FieldAnnotation. class )) {
058                              list.add(field);
059                          }
060                      }
061                  }
062                  superClass = superClass.getSuperclass();
063              } else {
064                  break ;
065              }
066          }
067          Field[] objFields = obj.getClass().getDeclaredFields();
068          if (objFields != null && objFields.length > 0 ) {
069              for (Field field : objFields) {
070                  if (field.isAnnotationPresent(FieldAnnotation. class )) {
071                      list.add(field);
072                  }
073              }
074          }
075          return list;
076      }
077    
078      /**
079      
080       * @Title: getFieldValue
081       * @Description: TODO(获取字段的值,支持多重继承)
082       * @param @param obj
083       * @param @param field
084       * @param @return 设定文件
085       * @return String 返回类型
086       * @throws
087       */
088      @SuppressWarnings ({ "rawtypes" })
089      private static String getFieldValue(Object obj, Field field) {
090          String value = null ;
091          String name = field.getName();
092          String methodName = "get" + name.substring( 0 , 1 ).toUpperCase()
093                  + name.substring( 1 );
094          Method method = null ;
095          Object methodValue = null ;
096          try {
097              method = obj.getClass().getMethod(methodName);
098          } catch (NoSuchMethodException | SecurityException e1) {
099              // TODO Auto-generated catch block
100          }
101          if (method != null ) {
102              try {
103                  methodValue = method.invoke(obj);
104              } catch (IllegalAccessException | IllegalArgumentException
105                      | InvocationTargetException e) {
106                  // TODO Auto-generated catch block
107              }
108              if (methodValue != null ) {
109                  value = methodValue.toString();
110              } else {
111                  Class objSuperClass = obj.getClass().getSuperclass();
112                  while ( true ) {
113                      if (objSuperClass != null ) {
114                          try {
115                              methodValue = method.invoke(objSuperClass);
116                          } catch (IllegalAccessException
117                                  | IllegalArgumentException
118                                  | InvocationTargetException e) {
119                              // TODO Auto-generated catch block
120                          }
121                          if (methodValue != null ) {
122                              value = methodValue.toString();
123                              break ;
124                          } else {
125                              objSuperClass = objSuperClass.getSuperclass();
126                          }
127                      } else {
128                          break ;
129                      }
130                  }
131              }
132          }
133          return value;
134      }
135    
136      /**
137      
138       * @Title: getInsertSql
139       * @Description: TODO(根据实体类对象字段的值生成INSERT SQL语句,可选固定参数)
140       * @param @param obj
141       * @param @param fixedParams
142       *        固定参数(如该参数与实体类中有相同的字段,则忽略实体类中的对应字段,HashMap<String
143       *        ,String>,key=指定字段名,value=对应字段的值)
144       * @param @return 设定文件
145       * @return String 返回类型
146       * @throws
147       */
148      public static String getInsertSql(Object obj,
149              HashMap<String, String> fixedParams) {
150          String insertSql = null ;
151          String tableName = getTableName(obj);
152          if (tableName != null ) {
153              StringBuffer sqlStr = new StringBuffer( "INSERT INTO " );
154              StringBuffer valueStr = new StringBuffer( " VALUES (" );
155              List<Field> annoFieldList = getAnnoFieldList(obj);
156              if (annoFieldList != null && annoFieldList.size() > 0 ) {
157                  sqlStr.append(tableName + " (" );
158                  if (fixedParams != null && fixedParams.size() > 0 ) {
159                      Iterator<String> keyNames = fixedParams.keySet().iterator();
160                      while (keyNames.hasNext()) {
161                          String keyName = (String) keyNames.next();
162                          sqlStr.append(keyName + "," );
163                          valueStr.append(fixedParams.get(keyName) + "," );
164                      }
165                  }
166                  for (Field field : annoFieldList) {
167                      FieldAnnotation anno = field
168                              .getAnnotation(FieldAnnotation. class );
169                      if (!anno.pk()) {
170                          Object fieldValue = getFieldValue(obj, field);
171                          if (fieldValue != null ) {
172                              if (fixedParams != null && fixedParams.size() > 0 ) {
173                                  Iterator<String> keyNames = fixedParams
174                                          .keySet().iterator();
175                                  boolean nextFieldFlag = false ;
176                                  while (keyNames.hasNext()) {
177                                      String keyName = (String) keyNames.next();
178                                      if (anno.fieldName().equals(keyName)) {
179                                          nextFieldFlag = true ;
180                                          break ;
181                                      }
182                                  }
183                                  if (nextFieldFlag) {
184                                      break ;
185                                  }
186                              }
187                              sqlStr.append(anno.fieldName() + "," );
188                              switch (anno.fieldType()) {
189                              case NUMBER:
190                                  valueStr.append(fieldValue + "," );
191                                  break ;
192                              default :
193                                  valueStr.append( "'" + fieldValue + "'," );
194                                  break ;
195                              }
196                          }
197                      }
198                  }
199                  insertSql = sqlStr.toString().substring( 0 , sqlStr.length() - 1 )
200                          + ")"
201                          + valueStr.toString().substring( 0 ,
202                                  valueStr.length() - 1 ) + ")" ;
203              }
204          }
205          return insertSql;
206      }
207    
208      /**
209      
210       * @Title: getInsertSql
211       * @Description: TODO(根据实体类对象字段的值生成INSERT SQL语句)
212       * @param @param obj
213       * @param @return 设定文件
214       * @return String 返回类型
215       * @throws
216       */
217      public static String getInsertSql(Object obj) {
218          return getInsertSql(obj, null );
219      }
220    
221      /**
222      
223       * @Title: getUpdateSql
224       * @Description: TODO(根据实体类对象字段的值生成UPDATE SQL语句,可选更新条件为主键,可选固定更新参数)
225       * @param @param obj
226       * @param @param reqPk 是否指定更新条件为主键(true=是,false=否)
227       * @param @param fixedParams
228       *        固定参数(如该参数与实体类中有相同的字段,则忽略实体类中的对应字段,HashMap<String
229       *        ,String>,key=指定字段名,value=对应字段的值)
230       * @param @return 设定文件
231       * @return String 返回类型
232       * @throws
233       */
234      public static String getUpdateSql(Object obj, boolean reqPk,
235              HashMap<String, String> fixedParams) {
236          String updateSql = null ;
237          String tableName = getTableName(obj);
238          if (tableName != null ) {
239              List<Field> annoFieldList = getAnnoFieldList(obj);
240              if (annoFieldList != null && annoFieldList.size() > 0 ) {
241                  StringBuffer sqlStr = new StringBuffer( "UPDATE " + tableName);
242                  StringBuffer valueStr = new StringBuffer( " SET " );
243                  String whereStr = " WHERE " ;
244                  if (fixedParams != null && fixedParams.size() > 0 ) {
245                      Iterator<String> keyNames = fixedParams.keySet().iterator();
246                      while (keyNames.hasNext()) {
247                          String keyName = (String) keyNames.next();
248                          valueStr.append(keyName + "="
249                                  + fixedParams.get(keyName) + "," );
250                      }
251                  }
252                  for (Field field : annoFieldList) {
253                      String fieldValue = getFieldValue(obj, field);
254                      if (fieldValue != null ) {
255                          FieldAnnotation anno = field
256                                  .getAnnotation(FieldAnnotation. class );
257                          if (!anno.pk()) {
258                              if (fixedParams != null && fixedParams.size() > 0 ) {
259                                  boolean nextFieldFlag = false ;
260                                  Iterator<String> keyNames = fixedParams
261                                          .keySet().iterator();
262                                  while (keyNames.hasNext()) {
263                                      String keyName = (String) keyNames.next();
264                                      if (anno.fieldName().equals(keyName)) {
265                                          nextFieldFlag = true ;
266                                          break ;
267                                      }
268                                  }
269                                  if (nextFieldFlag) {
270                                      break ;
271                                  }
272                              }
273                              valueStr.append(anno.fieldName() + "=" );
274                              switch (anno.fieldType()) {
275                              case NUMBER:
276                                  valueStr.append(fieldValue + "," );
277                                  break ;
278                              default :
279                                  valueStr.append( "'" + fieldValue + "'," );
280                                  break ;
281                              }
282                          } else {
283                              if (reqPk) {
284                                  whereStr += anno.fieldName() + "=" + fieldValue;
285                              }
286                          }
287                      }
288                  }
289                  updateSql = sqlStr.toString()
290                          + valueStr.toString().substring( 0 ,
291                                  valueStr.length() - 1 )
292                          + (reqPk ? whereStr : "" );
293              }
294          }
295          return updateSql;
296      }
297    
298      /**
299      
300       * @Title: getUpdateSql
301       * @Description: TODO(根据实体类对象字段的值生成UPDATE SQL语句,无条件)
302       * @param @param obj
303       * @param @return 设定文件
304       * @return String 返回类型
305       * @throws
306       */
307      public static String getUpdateSql(Object obj) {
308          return getUpdateSql(obj, false , null );
309      }
310    
311      /**
312      
313       * @Title: getUpdateSql
314       * @Description: TODO(根据实体类对象字段的值生成UPDATE SQL语句,可选更新条件为主键)
315       * @param @param obj
316       * @param @param reqPk 是否指定更新条件为主键(true=是,false=否)
317       * @param @return 设定文件
318       * @return String 返回类型
319       * @throws
320       */
321      public static String getUpdateSql(Object obj, boolean reqPk) {
322          return getUpdateSql(obj, reqPk, null );
323      }
324    
325      /**
326      
327       * @Title: getDeleteSql
328       * @Description: TODO(根据实体类对象字段的值生成有条件的DELETE
329       *               SQL语句,可选主键为删除条件或使用各个字段的值为条件,多个条件用AND连接)
330       * @param @param obj
331       * @param @param reqPk 是否指定更新条件为主键(true=是,false=否)
332       * @param @return 设定文件
333       * @return String 返回类型
334       * @throws
335       */
336      public static String getDeleteSql(Object obj, boolean reqPk) {
337          String deleteSql = null ;
338          String tableName = getTableName(obj);
339          if (tableName != null ) {
340              StringBuffer delSqlBuffer = new StringBuffer( "DELETE FROM " );
341              List<Field> annoFieldList = getAnnoFieldList(obj);
342              if (annoFieldList != null && annoFieldList.size() > 0 ) {
343                  delSqlBuffer.append(tableName + " WHERE " );
344                  for (Field field : annoFieldList) {
345                      if (reqPk) {
346                          FieldAnnotation anno = field
347                                  .getAnnotation(FieldAnnotation. class );
348                          if (anno.pk()) {
349                              String fieldValue = getFieldValue(obj, field);
350                              delSqlBuffer.append(anno.fieldName() + "=" );
351                              switch (anno.fieldType()) {
352                              case NUMBER:
353                                  delSqlBuffer.append(fieldValue);
354                                  break ;
355                              default :
356                                  delSqlBuffer.append( "'" + fieldValue + "'" );
357                                  break ;
358                              }
359                              break ;
360                          }
361                      } else {
362                          String fieldValue = getFieldValue(obj, field);
363                          if (fieldValue != null ) {
364                              FieldAnnotation anno = field
365                                      .getAnnotation(FieldAnnotation. class );
366                              delSqlBuffer.append(anno.fieldName() + "=" );
367                              switch (anno.fieldType()) {
368                              case NUMBER:
369                                  delSqlBuffer.append(fieldValue + " AND " );
370                                  break ;
371                              default :
372                                  delSqlBuffer
373                                          .append( "'" + fieldValue + "' AND " );
374                                  break ;
375                              }
376                          }
377                      }
378                  }
379                  if (reqPk) {
380                      deleteSql = delSqlBuffer.toString();
381                  } else {
382                      deleteSql = delSqlBuffer.toString().substring( 0 ,
383                              delSqlBuffer.length() - 5 );
384                  }
385              }
386          }
387          return deleteSql;
388      }
389    
390      /**
391      
392       * @Title: getDeleteSql
393       * @Description: TODO(根据实体类对象字段的值生成有条件的DELETE SQL语句,使用各个字段的值为条件,多个条件用AND连接)
394       * @param @param obj
395       * @param @return 设定文件
396       * @return String 返回类型
397       * @throws
398       */
399      public static String getDeleteSql(Object obj) {
400          return getDeleteSql(obj, false );
401      }
402    
403      /**
404      
405       * @Title: getSelectAllSql
406       * @Description: TODO(根据实体类对象字段的值生成SELECT SQL语句,无查询条件)
407       * @param @param obj
408       * @param @return 设定文件
409       * @return String 返回类型
410       * @throws
411       */
412      public static String getSelectAllSql(Object obj) {
413          String selectSql = null ;
414          String tableName = getTableName(obj);
415          if (tableName != null ) {
416              StringBuffer selectBuffer = new StringBuffer( "SELECT " );
417              List<Field> annoFieldList = getAnnoFieldList(obj);
418              if (annoFieldList != null && annoFieldList.size() > 0 ) {
419                  for (Field field : annoFieldList) {
420                      FieldAnnotation anno = field
421                              .getAnnotation(FieldAnnotation. class );
422                      selectBuffer.append(anno.fieldName() + "," );
423                  }
424                  selectSql = selectBuffer.toString().substring( 0 ,
425                          selectBuffer.length() - 1 )
426                          + " FROM " + tableName;
427              }
428          }
429          return selectSql;
430      }
431 }
实体类注释写法:
01 package net.tjnwdseip.entity;
02    
03 import java.sql.Timestamp;
04    
05 import net.tjnwdseip.util.FieldAnnotation;
06 import net.tjnwdseip.util.FieldType;
07    
08 public class BaseEntity {
09    
10      @FieldAnnotation (fieldName= "id" ,fieldType=FieldType.NUMBER,pk= true )
11      private Integer id;
12        
13      @FieldAnnotation (fieldName= "createDate" ,fieldType=FieldType.DATE, pk = false )
14      private Timestamp createDate;
15        
16      @FieldAnnotation (fieldName= "modifyDate" ,fieldType=FieldType.DATE, pk = false )
17      private Timestamp modifyDate;
18    
19      public Integer getId() {
20          return id;
21      }
22    
23      public void setId(Integer id) {
24          this .id = id;
25      }
26    
27      public Timestamp getCreateDate() {
28          return createDate;
29      }
30    
31      public void setCreateDate(Timestamp createDate) {
32          this .createDate = createDate;
33      }
34    
35      public Timestamp getModifyDate() {
36          return modifyDate;
37      }
38    
39      public void setModifyDate(Timestamp modifyDate) {
40          this .modifyDate = modifyDate;
41      }
42    
43      public BaseEntity(Integer id, Timestamp createDate, Timestamp modifyDate) {
44          super ();
45          this .id = id;
46          this .createDate = createDate;
47          this .modifyDate = modifyDate;
48      }
49    
50      public BaseEntity() {
51          super ();
52      }
53 }
01 package net.tjnwdseip.entity;
02    
03 import java.sql.Timestamp;
04    
05 import net.tjnwdseip.util.FieldAnnotation;
06 import net.tjnwdseip.util.FieldType;
07 import net.tjnwdseip.util.TableAnnotation;
08 /**
09  
10   * @ClassName: SysNetProxyCfg 
11   * @Description: TODO(网络代理设置) 
12   * <A class=referer href="http://my.oschina.net/arthor" target=_blank>@author</A>  LiYang 
13   * @date 2012-5-2 下午4:13:08 
14   *
15   */
16 @TableAnnotation (tableName= "sysNetProxyCfg" )
17 public class SysNetProxyCfg extends BaseEntity {
18    
19      @FieldAnnotation (fieldName = "name" , fieldType = FieldType.STRING, pk = false )
20      private String name;
21        
22      @FieldAnnotation (fieldName = "type" , fieldType = FieldType.STRING, pk = false )
23      private String type;
24        
25      @FieldAnnotation (fieldName = "proxyHostIp" , fieldType = FieldType.STRING, pk = false )
26      private String proxyHostIp;
27        
28      @FieldAnnotation (fieldName = "proxyPort" , fieldType = FieldType.NUMBER, pk = false )
29      private Integer proxyPort;
30    
31      public String getName() {
32          return name;
33      }
34    
35      public void setName(String name) {
36          this .name = name;
37      }
38    
39      public String getType() {
40          return type;
41      }
42    
43      public void setType(String type) {
44          this .type = type;
45      }
46    
47      public String getProxyHostIp() {
48          return proxyHostIp;
49      }
50    
51      public void setProxyHostIp(String proxyHostIp) {
52          this .proxyHostIp = proxyHostIp;
53      }
54    
55      public Integer getProxyPort() {
56          return proxyPort;
57      }
58    
59      public void setProxyPort(Integer proxyPort) {
60          this .proxyPort = proxyPort;
61      }
62    
63      public SysNetProxyCfg(Integer id, Timestamp createDate,
64              Timestamp modifyDate, String name, String type, String proxyHostIp,
65              Integer proxyPort) {
66          super (id, createDate, modifyDate);
67          this .name = name;
68          this .type = type;
69          this .proxyHostIp = proxyHostIp;
70          this .proxyPort = proxyPort;
71      }
72    
73      public SysNetProxyCfg() {
74          super ();
75      }
76 }
测试类:
01 package net.tjnwdseip.demo;
02    
03 import java.sql.Timestamp;
04 import java.util.HashMap;
05    
06 import net.tjnwdseip.entity.SysNetProxyCfg;
07 import net.tjnwdseip.util.CreateSqlTools;
08    
09 public class DemoTest {
10    
11        
12      public static void main(String[] args) {
13          // TODO Auto-generated method stub
14          SysNetProxyCfg netProxyCfg = new SysNetProxyCfg( 1 , Timestamp.valueOf( "2012-05-04 14:45:35" ), null , "netProxyCfgName" , "netProxyCfgType" , "000.000.000.000" , 0 );
15          HashMap<String, String> fixedParams= new HashMap<String,String>();
16          fixedParams.put( "createDate" , "NOW()" );
17          fixedParams.put( "modifyDate" , "NOW()" );
18          System.out.println(CreateSqlTools.getDeleteSql(netProxyCfg));
19          System.out.println(CreateSqlTools.getDeleteSql(netProxyCfg, true ));
20          System.out.println(CreateSqlTools.getInsertSql(netProxyCfg));
21          System.out.println(CreateSqlTools.getInsertSql(netProxyCfg, fixedParams));
22          System.out.println(CreateSqlTools.getSelectAllSql(netProxyCfg));
23          System.out.println(CreateSqlTools.getUpdateSql(netProxyCfg));
24          System.out.println(CreateSqlTools.getUpdateSql(netProxyCfg, true ));
25          System.out.println(CreateSqlTools.getUpdateSql(netProxyCfg, true , fixedParams));
26      }
27    
28 }
测试结果:
1 DELETE FROM sysNetProxyCfg WHERE id=1 AND createDate= '2012-05-04 14:45:35.0' AND name = 'netProxyCfgName' AND type= 'netProxyCfgType' AND proxyHostIp= '000.000.000.000' AND proxyPort=0
2 DELETE FROM sysNetProxyCfg WHERE id=1
3 INSERT INTO sysNetProxyCfg (createDate, name ,type,proxyHostIp,proxyPort) VALUES ( '2012-05-04 14:45:35.0' , 'netProxyCfgName' , 'netProxyCfgType' , '000.000.000.000' ,0)
4 INSERT INTO sysNetProxyCfg (modifyDate,createDate) VALUES (NOW(),NOW())
5 SELECT id,createDate,modifyDate, name ,type,proxyHostIp,proxyPort FROM sysNetProxyCfg
6 UPDATE sysNetProxyCfg SET createDate= '2012-05-04 14:45:35.0' , name = 'netProxyCfgName' ,type= 'netProxyCfgType' ,proxyHostIp= '000.000.000.000' ,proxyPort=0
7 UPDATE sysNetProxyCfg SET createDate= '2012-05-04 14:45:35.0' , name = 'netProxyCfgName' ,type= 'netProxyCfgType' ,proxyHostIp= '000.000.000.000' ,proxyPort=0 WHERE id=1
8 UPDATE sysNetProxyCfg SET modifyDate=NOW(),createDate=NOW() WHERE id=1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是实现代码,包括生成insert语句和对应的单元测试案例: ```java import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class GenerateInsertSql { /** * 传入数据对象列表,生成对应的数据库insert语句 * * @param dataList 数据对象列表 * @return insert语句列表 */ public static List<String> generateInsertSql(List<Object> dataList) { List<String> sqlList = new ArrayList<>(); // insert语句列表 if (dataList == null || dataList.isEmpty()) { return sqlList; } Class<?> clazz = dataList.get(0).getClass(); // 获取数据对象的类 String tableName = getTableName(clazz); // 获取表名 Field[] fields = clazz.getDeclaredFields(); // 获取类的所有字段 StringBuilder fieldBuilder = new StringBuilder(); // 字段拼接 StringBuilder valueBuilder = new StringBuilder(); // 值拼接 for (Field field : fields) { if (field.isAnnotationPresent(javax.persistence.Column.class)) { javax.persistence.Column column = field.getAnnotation(javax.persistence.Column.class); String columnName = column.name(); // 获取字段对应的数据库列名 fieldBuilder.append(columnName).append(","); // 拼接字段 valueBuilder.append("?").append(","); // 拼接占位符 } } fieldBuilder.deleteCharAt(fieldBuilder.length() - 1); // 删除最后一个逗号 valueBuilder.deleteCharAt(valueBuilder.length() - 1); // 删除最后一个逗号 String sqlTemplate = String.format("INSERT INTO %s (%s) VALUES (%s)", tableName, fieldBuilder.toString(), valueBuilder.toString()); // 构建insert语句模板 for (Object data : dataList) { List<Object> paramList = new ArrayList<>(); // 参数列表 for (Field field : fields) { if (field.isAnnotationPresent(javax.persistence.Column.class)) { try { field.setAccessible(true); Object value = field.get(data); // 获取字段的值 paramList.add(value); } catch (IllegalAccessException e) { e.printStackTrace(); } } } String sql = String.format(sqlTemplate, paramList.toArray()); // 构建完整的insert语句 sqlList.add(sql); } return sqlList; } /** * 获取实体类对应的表名 * * @param clazz 实体类 * @return 表名 */ private static String getTableName(Class<?> clazz) { if (clazz.isAnnotationPresent(javax.persistence.Table.class)) { javax.persistence.Table table = clazz.getAnnotation(javax.persistence.Table.class); return table.name(); } return null; } } ``` 下面是单元测试案例: ```java import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; public class GenerateInsertSqlTest { private static final String TABLE_NAME_1 = "table1"; // 表1的表名 private static final String TABLE_NAME_2 = "table2"; // 表2的表名 /** * 测试生成insert语句 */ @Test public void testGenerateInsertSql() { // 构造数据对象列表 List<Object> dataList = new ArrayList<>(); Table1Data data1 = new Table1Data(); data1.setId(1L); data1.setName("name1"); data1.setAge(20); dataList.add(data1); Table2Data data2 = new Table2Data(); data2.setId(2L); data2.setDesc("desc2"); dataList.add(data2); // 生成insert语句 List<String> sqlList = GenerateInsertSql.generateInsertSql(dataList); // 断言生成的insert语句正确 Assertions.assertEquals(2, sqlList.size()); Assertions.assertEquals(String.format("INSERT INTO %s (ID,NAME,AGE) VALUES (?,?,?)", TABLE_NAME_1), sqlList.get(0)); Assertions.assertEquals(String.format("INSERT INTO %s (ID,DESCRIPTION) VALUES (?,?)", TABLE_NAME_2), sqlList.get(1)); } /** * 表1的实体类 */ @javax.persistence.Entity @javax.persistence.Table(name = TABLE_NAME_1) private static class Table1Data { @javax.persistence.Id private Long id; @javax.persistence.Column(name = "NAME") private String name; @javax.persistence.Column(name = "AGE") private int age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } /** * 表2的实体类 */ @javax.persistence.Entity @javax.persistence.Table(name = TABLE_NAME_2) private static class Table2Data { @javax.persistence.Id private Long id; @javax.persistence.Column(name = "DESCRIPTION") private String desc; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值