java實現從實體到SQL語句的轉換


使用過Hibernate,EF之類的ORM框架都知道一般的CRUD之類的簡單操作,只要調用框架封裝好了的方法,框架就自動生成相應的SQL語句了,參照實習公司給的代碼,那個是C#版的,今天弄了一下java的,這里介紹怎么從實體轉換為標准的Insert SQL語句,其他的也差不多

思路很簡單:只要獲取得了實例化后的類的信息,之后再進行組裝

關於如何獲取java類信息,我參照了:java獲取對象屬性類型、屬性名稱、屬性值 這篇博客

由於個人水平的問題,這里還有一些bug:


1.約定實體的主鍵命名為“id”且由數據庫庫自動生成(如果想要自己設置id的值可以注釋下面的代碼),這里可以進行判斷,不過有點麻煩就算了,所以自己弄了一個約定

if (list.get(i).get("f_name").toString() == "id") i++;
  
  
 
 
         

2.屬性類型為數值類型時,沒有手動賦值時會自動賦值為0,所以期待大神們幫忙解決


在代碼里面也有標注;


下面是示例,這里我只寫了生成Insert語句的方法,如下:


為了演示代碼的通用性,首先准備兩個不同的實體類:User 和 Book

User類:


   
   
  
  
          
  1. package com.tan.ctesql;
  2. public class User {
  3. private int id;
  4. private String name;
  5. private String email;
  6. private String sex;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. public String getSex() {
  26. return sex;
  27. }
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31. }

Book類:


   
   
  
  
          
  1. package com.tan.ctesql;
  2. public class Book {
  3. private int id;
  4. private String name;
  5. private String date;
  6. private float price;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getDate() {
  20. return date;
  21. }
  22. public void setDate(String date) {
  23. this.date = date;
  24. }
  25. public float getPrice() {
  26. return price;
  27. }
  28. public void setPrice(float price) {
  29. this.price = price;
  30. }
  31. }

下面就是生成SQL語句的方法了:


   
   
  
  
          
  1. package com.tan.ctesql;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. public class CreateInsert<T> {
  9. public String createinsert(T entity) {
  10. String sql = "Insert into ";
  11. String column = ""; // 列
  12. String c_values = ""; // 列值
  13. List< Map< String, Object>> list = getFiledsInfo(entity);
  14. sql += list.get( 0).get( "obj_name").toString() + " ";
  15. for (int i = 0; i < list.size(); i++) {
  16. //約定id在數據庫自動生成-20130807
  17. if (list.get(i).get( "f_name").toString() == "id")
  18. i++;
  19. if (list.get(i).get( "f_value") != null) {
  20. // System.out.println("屬性數據類型:" + list.get(i).get("f_type"));
  21. column += list.get(i).get( "f_name") + ",";
  22. c_values += "'" + list.get(i).get( "f_value") + "',";
  23. }
  24. }
  25. sql += "(" + column.substring( 0, column.length() - 1) + ") values ("
  26. + c_values.substring( 0, c_values.length() - 1) + ");";
  27. return sql;
  28. }
  29. /**
  30. * 根據屬性名獲取屬性值
  31. * */
  32. protected Object getFieldValueByName( String fieldName, Object o) {
  33. try {
  34. String firstLetter = fieldName.substring( 0, 1).toUpperCase();
  35. String getter = "get" + firstLetter + fieldName.substring( 1);
  36. Method method = o.getClass().getMethod(getter, new Class[] {});
  37. Object value = method.invoke(o, new Object[] {});
  38. return value;
  39. } catch (Exception e) {
  40. // log.error(e.getMessage(), e);
  41. return null;
  42. }
  43. }
  44. /**
  45. * 類名(obj_name)獲取屬性類型(f_type),屬性名(f_name),屬性值(f_value)的map組成的list
  46. * */
  47. @SuppressWarnings( "unused")
  48. protected List getFiledsInfo( Object o) {
  49. String obj_name = o.getClass().getSimpleName().toString();
  50. Field[] fields = o.getClass().getDeclaredFields();
  51. String[] fieldNames = new String[fields.length];
  52. List< Map> list = new ArrayList();
  53. Map< String, Object> infoMap;
  54. for (int i = 0; i < fields.length; i++) {
  55. infoMap = new HashMap< String, Object>();
  56. infoMap.put( "obj_name", obj_name);
  57. infoMap.put( "f_type", fields[i].getType().toString());
  58. infoMap.put( "f_name", fields[i].getName());
  59. infoMap.put( "f_value", getFieldValueByName(fields[i].getName(), o));
  60. list.add(infoMap);
  61. }
  62. return list;
  63. }
  64. // // 判斷屬性類型
  65. // protected boolean checkType(String f_type) {
  66. // if (f_type.equals("int") || f_type.equals("float")
  67. // || f_type.equals("double")) {
  68. //
  69. // return true;
  70. // }
  71. // return false;
  72. // }
  73. //
  74. // // 轉換
  75. // protected boolean convert(String f_value) {
  76. //
  77. // if (Integer.parseInt(f_value) == 0)
  78. // return false;
  79. // return true;
  80. //
  81. // }
  82. }

最后是測試代碼:


   
   
  
  
          
  1. package com.tan.ctesql;
  2. import static org.junit.Assert.*;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map;
  8. import org.junit.Test;
  9. public class MyTest {
  10. @Test
  11. public void test() {
  12. // fail("Not yet implemented");
  13. User user = new User();
  14. //user.setId(1);
  15. user.setName( "Tan");
  16. user.setEmail( "tan@sina.cn");
  17. user.setSex( "boy");
  18. Date dt = new Date();
  19. SimpleDateFormat sf= new SimpleDateFormat( "yyyy-MM-dd");
  20. Book book = new Book();
  21. book.setName( "精通SQL");
  22. book.setPrice( 100);
  23. book.setDate(sf.format(dt));
  24. CreateInsert ci = new CreateInsert();
  25. // User
  26. System.out.println( "生成User的插入SQL語句:" + ci.createinsert(user));
  27. //Book
  28. System.out.println( "生成Book的插入SQL語句:" + ci.createinsert(book));
  29. }
  30. }

測試結果:



原文地址:https://blog.csdn.net/mr_tank_/article/details/9816771


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM