• 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

  • 相关阅读:
    显卡关键词
    为照顾IE6尽量不要margin和padding
    如何保证一个类只有一个实例(1)
    显示列表(display list)
    AutoCAD2007与Office2007冲突
    虚函数(1)
    字符串对象的属性
    细读cow.osg
    常量折叠(const folding)与复写传播 (copy propagation)
    .NET Framework 3.5 sp1离线安装
  • 原文地址:https://www.cnblogs.com/jpfss/p/11358293.html
Copyright © 2020-2023  润新知