JAVA 反射+注釋,根據實體類對象生成SQL語句工具類

openkk 12年前發布 | 11K 次閱讀 LoopBack B2C

由于覺得配置Hibernate過于繁瑣,索性使用了spring的jdbc,可是又要寫很多的sql語句,為了偷偷懶,于是就寫個能通過實體類對象生成SQL語句的工具類。

目前只在MySql數據庫上實驗通過,其他數據庫未測試。

本工具類還有很多不足之處,不過好在可以滿足自己一些簡單的日常使用。

上代碼了。

字段類型:

</tr> </tbody> </table> </div>

1 package net.tjnwdseip.util;

</tr> </tbody> </table> </div>

2  

</tr> </tbody> </table> </div>

3 public enum FieldType {

</tr> </tbody> </table> </div>

4  

</tr> </tbody> </table> </div>

5     STRING,NUMBER,DATE

</tr> </tbody> </table> </div> </div> </div>

字段注釋:

6 }

</tr> </tbody> </table> </div>

01 package net.tjnwdseip.util;

</tr> </tbody> </table> </div>

02  

</tr> </tbody> </table> </div>

03 import java.lang.annotation.Documented;

</tr> </tbody> </table> </div>

04 import java.lang.annotation.ElementType;

</tr> </tbody> </table> </div>

05 import java.lang.annotation.Retention;

</tr> </tbody> </table> </div>

06 import java.lang.annotation.RetentionPolicy;

</tr> </tbody> </table> </div>

07 import java.lang.annotation.Target;

</tr> </tbody> </table> </div>

08  

</tr> </tbody> </table> </div>

09 @Documented

</tr> </tbody> </table> </div>

10 @Retention(RetentionPolicy.RUNTIME)

</tr> </tbody> </table> </div>

11 @Target(ElementType.FIELD)

</tr> </tbody> </table> </div>

12 public <a href="http://my.oschina.net/interface" class="referer" target="_blank">@interface</a>  FieldAnnotation {

</tr> </tbody> </table> </div>

13  

</tr> </tbody> </table> </div>

14     String fieldName();

</tr> </tbody> </table> </div>

15      

</tr> </tbody> </table> </div>

16     FieldType fieldType();

</tr> </tbody> </table> </div>

17      

</tr> </tbody> </table> </div>

18     boolean pk();

</tr> </tbody> </table> </div> </div> </div>

表名注釋:

19 }

</tr> </tbody> </table> </div>

01 package net.tjnwdseip.util;

</tr> </tbody> </table> </div>

02  

</tr> </tbody> </table> </div>

03 import java.lang.annotation.Documented;

</tr> </tbody> </table> </div>

04 import java.lang.annotation.ElementType;

</tr> </tbody> </table> </div>

05 import java.lang.annotation.Retention;

</tr> </tbody> </table> </div>

06 import java.lang.annotation.RetentionPolicy;

</tr> </tbody> </table> </div>

07 import java.lang.annotation.Target;

</tr> </tbody> </table> </div>

08  

</tr> </tbody> </table> </div>

09 @Documented

</tr> </tbody> </table> </div>

10 @Retention(RetentionPolicy.RUNTIME)

</tr> </tbody> </table> </div>

11 @Target(ElementType.TYPE)

</tr> </tbody> </table> </div>

12 public <a href="http://my.oschina.net/interface" class="referer" target="_blank">@interface</a>  TableAnnotation {

</tr> </tbody> </table> </div>

13  

</tr> </tbody> </table> </div>

14     String tableName();

</tr> </tbody> </table> </div> </div> </div>

SQL語句生成工具類:

15 }

</tr> </tbody> </table> </div>

001 package net.tjnwdseip.util;

</tr> </tbody> </table> </div>

002  

</tr> </tbody> </table> </div>

003 import java.lang.reflect.Field;

</tr> </tbody> </table> </div>

004 import java.lang.reflect.InvocationTargetException;

</tr> </tbody> </table> </div>

005 import java.lang.reflect.Method;

</tr> </tbody> </table> </div>

006 import java.util.ArrayList;

</tr> </tbody> </table> </div>

007 import java.util.HashMap;

</tr> </tbody> </table> </div>

008 import java.util.Iterator;

</tr> </tbody> </table> </div>

009 import java.util.List;

</tr> </tbody> </table> </div>

010  

</tr> </tbody> </table> </div>

011 /**

</tr> </tbody> </table> </div>

012  *

</tr> </tbody> </table> </div>

013  * @ClassName: CreateSqlTools

</tr> </tbody> </table> </div>

014  * @Description: TODO(根據實體類對象生成SQL語句)

</tr> </tbody> </table> </div>

015  * <a class="referer" target="_blank">@author</a>  LiYang

</tr> </tbody> </table> </div>

016  * @date 2012-5-4 下午10:07:03

</tr> </tbody> </table> </div>

017  *

</tr> </tbody> </table> </div>

018  */

</tr> </tbody> </table> </div>

