使用过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

java实现从实体到SQL语句的转换的更多相关文章

  1. java实现从实体到SQL语句的转换(二)

    前面写过一篇生成insert语句的博客,今天把CRUD的都完善了一下,需要的上次写的获取实体信息的类,这里就不贴出来了[点击打开查看] 下面是完整的代码: package tan.code.utils ...

  2. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  3. SqlServer数据库表生成C# Model实体类SQL语句——补充

    在sql语句最前边加上  use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html   --[SQL骚操作]SqlServer数据库表生成C ...

  4. Java下拼接运行动态SQL语句

    mod=viewthread&tid=3039" target="_blank">Java拼接动态SQL的一般做法有       1.使用动态语句 非常多数 ...

  5. Java下拼接执行动态SQL语句(转)

    在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...

  6. java for循环里面执行sql语句操作,有效结果只有一次,只执行了一次sql mybatis 循环执行update生效一次 实际只执行一次

    java后台controller中,for循环执行数据库操作,但是发现实际仅仅执行了一次,或者说提交成功了一次,并没有实际的个数循环 有可能是同一个对象导致的 可以仔细看一下下面两段代码有什么区别 p ...

  7. Java获取Date类型-针对SQL语句

    简便使用Date类型: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedState ...

  8. 【SQL骚操作】SqlServer数据库表生成C# Model实体类SQL语句

    已知现有表T1 想快速获取cs类结构 /// <summary> /// T1 /// </summary> public class T1 { /// <summary ...

  9. 【转发】SqlServer数据库表生成C# Model实体类SQL语句

    已知现有表T1 通过运行下面的sql即可,先配置表名. declare @TableName sysname = 'T1' declare @Result varchar(max) = ' /// & ...

随机推荐

  1. cf1147

    C——筛法 #include<bits/stdc++.h> using namespace std; ]; int main(){ cin>>n; ; ;i<=n;i++ ...

  2. win10 mysql5.7忘记密码如何解决

    点击开始菜单,搜索cmd.exe,左击以管理员身份运行 操作之前先备份好数据库(切忌) C:\Users\Administrator>cd C:\Program Files\MySQL\MySQ ...

  3. 将文件大小数值转换成B、KB、MB、GB

    //delphi 将文件大小数值转换成B/KB/MB/GB function FormatByteSize(const bytes: Longint): string; const B = 1; // ...

  4. flutter中的BuildContext

    https://www.jianshu.com/p/509b77b26b78

  5. P1922 女仆咖啡厅桌游吧

    P1922 女仆咖啡厅桌游吧 题目背景 小v带萌萌的妹妹去玩,妹妹想去女仆咖啡馆,小v想去桌游吧. 妹妹:“我问你个问题,答不对你就做我一天的奴隶,答对了就今天我就全部听你的.” 小v:“全部都听!? ...

  6. javascript中onclick(this)用法和onclick(this.value)用法介绍

    onclick(this.value)代码详解 <html> <head> <script language="javascript"> fun ...

  7. VS2010-MFC(图形图像:CDC类及其屏幕绘图函数)

    转自:http://www.jizhuomi.com/software/244.html 上一节讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类 ...

  8. Delphi编写后台监控软件

    Delphi编写后台监控软件         文章来源:Delphi程序员之家     后台监控软件,为了达到隐蔽监控的目的,应该满足正常运行时,不显示在任务栏上,在按Ctrl+Alt+Del出现的任 ...

  9. vue mounted组件的使用

    1.钩子函数  钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息.事件进行过滤,访问在正常情况下无法访问的消息.钩子的本质是一段用以处理系统消息的程序,通 ...

  10. Docker系列(三):Docker自定义容器镜像

    将容器编程镜像: docker commit [repo:tag] 网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具.修改配置,如果不做commit保存 起来,那么co ...