019 public class CreateSqlTools {

</tr> </tbody> </table> </div>

020  

</tr> </tbody> </table> </div>

021     /**

</tr> </tbody> </table> </div>

022      *

</tr> </tbody> </table> </div>

023      * @Title: getTableName

</tr> </tbody> </table> </div>

024      * @Description: TODO(獲取表名)

</tr> </tbody> </table> </div>

025      * @param @param obj

</tr> </tbody> </table> </div>

026      * @param @return 設定文件

</tr> </tbody> </table> </div>

027      * @return String 返回類型

</tr> </tbody> </table> </div>

028      * @throws

</tr> </tbody> </table> </div>

029      */

</tr> </tbody> </table> </div>

030     private static String getTableName(Object obj) {

</tr> </tbody> </table> </div>

031         String tableName = null;

</tr> </tbody> </table> </div>

032         if (obj.getClass().isAnnotationPresent(TableAnnotation.class)) {

</tr> </tbody> </table> </div>

033             tableName = obj.getClass().getAnnotation(TableAnnotation.class)

</tr> </tbody> </table> </div>

034                     .tableName();

</tr> </tbody> </table> </div>

035         }

</tr> </tbody> </table> </div>

036         return tableName;

</tr> </tbody> </table> </div>

037     }

</tr> </tbody> </table> </div>

038  

</tr> </tbody> </table> </div>

039     /**

</tr> </tbody> </table> </div>

040      *

</tr> </tbody> </table> </div>

041      * @Title: getAnnoFieldList

</tr> </tbody> </table> </div>

042      * @Description: TODO(獲取所有有注釋的字段,支持多重繼承)

</tr> </tbody> </table> </div>

043      * @param @param obj

</tr> </tbody> </table> </div>

044      * @param @return 設定文件

</tr> </tbody> </table> </div>

045      * @return List<Field> 返回類型

</tr> </tbody> </table> </div>

046      * @throws

</tr> </tbody> </table> </div>

047      */

</tr> </tbody> </table> </div>

048     @SuppressWarnings("rawtypes")

</tr> </tbody> </table> </div>

049     private static List<Field> getAnnoFieldList(Object obj) {

</tr> </tbody> </table> </div>

050         List<Field> list = new ArrayList<Field>();

</tr> </tbody> </table> </div>

051         Class superClass = obj.getClass().getSuperclass();

</tr> </tbody> </table> </div>

052         while (true) {

</tr> </tbody> </table> </div>

053             if (superClass != null) {

</tr> </tbody> </table> </div>

054                 Field[] superFields = superClass.getDeclaredFields();

</tr> </tbody> </table> </div>

055                 if (superFields != null && superFields.length > 0) {

</tr> </tbody> </table> </div>

056                     for (Field field : superFields) {

</tr> </tbody> </table> </div>

057                         if (field.isAnnotationPresent(FieldAnnotation.class)) {

</tr> </tbody> </table> </div>

058                             list.add(field);

</tr> </tbody> </table> </div>

059                         }

</tr> </tbody> </table> </div>

060                     }

</tr> </tbody> </table> </div>

061                 }

</tr> </tbody> </table> </div>

062                 superClass = superClass.getSuperclass();

</tr> </tbody> </table> </div>

063             } else {

</tr> </tbody> </table> </div>

064                 break;

</tr> </tbody> </table> </div>

065             }

</tr> </tbody> </table> </div>

066         }

</tr> </tbody> </table> </div>

067         Field[] objFields = obj.getClass().getDeclaredFields();

</tr> </tbody> </table> </div>

068         if (objFields != null && objFields.length > 0) {

</tr> </tbody> </table> </div>

069             for (Field field : objFields) {

</tr> </tbody> </table> </div>

070                 if (field.isAnnotationPresent(FieldAnnotation.class)) {

</tr> </tbody> </table> </div>

071                     list.add(field);

</tr> </tbody> </table> </div>

072                 }

</tr> </tbody> </table> </div>

073             }

</tr> </tbody> </table> </div>

074         }

</tr> </tbody> </table> </div>

075         return list;

</tr> </tbody> </table> </div>

076     }

</tr> </tbody> </table> </div>

077  

</tr> </tbody> </table> </div>

078     /**

</tr> </tbody> </table> </div>

079      *

</tr> </tbody> </table> </div>

080      * @Title: getFieldValue

</tr> </tbody> </table> </div>

081      * @Description: TODO(獲取字段的值,支持多重繼承)

</tr> </tbody> </table> </div>

082      * @param @param obj

</tr> </tbody> </table> </div>

083      * @param @param field

</tr> </tbody> </table> </div>

084      * @param @return 設定文件

</tr> </tbody> </table> </div>

085      * @return String 返回類型

</tr> </tbody> </table> </div>

086      * @throws

</tr> </tbody> </table> </div>

087      */

</tr> </tbody> </table> </div>

088     @SuppressWarnings({ "rawtypes" })

</tr> </tbody> </table> </div>

089     private static String getFieldValue(Object obj, Field field) {

</tr> </tbody> </table> </div>

090         String value = null;

</tr> </tbody> </table> </div>

091         String name = field.getName();

</tr> </tbody> </table> </div>

092         String methodName = "get" + name.substring(0, 1).toUpperCase()

</tr> </tbody> </table> </div>

093                 + name.substring(1);

</tr> </tbody> </table> </div>

094         Method method = null;

</tr> </tbody> </table> </div>

095         Object methodValue = null;

</tr> </tbody> </table> </div>

096         try {

</tr> </tbody> </table> </div>

097             method = obj.getClass().getMethod(methodName);

</tr> </tbody> </table> </div>

098         } catch (NoSuchMethodException | SecurityException e1) {

</tr> </tbody> </table> </div>

099             // TODO Auto-generated catch block

</tr> </tbody> </table> </div>

100         }

</tr> </tbody> </table> </div>

101         if (method != null) {

</tr> </tbody> </table> </div>

102             try {

</tr> </tbody> </table> </div>

103                 methodValue = method.invoke(obj);

</tr> </tbody> </table> </div>

104             } catch (IllegalAccessException | IllegalArgumentException

</tr> </tbody> </table> </div>

105                     | InvocationTargetException e) {

</tr> </tbody> </table> </div>

106                 // TODO Auto-generated catch block

</tr> </tbody> </table> </div>

107             }

</tr> </tbody> </table> </div>

108             if (methodValue != null) {

</tr> </tbody> </table> </div>

109                 value = methodValue.toString();

</tr> </tbody> </table> </div>

110             } else {

</tr> </tbody> </table> </div>

111                 Class objSuperClass = obj.getClass().getSuperclass();

</tr> </tbody> </table> </div>

112                 while (true) {

</tr> </tbody> </table> </div>

113                     if (objSuperClass != null) {

</tr> </tbody> </table> </div>

114                         try {

</tr> </tbody> </table> </div>

115                             methodValue = method.invoke(objSuperClass);

</tr> </tbody> </table> </div>

116                         } catch (IllegalAccessException

</tr> </tbody> </table> </div>

117                                 | IllegalArgumentException

</tr> </tbody> </table> </div>

118                                 | InvocationTargetException e) {

</tr> </tbody> </table> </div>

119                             // TODO Auto-generated catch block

</tr> </tbody> </table> </div>

120                         }

</tr> </tbody> </table> </div>

121                         if (methodValue != null) {

</tr> </tbody> </table> </div>

122                             value = methodValue.toString();

</tr> </tbody> </table> </div>

123                             break;

</tr> </tbody> </table> </div>

124                         } else {

</tr> </tbody> </table> </div>

125                             objSuperClass = objSuperClass.getSuperclass();

</tr> </tbody> </table> </div>

126                         }

</tr> </tbody> </table> </div>

127                     } else {

</tr> </tbody> </table> </div>

128                         break;

</tr> </tbody> </table> </div>

129                     }

</tr> </tbody> </table> </div>

130                 }

</tr> </tbody> </table> </div>

131             }

</tr> </tbody> </table> </div>

132         }

</tr> </tbody> </table> </div>

133         return value;

</tr> </tbody> </table> </div>

134     }

</tr> </tbody> </table> </div>

135  

</tr> </tbody> </table> </div>

136     /**

</tr> </tbody> </table> </div>

137      *

</tr> </tbody> </table> </div>

138      * @Title: getInsertSql

</tr> </tbody> </table> </div>

139      * @Description: TODO(根據實體類對象字段的值生成INSERT SQL語句,可選固定參數)

</tr> </tbody> </table> </div>

140      * @param @param obj

</tr> </tbody> </table> </div>

141      * @param @param fixedParams

</tr> </tbody> </table> </div>

142      *        固定參數(如該參數與實體類中有相同的字段,則忽略實體類中的對應字段,HashMap<String

</tr> </tbody> </table> </div>

143      *        ,String>,key=指定字段名,value=對應字段的值)

</tr> </tbody> </table> </div>

144      * @param @return 設定文件

</tr> </tbody> </table> </div>

145      * @return String 返回類型

</tr> </tbody> </table> </div>

146      * @throws

</tr> </tbody> </table> </div>

147      */

</tr> </tbody> </table> </div>

148     public static String getInsertSql(Object obj,

</tr> </tbody> </table> </div>

149             HashMap<String, String> fixedParams) {

</tr> </tbody> </table> </div>

150         String insertSql = null;

</tr> </tbody> </table> </div>

151         String tableName = getTableName(obj);

</tr> </tbody> </table> </div>

152         if (tableName != null) {

</tr> </tbody> </table> </div>

153             StringBuffer sqlStr = new StringBuffer("INSERT INTO ");

</tr> </tbody> </table> </div>

154             StringBuffer valueStr = new StringBuffer(" VALUES (");

</tr> </tbody> </table> </div>

155             List<Field> annoFieldList = getAnnoFieldList(obj);

</tr> </tbody> </table> </div>

156             if (annoFieldList != null && annoFieldList.size() > 0) {

</tr> </tbody> </table> </div>

157                 sqlStr.append(tableName + " (");

</tr> </tbody> </table> </div>

158                 if (fixedParams != null && fixedParams.size() > 0) {

</tr> </tbody> </table> </div>

159                     Iterator<String> keyNames = fixedParams.keySet().iterator();

</tr> </tbody> </table> </div>

160                     while (keyNames.hasNext()) {

</tr> </tbody> </table> </div>

161                         String keyName = (String) keyNames.next();

</tr> </tbody> </table> </div>

162                         sqlStr.append(keyName + ",");

</tr> </tbody> </table> </div>

163                         valueStr.append(fixedParams.get(keyName) + ",");

</tr> </tbody> </table> </div>

164                     }

</tr> </tbody> </table> </div>

165                 }

</tr> </tbody> </table> </div>

166                 for (Field field : annoFieldList) {

</tr> </tbody> </table> </div>

167                     FieldAnnotation anno = field

</tr> </tbody> </table> </div>

168                             .getAnnotation(FieldAnnotation.class);

</tr> </tbody> </table> </div>

169                     if (!anno.pk()) {

</tr> </tbody> </table> </div>

170                         Object fieldValue = getFieldValue(obj, field);

</tr> </tbody> </table> </div>

171                         if (fieldValue != null) {

</tr> </tbody> </table> </div>

172                             if (fixedParams != null && fixedParams.size() > 0) {

</tr> </tbody> </table> </div>

173                                 Iterator<String> keyNames = fixedParams

</tr> </tbody> </table> </div>

174                                         .keySet().iterator();

</tr> </tbody> </table> </div>

175                                 boolean nextFieldFlag = false;

</tr> </tbody> </table> </div>

176                                 while (keyNames.hasNext()) {

</tr> </tbody> </table> </div>

177                                     String keyName = (String) keyNames.next();

</tr> </tbody> </table> </div>

178                                     if (anno.fieldName().equals(keyName)) {

</tr> </tbody> </table> </div>

179                                         nextFieldFlag = true;

</tr> </tbody> </table> </div>

180                                         break;

</tr> </tbody> </table> </div>

181                                     }

</tr> </tbody> </table> </div>

182                                 }

</tr> </tbody> </table> </div>

183                                 if (nextFieldFlag) {

</tr> </tbody> </table> </div>

184                                     break;

</tr> </tbody> </table> </div>

185                                 }

</tr> </tbody> </table> </div>

186                             }

</tr> </tbody> </table> </div>

187                             sqlStr.append(anno.fieldName() + ",");

</tr> </tbody> </table> </div>

188                             switch (anno.fieldType()) {

</tr> </tbody> </table> </div>

189                             case NUMBER:

</tr> </tbody> </table> </div>

190                                 valueStr.append(fieldValue + ",");

</tr> </tbody> </table> </div>

191                                 break;

</tr> </tbody> </table> </div>

192                             default:

</tr> </tbody> </table> </div>

193                                 valueStr.append("'" + fieldValue + "',");

</tr> </tbody> </table> </div>

194                                 break;

</tr> </tbody> </table> </div>

195                             }

</tr> </tbody> </table> </div>

196                         }

</tr> </tbody> </table> </div>

197                     }

</tr> </tbody> </table> </div>

198                 }

</tr> </tbody> </table> </div>

199                 insertSql = sqlStr.toString().substring(0, sqlStr.length() - 1)

</tr> </tbody> </table> </div>

200                         + ")"

</tr> </tbody> </table> </div>

201                         + valueStr.toString().substring(0,

</tr> </tbody> </table> </div>

202                                 valueStr.length() - 1) + ")";

</tr> </tbody> </table> </div>

203             }

</tr> </tbody> </table> </div>

204         }

</tr> </tbody> </table> </div>

205         return insertSql;

</tr> </tbody> </table> </div>

206     }

</tr> </tbody> </table> </div>

207  

</tr> </tbody> </table> </div>

208     /**

</tr> </tbody> </table> </div>

209      *

</tr> </tbody> </table> </div>

210      * @Title: getInsertSql

</tr> </tbody> </table> </div>

211      * @Description: TODO(根據實體類對象字段的值生成INSERT SQL語句)

</tr> </tbody> </table> </div>

212      * @param @param obj

</tr> </tbody> </table> </div>

213      * @param @return 設定文件

</tr> </tbody> </table> </div>

214      * @return String 返回類型

</tr> </tbody> </table> </div>

215      * @throws

</tr> </tbody> </table> </div>

216      */

</tr> </tbody> </table> </div>

217     public static String getInsertSql(Object obj) {

</tr> </tbody> </table> </div>

218         return getInsertSql(obj, null);

</tr> </tbody> </table> </div>

219     }

</tr> </tbody> </table> </div>

220  

</tr> </tbody> </table> </div>

221     /**

</tr> </tbody> </table> </div>

222      *

</tr> </tbody> </table> </div>

223      * @Title: getUpdateSql

</tr> </tbody> </table> </div>

224      * @Description: TODO(根據實體類對象字段的值生成UPDATE SQL語句,可選更新條件為主鍵,可選固定更新參數)

</tr> </tbody> </table> </div>

225      * @param @param obj

</tr> </tbody> </table> </div>

226      * @param @param reqPk 是否指定更新條件為主鍵(true=是,false=否)

</tr> </tbody> </table> </div>

227      * @param @param fixedParams

</tr> </tbody> </table> </div>

228      *        固定參數(如該參數與實體類中有相同的字段,則忽略實體類中的對應字段,HashMap<String

</tr> </tbody> </table> </div>

229      *        ,String>,key=指定字段名,value=對應字段的值)

</tr> </tbody> </table> </div>

230      * @param @return 設定文件

</tr> </tbody> </table> </div>

231      * @return String 返回類型

</tr> </tbody> </table> </div>

232      * @throws

</tr> </tbody> </table> </div>

233      */

</tr> </tbody> </table> </div>

234     public static String getUpdateSql(Object obj, boolean reqPk,

</tr> </tbody> </table> </div>

235             HashMap<String, String> fixedParams) {

</tr> </tbody> </table> </div>

236         String updateSql = null;

</tr> </tbody> </table> </div>

237         String tableName = getTableName(obj);

</tr> </tbody> </table> </div>

238         if (tableName != null) {

</tr> </tbody> </table> </div>

239             List<Field> annoFieldList = getAnnoFieldList(obj);

</tr> </tbody> </table> </div>

240             if (annoFieldList != null && annoFieldList.size() > 0) {

</tr> </tbody> </table> </div>

241                 StringBuffer sqlStr = new StringBuffer("UPDATE " + tableName);

</tr> </tbody> </table> </div>

242                 StringBuffer valueStr = new StringBuffer(" SET ");

</tr> </tbody> </table> </div>

243                 String whereStr = " WHERE ";

</tr> </tbody> </table> </div>

244                 if (fixedParams != null && fixedParams.size() > 0) {

</tr> </tbody> </table> </div>

245                     Iterator<String> keyNames = fixedParams.keySet().iterator();

</tr> </tbody> </table> </div>

246                     while (keyNames.hasNext()) {

</tr> </tbody> </table> </div>

247                         String keyName = (String) keyNames.next();

</tr> </tbody> </table> </div>

248                         valueStr.append(keyName + "="

</tr> </tbody> </table> </div>

249                                 + fixedParams.get(keyName) + ",");

</tr> </tbody> </table> </div>

250                     }

</tr> </tbody> </table> </div>

251                 }

</tr> </tbody> </table> </div>

252                 for (Field field : annoFieldList) {

</tr> </tbody> </table> </div>

253                     String fieldValue = getFieldValue(obj, field);

</tr> </tbody> </table> </div>

254                     if (fieldValue != null) {

</tr> </tbody> </table> </div>

255                         FieldAnnotation anno = field

</tr> </tbody> </table> </div>

256                                 .getAnnotation(FieldAnnotation.class);

</tr> </tbody> </table> </div>

257                         if (!anno.pk()) {

</tr> </tbody> </table> </div>

258                             if (fixedParams != null && fixedParams.size() > 0) {

</tr> </tbody> </table> </div>

259                                 boolean nextFieldFlag = false;

</tr> </tbody> </table> </div>

260                                 Iterator<String> keyNames = fixedParams

</tr> </tbody> </table> </div>

261                                         .keySet().iterator();

</tr> </tbody> </table> </div>

262                                 while (keyNames.hasNext()) {

</tr> </tbody> </table> </div>

263                                     String keyName = (String) keyNames.next();

</tr> </tbody> </table> </div>

264                                     if (anno.fieldName().equals(keyName)) {

</tr> </tbody> </table> </div>

265                                         nextFieldFlag = true;

</tr> </tbody> </table> </div>

266                                         break;

</tr> </tbody> </table> </div>

267                                     }

</tr> </tbody> </table> </div>

268                                 }

</tr> </tbody> </table> </div>

269                                 if (nextFieldFlag) {

</tr> </tbody> </table> </div>

270                                     break;

</tr> </tbody> </table> </div>

271                                 }

</tr> </tbody> </table> </div>

272                             }

</tr> </tbody> </table> </div>

273                             valueStr.append(anno.fieldName() + "=");

</tr> </tbody> </table> </div>

274                             switch (anno.fieldType()) {

</tr> </tbody> </table> </div>

275                             case NUMBER:

</tr> </tbody> </table> </div>

276                                 valueStr.append(fieldValue + ",");

</tr> </tbody> </table> </div>

277                                 break;

</tr> </tbody> </table> </div>

278                             default:

</tr> </tbody> </table> </div>

279                                 valueStr.append("'" + fieldValue + "',");

</tr> </tbody> </table> </div>

280                                 break;

</tr> </tbody> </table> </div>

281                             }

</tr> </tbody> </table> </div>

282                         } else {

</tr> </tbody> </table> </div>

283                             if (reqPk) {

</tr> </tbody> </table> </div>

284                                 whereStr += anno.fieldName() + "=" + fieldValue;

</tr> </tbody> </table> </div>

285                             }

</tr> </tbody> </table> </div>

286                         }

</tr> </tbody> </table> </div>

287                     }

</tr> </tbody> </table> </div>

288                 }

</tr> </tbody> </table> </div>

289                 updateSql = sqlStr.toString()

</tr> </tbody> </table> </div>

290                         + valueStr.toString().substring(0,

</tr> </tbody> </table> </div>

291                                 valueStr.length() - 1)

</tr> </tbody> </table> </div>

292                         + (reqPk ? whereStr : "");

</tr> </tbody> </table> </div>

293             }

</tr> </tbody> </table> </div>

294         }

</tr> </tbody> </table> </div>

295         return updateSql;

</tr> </tbody> </table> </div>

296     }

</tr> </tbody> </table> </div>

297  

</tr> </tbody> </table> </div>

298     /**

</tr> </tbody> </table> </div>

299      *

</tr> </tbody> </table> </div>

300      * @Title: getUpdateSql

</tr> </tbody> </table> </div>

301      * @Description: TODO(根據實體類對象字段的值生成UPDATE SQL語句,無條件)

</tr> </tbody> </table> </div>

302      * @param @param obj

</tr> </tbody> </table> </div>

303      * @param @return 設定文件

</tr> </tbody> </table> </div>

304      * @return String 返回類型

</tr> </tbody> </table> </div>

305      * @throws

</tr> </tbody> </table> </div>

306      */

</tr> </tbody> </table> </div>

307     public static String getUpdateSql(Object obj) {

</tr> </tbody> </table> </div>

308         return getUpdateSql(obj, false, null);

</tr> </tbody> </table> </div>

309     }

</tr> </tbody> </table> </div>

310  

</tr> </tbody> </table> </div>

311     /**

</tr> </tbody> </table> </div>

312      *

</tr> </tbody> </table> </div>

313      * @Title: getUpdateSql

</tr> </tbody> </table> </div>

314      * @Description: TODO(根據實體類對象字段的值生成UPDATE SQL語句,可選更新條件為主鍵)

</tr> </tbody> </table> </div>

315      * @param @param obj

</tr> </tbody> </table> </div>

316      * @param @param reqPk 是否指定更新條件為主鍵(true=是,false=否)

</tr> </tbody> </table> </div>

317      * @param @return 設定文件

</tr> </tbody> </table> </div>

318      * @return String 返回類型

</tr> </tbody> </table> </div>

319      * @throws

</tr> </tbody> </table> </div>

320      */

</tr> </tbody> </table> </div>

321     public static String getUpdateSql(Object obj, boolean reqPk) {

</tr> </tbody> </table> </div>

322         return getUpdateSql(obj, reqPk, null);

</tr> </tbody> </table> </div>

323     }

</tr> </tbody> </table> </div>

324  

</tr> </tbody> </table> </div>

325     /**

</tr> </tbody> </table> </div>

326      *

</tr> </tbody> </table> </div>

327      * @Title: getDeleteSql

</tr> </tbody> </table> </div>

328      * @Description: TODO(根據實體類對象字段的值生成有條件的DELETE

</tr> </tbody> </table> </div>

329      *               SQL語句,可選主鍵為刪除條件或使用各個字段的值為條件,多個條件用AND連接)

</tr> </tbody> </table> </div>

330      * @param @param obj

</tr> </tbody> </table> </div>

331      * @param @param reqPk 是否指定更新條件為主鍵(true=是,false=否)

</tr> </tbody> </table> </div>

332      * @param @return 設定文件

</tr> </tbody> </table> </div>

333      * @return String 返回類型

</tr> </tbody> </table> </div>

334      * @throws

</tr> </tbody> </table> </div>

335      */

</tr> </tbody> </table> </div>

336     public static String getDeleteSql(Object obj, boolean reqPk) {

</tr> </tbody> </table> </div>

337         String deleteSql = null;

</tr> </tbody> </table> </div>

338         String tableName = getTableName(obj);

</tr> </tbody> </table> </div>

339         if (tableName != null) {

</tr> </tbody> </table> </div>

340             StringBuffer delSqlBuffer = new StringBuffer("DELETE FROM ");

</tr> </tbody> </table> </div>

341             List<Field> annoFieldList = getAnnoFieldList(obj);

</tr> </tbody> </table> </div>

342             if (annoFieldList != null && annoFieldList.size() > 0) {

</tr> </tbody> </table> </div>

343                 delSqlBuffer.append(tableName + " WHERE ");

</tr> </tbody> </table> </div>

344                 for (Field field : annoFieldList) {

</tr> </tbody> </table> </div>

345                     if (reqPk) {

</tr> </tbody> </table> </div>

346                         FieldAnnotation anno = field

</tr> </tbody> </table> </div>

347                                 .getAnnotation(FieldAnnotation.class);

</tr> </tbody> </table> </div>

348                         if (anno.pk()) {

</tr> </tbody> </table> </div>

349                             String fieldValue = getFieldValue(obj, field);

</tr> </tbody> </table> </div>

350                             delSqlBuffer.append(anno.fieldName() + "=");

</tr> </tbody> </table> </div>

351                             switch (anno.fieldType()) {

</tr> </tbody> </table> </div>

352                             case NUMBER:

</tr> </tbody> </table> </div>

353                                 delSqlBuffer.append(fieldValue);

</tr> </tbody> </table> </div>

354                                 break;

</tr> </tbody> </table> </div>

355                             default:

</tr> </tbody> </table> </div>

356                                 delSqlBuffer.append("'" + fieldValue + "'");

</tr> </tbody> </table> </div>

357                                 break;

</tr> </tbody> </table> </div>

358                             }

</tr> </tbody> </table> </div>

359                             break;

</tr> </tbody> </table> </div>

360                         }

</tr> </tbody> </table> </div>

361                     } else {

</tr> </tbody> </table> </div>

362                         String fieldValue = getFieldValue(obj, field);

</tr> </tbody> </table> </div>

363                         if (fieldValue != null) {

</tr> </tbody> </table> </div>

364                             FieldAnnotation anno = field

</tr> </tbody> </table> </div>

365                                     .getAnnotation(FieldAnnotation.class);

</tr> </tbody> </table> </div>

366                             delSqlBuffer.append(anno.fieldName() + "=");

</tr> </tbody> </table> </div>

367                             switch (anno.fieldType()) {

</tr> </tbody> </table> </div>

368                             case NUMBER:

</tr> </tbody> </table> </div>

369                                 delSqlBuffer.append(fieldValue + " AND ");

</tr> </tbody> </table> </div>

370                                 break;

</tr> </tbody> </table> </div>

371                             default:

</tr> </tbody> </table> </div>

372                                 delSqlBuffer

</tr> </tbody> </table> </div>

373                                         .append("'" + fieldValue + "' AND ");

</tr> </tbody> </table> </div>

374                                 break;

</tr> </tbody> </table> </div>

375                             }

</tr> </tbody> </table> </div>

376                         }

</tr> </tbody> </table> </div>

377                     }

</tr> </tbody> </table> </div>

378                 }

</tr> </tbody> </table> </div>

379                 if (reqPk) {

</tr> </tbody> </table> </div>

380                     deleteSql = delSqlBuffer.toString();

</tr> </tbody> </table> </div>

381                 } else {

</tr> </tbody> </table> </div>

382                     deleteSql = delSqlBuffer.toString().substring(0,

</tr> </tbody> </table> </div>

383                             delSqlBuffer.length() - 5);

</tr> </tbody> </table> </div>

384                 }

</tr> </tbody> </table> </div>

385             }

</tr> </tbody> </table> </div>

386         }

</tr> </tbody> </table> </div>

387         return deleteSql;

</tr> </tbody> </table> </div>

388     }

</tr> </tbody> </table> </div>

389  

</tr> </tbody> </table> </div>

390     /**

</tr> </tbody> </table> </div>

391      *

</tr> </tbody> </table> </div>

392      * @Title: getDeleteSql

</tr> </tbody> </table> </div>

393      * @Description: TODO(根據實體類對象字段的值生成有條件的DELETE SQL語句,使用各個字段的值為條件,多個條件用AND連接)

</tr> </tbody> </table> </div>

394      * @param @param obj

</tr> </tbody> </table> </div>

395      * @param @return 設定文件

</tr> </tbody> </table> </div>

396      * @return String 返回類型

</tr> </tbody> </table> </div>

397      * @throws

</tr> </tbody> </table> </div>

398      */

</tr> </tbody> </table> </div>

399     public static String getDeleteSql(Object obj) {

</tr> </tbody> </table> </div>

400         return getDeleteSql(obj, false);

</tr> </tbody> </table> </div>

401     }

</tr> </tbody> </table> </div>

402  

</tr> </tbody> </table> </div>

403     /**

</tr> </tbody> </table> </div>

404      *

</tr> </tbody> </table> </div>

405      * @Title: getSelectAllSql

</tr> </tbody> </table> </div>

406      * @Description: TODO(根據實體類對象字段的值生成SELECT SQL語句,無查詢條件)

</tr> </tbody> </table> </div>

407      * @param @param obj

</tr> </tbody> </table> </div>

408      * @param @return 設定文件

</tr> </tbody> </table> </div>

409      * @return String 返回類型

</tr> </tbody> </table> </div>

410      * @throws

</tr> </tbody> </table> </div>

411      */

</tr> </tbody> </table> </div>

412     public static String getSelectAllSql(Object obj) {

</tr> </tbody> </table> </div>

413         String selectSql = null;

</tr> </tbody> </table> </div>

414         String tableName = getTableName(obj);

</tr> </tbody> </table> </div>

415         if (tableName != null) {

</tr> </tbody> </table> </div>

416             StringBuffer selectBuffer = new StringBuffer("SELECT ");

</tr> </tbody> </table> </div>

417             List<Field> annoFieldList = getAnnoFieldList(obj);

</tr> </tbody> </table> </div>

418             if (annoFieldList != null && annoFieldList.size() > 0) {

</tr> </tbody> </table> </div>

419                 for (Field field : annoFieldList) {

</tr> </tbody> </table> </div>

420                     FieldAnnotation anno = field

</tr> </tbody> </table> </div>

421                             .getAnnotation(FieldAnnotation.class);

</tr> </tbody> </table> </div>

422                     selectBuffer.append(anno.fieldName() + ",");

</tr> </tbody> </table> </div>

423                 }

</tr> </tbody> </table> </div>

424                 selectSql = selectBuffer.toString().substring(0,

</tr> </tbody> </table> </div>

425                         selectBuffer.length() - 1)

</tr> </tbody> </table> </div>

426                         + " FROM " + tableName;

</tr> </tbody> </table> </div>

427             }

</tr> </tbody> </table> </div>

428         }

</tr> </tbody> </table> </div>

429         return selectSql;

</tr> </tbody> </table> </div>

430     }

</tr> </tbody> </table> </div> </div> </div>

實體類注釋寫法:

431 }

</tr> </tbody> </table> </div>

01 package net.tjnwdseip.entity;

</tr> </tbody> </table> </div>

02  

</tr> </tbody> </table> </div>

03 import java.sql.Timestamp;

</tr> </tbody> </table> </div>

04  

</tr> </tbody> </table> </div>

05 import net.tjnwdseip.util.FieldAnnotation;

</tr> </tbody> </table> </div>

06 import net.tjnwdseip.util.FieldType;

</tr> </tbody> </table> </div>

07  

</tr> </tbody> </table> </div>

08 public class BaseEntity {

</tr> </tbody> </table> </div>

09  

</tr> </tbody> </table> </div>

10     @FieldAnnotation(fieldName="id",fieldType=FieldType.NUMBER,pk=true)

</tr> </tbody> </table> </div>

11     private Integer id;

</tr> </tbody> </table> </div>

12      

</tr> </tbody> </table> </div>

13     @FieldAnnotation(fieldName="createDate",fieldType=FieldType.DATE, pk = false)

</tr> </tbody> </table> </div>

14     private Timestamp createDate;

</tr> </tbody> </table> </div>

15      

</tr> </tbody> </table> </div>

16     @FieldAnnotation(fieldName="modifyDate",fieldType=FieldType.DATE, pk = false)

</tr> </tbody> </table> </div>

17     private Timestamp modifyDate;

</tr> </tbody> </table> </div>

18  

</tr> </tbody> </table> </div>

19     public Integer getId() {

</tr> </tbody> </table> </div>

20         return id;

</tr> </tbody> </table> </div>

21     }

</tr> </tbody> </table> </div>

22  

</tr> </tbody> </table> </div>

23     public void setId(Integer id) {

</tr> </tbody> </table> </div>

24         this.id = id;

</tr> </tbody> </table> </div>

25     }

</tr> </tbody> </table> </div>

26  

</tr> </tbody> </table> </div>

27     public Timestamp getCreateDate() {

</tr> </tbody> </table> </div>

28         return createDate;

</tr> </tbody> </table> </div>

29     }

</tr> </tbody> </table> </div>

30  

</tr> </tbody> </table> </div>

31     public void setCreateDate(Timestamp createDate) {

</tr> </tbody> </table> </div>

32         this.createDate = createDate;

</tr> </tbody> </table> </div>

33     }

</tr> </tbody> </table> </div>

34  

</tr> </tbody> </table> </div>

35     public Timestamp getModifyDate() {

</tr> </tbody> </table> </div>

36         return modifyDate;

</tr> </tbody> </table> </div>

37     }

</tr> </tbody> </table> </div>

38  

</tr> </tbody> </table> </div>

39     public void setModifyDate(Timestamp modifyDate) {

</tr> </tbody> </table> </div>

40         this.modifyDate = modifyDate;

</tr> </tbody> </table> </div>

41     }

</tr> </tbody> </table> </div>

42  

</tr> </tbody> </table> </div>

43     public BaseEntity(Integer id, Timestamp createDate, Timestamp modifyDate) {

</tr> </tbody> </table> </div>

44         super();

</tr> </tbody> </table> </div>

45         this.id = id;

</tr> </tbody> </table> </div>

46         this.createDate = createDate;

</tr> </tbody> </table> </div>

47         this.modifyDate = modifyDate;

</tr> </tbody> </table> </div>

48     }

</tr> </tbody> </table> </div>

49  

</tr> </tbody> </table> </div>

50     public BaseEntity() {

</tr> </tbody> </table> </div>

51         super();

</tr> </tbody> </table> </div>

52     }

</tr> </tbody> </table> </div> </div> </div>

53 }

</tr> </tbody> </table> </div>

01 package net.tjnwdseip.entity;

</tr> </tbody> </table> </div>

02  

</tr> </tbody> </table> </div>

03 import java.sql.Timestamp;

</tr> </tbody> </table> </div>

04  

</tr> </tbody> </table> </div>

05 import net.tjnwdseip.util.FieldAnnotation;

</tr> </tbody> </table> </div>

06 import net.tjnwdseip.util.FieldType;

</tr> </tbody> </table> </div>

07 import net.tjnwdseip.util.TableAnnotation;

</tr> </tbody> </table> </div>

08 /**

</tr> </tbody> </table> </div>

09  *

</tr> </tbody> </table> </div>

10  * @ClassName: SysNetProxyCfg

</tr> </tbody> </table> </div>

11  * @Description: TODO(網絡代理設置)

</tr> </tbody> </table> </div>

12  * <a class="referer" target="_blank">@author</a>  LiYang

</tr> </tbody> </table> </div>

13  * @date 2012-5-2 下午4:13:08

</tr> </tbody> </table> </div>

14  *

</tr> </tbody> </table> </div>

15  */

</tr> </tbody> </table> </div>

16 @TableAnnotation(tableName="sysNetProxyCfg")

</tr> </tbody> </table> </div>

17 public class SysNetProxyCfg extends BaseEntity {

</tr> </tbody> </table> </div>

18  

</tr> </tbody> </table> </div>

19     @FieldAnnotation(fieldName = "name", fieldType = FieldType.STRING, pk = false)

</tr> </tbody> </table> </div>

20     private String name;

</tr> </tbody> </table> </div>

21      

</tr> </tbody> </table> </div>

22     @FieldAnnotation(fieldName = "type", fieldType = FieldType.STRING, pk = false)

</tr> </tbody> </table> </div>

23     private String type;

</tr> </tbody> </table> </div>

24      

</tr> </tbody> </table> </div>

25     @FieldAnnotation(fieldName = "proxyHostIp", fieldType = FieldType.STRING, pk = false)

</tr> </tbody> </table> </div>

26     private String proxyHostIp;

</tr> </tbody> </table> </div>

27      

</tr> </tbody> </table> </div>

28     @FieldAnnotation(fieldName = "proxyPort", fieldType = FieldType.NUMBER, pk = false)

</tr> </tbody> </table> </div>

29     private Integer proxyPort;

</tr> </tbody> </table> </div>

30  

</tr> </tbody> </table> </div>

31     public String getName() {

</tr> </tbody> </table> </div>

32         return name;

</tr> </tbody> </table> </div>

33     }

</tr> </tbody> </table> </div>

34  

</tr> </tbody> </table> </div>

35     public void setName(String name) {

</tr> </tbody> </table> </div>

36         this.name = name;

</tr> </tbody> </table> </div>

37     }

</tr> </tbody> </table> </div>

38  

</tr> </tbody> </table> </div>

39     public String getType() {

</tr> </tbody> </table> </div>

40         return type;

</tr> </tbody> </table> </div>

41     }

</tr> </tbody> </table> </div>

42  

</tr> </tbody> </table> </div>

43     public void setType(String type) {

</tr> </tbody> </table> </div>

44         this.type = type;

</tr> </tbody> </table> </div>

45     }

</tr> </tbody> </table> </div>

46  

</tr> </tbody> </table> </div>

47     public String getProxyHostIp() {

</tr> </tbody> </table> </div>

48         return proxyHostIp;

</tr> </tbody> </table> </div>

49     }

</tr> </tbody> </table> </div>

50  

</tr> </tbody> </table> </div>

51     public void setProxyHostIp(String proxyHostIp) {

</tr> </tbody> </table> </div>

52         this.proxyHostIp = proxyHostIp;

</tr> </tbody> </table> </div>

53     }

</tr> </tbody> </table> </div>

54  

</tr> </tbody> </table> </div>

55     public Integer getProxyPort() {

</tr> </tbody> </table> </div>

56         return proxyPort;

</tr> </tbody> </table> </div>

57     }

</tr> </tbody> </table> </div>

58  

</tr> </tbody> </table> </div>

59     public void setProxyPort(Integer proxyPort) {

</tr> </tbody> </table> </div>

60         this.proxyPort = proxyPort;

</tr> </tbody> </table> </div>

61     }

</tr> </tbody> </table> </div>

62  

</tr> </tbody> </table> </div>

63     public SysNetProxyCfg(Integer id, Timestamp createDate,

</tr> </tbody> </table> </div>

64             Timestamp modifyDate, String name, String type, String proxyHostIp,

</tr> </tbody> </table> </div>

65             Integer proxyPort) {

</tr> </tbody> </table> </div>

66         super(id, createDate, modifyDate);

</tr> </tbody> </table> </div>

67         this.name = name;

</tr> </tbody> </table> </div>

68         this.type = type;

</tr> </tbody> </table> </div>

69         this.proxyHostIp = proxyHostIp;

</tr> </tbody> </table> </div>

70         this.proxyPort = proxyPort;

</tr> </tbody> </table> </div>

71     }

</tr> </tbody> </table> </div>

72  

</tr> </tbody> </table> </div>

73     public SysNetProxyCfg() {

</tr> </tbody> </table> </div>

74         super();

</tr> </tbody> </table> </div>

75     }

</tr> </tbody> </table> </div> </div> </div>

測試類:

76 }

</tr> </tbody> </table> </div>

01 package net.tjnwdseip.demo;

</tr> </tbody> </table> </div>

02  

</tr> </tbody> </table> </div>

03 import java.sql.Timestamp;

</tr> </tbody> </table> </div>

04 import java.util.HashMap;

</tr> </tbody> </table> </div>

05  

</tr> </tbody> </table> </div>

06 import net.tjnwdseip.entity.SysNetProxyCfg;

</tr> </tbody> </table> </div>

07 import net.tjnwdseip.util.CreateSqlTools;

</tr> </tbody> </table> </div>

08  

</tr> </tbody> </table> </div>

09 public class DemoTest {

</tr> </tbody> </table> </div>

10  

</tr> </tbody> </table> </div>

11      

</tr> </tbody> </table> </div>

12     public static void main(String[] args) {

</tr> </tbody> </table> </div>

13         // TODO Auto-generated method stub

</tr> </tbody> </table> </div>

14         SysNetProxyCfg netProxyCfg = new SysNetProxyCfg(1, Timestamp.valueOf("2012-05-04 14:45:35"), null, "netProxyCfgName", "netProxyCfgType", "000.000.000.000", 0);

</tr> </tbody> </table> </div>

15         HashMap<String, String> fixedParams=new HashMap<String,String>();

</tr> </tbody> </table> </div>

16         fixedParams.put("createDate", "NOW()");

</tr> </tbody> </table> </div>

17         fixedParams.put("modifyDate", "NOW()");

</tr> </tbody> </table> </div>

18         System.out.println(CreateSqlTools.getDeleteSql(netProxyCfg));

</tr> </tbody> </table> </div>

19         System.out.println(CreateSqlTools.getDeleteSql(netProxyCfg, true));

</tr> </tbody> </table> </div>

20         System.out.println(CreateSqlTools.getInsertSql(netProxyCfg));

</tr> </tbody> </table> </div>

21         System.out.println(CreateSqlTools.getInsertSql(netProxyCfg, fixedParams));

</tr> </tbody> </table> </div>

22         System.out.println(CreateSqlTools.getSelectAllSql(netProxyCfg));

</tr> </tbody> </table> </div>

23         System.out.println(CreateSqlTools.getUpdateSql(netProxyCfg));

</tr> </tbody> </table> </div>

24         System.out.println(CreateSqlTools.getUpdateSql(netProxyCfg, true));

</tr> </tbody> </table> </div>

25         System.out.println(CreateSqlTools.getUpdateSql(netProxyCfg, true, fixedParams));

</tr> </tbody> </table> </div>

26     }

</tr> </tbody> </table> </div>

27  

</tr> </tbody> </table> </div> </div> </div>

測試結果:
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
DELETE FROM sysNetProxyCfg WHERE id=1
INSERT INTO sysNetProxyCfg (createDate,name,type,proxyHostIp,proxyPort) VALUES ('2012-05-04 14:45:35.0','netProxyCfgName','netProxyCfgType','000.000.000.000',0)
INSERT INTO sysNetProxyCfg (modifyDate,createDate) VALUES (NOW(),NOW())
SELECT id,createDate,modifyDate,name,type,proxyHostIp,proxyPort FROM sysNetProxyCfg
UPDATE sysNetProxyCfg SET createDate='2012-05-04 14:45:35.0',name='netProxyCfgName',type='netProxyCfgType',proxyHostIp='000.000.000.000',proxyPort=0
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
UPDATE sysNetProxyCfg SET modifyDate=NOW(),createDate=NOW() WHERE id=1

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!

推薦閱讀

JAVA 反射+注釋,根據實體類對象生成SQL語句工具類

由于覺得配置Hibernate過于繁瑣,索性使用了spring的jdbc,可是又要寫很多的sql語句,為了偷偷懶,于是就寫個能通過實體類對象生成SQL語句的工具類。 目前只在MySql數據庫上實...

sql 語句

select e1.first_name from s_emp e1 , s_emp e2 where e1.dept_id = e2.dept_id(+) 等價于 select e1.firs...

java反射機制:代理類、動態代理類

代理類與委托類的關系: 代理類與委托類具有相同的接口,但委托類是接口的真正實現者,代理類只是調用委托類的相關方法來提供特定的服務,代理類可以為委托類預處理信息、把信息傳遞給委托類處理并進行事后處...

深入Java類、對象 與 Static

深入 Java 類、對象與 Static 今日閑來無事,室外都快成烤箱了。。。 So ,沒事做就仔細研究了一下 Java 的類、對象和 Static 的關系。剛開始學習 Java 的時候,對著 ...
28 }
  • sesese色