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类:
- package com.tan.ctesql;
-
- public class User {
- private int id;
- private String name;
- private String email;
- private String sex;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getSex() {
- return sex;
- }
-
- public void setSex(String sex) {
- this.sex = sex;
- }
-
- }
Book类:
- package com.tan.ctesql;
-
- public class Book {
- private int id;
- private String name;
- private String date;
- private float price;
-
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getDate() {
- return date;
- }
- public void setDate(String date) {
- this.date = date;
- }
- public float getPrice() {
- return price;
- }
- public void setPrice(float price) {
- this.price = price;
- }
-
-
- }
下面就是生成SQL语句的方法了:
- package com.tan.ctesql;
-
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- public class CreateInsert<T> {
-
- public String createinsert(T entity) {
-
- String sql = "Insert into ";
- String column = ""; // 列
- String c_values = ""; // 列值
- List<Map<String, Object>> list = getFiledsInfo(entity);
- sql += list.get(0).get("obj_name").toString() + " ";
- for (int i = 0; i < list.size(); i++) {
-
- //約定id在數據庫自動生成-20130807
-
- if (list.get(i).get("f_name").toString() == "id")
- i++;
- if (list.get(i).get("f_value") != null) {
-
- // System.out.println("属性数据类型:" + list.get(i).get("f_type"));
- column += list.get(i).get("f_name") + ",";
- c_values += "'" + list.get(i).get("f_value") + "',";
- }
-
- }
- sql += "(" + column.substring(0, column.length() - 1) + ") values ("
- + c_values.substring(0, c_values.length() - 1) + ");";
-
- return sql;
- }
-
- /**
- * 根据属性名获取属性值
- * */
- protected Object getFieldValueByName(String fieldName, Object o) {
- try {
- String firstLetter = fieldName.substring(0, 1).toUpperCase();
- String getter = "get" + firstLetter + fieldName.substring(1);
- Method method = o.getClass().getMethod(getter, new Class[] {});
- Object value = method.invoke(o, new Object[] {});
- return value;
- } catch (Exception e) {
- // log.error(e.getMessage(), e);
- return null;
- }
- }
-
- /**
- * 类名(obj_name)获取属性类型(f_type),属性名(f_name),属性值(f_value)的map组成的list
- * */
- @SuppressWarnings("unused")
- protected List getFiledsInfo(Object o) {
-
- String obj_name = o.getClass().getSimpleName().toString();
- Field[] fields = o.getClass().getDeclaredFields();
- String[] fieldNames = new String[fields.length];
- List<Map> list = new ArrayList();
- Map<String, Object> infoMap;
-
- for (int i = 0; i < fields.length; i++) {
- infoMap = new HashMap<String, Object>();
-
- infoMap.put("obj_name", obj_name);
- infoMap.put("f_type", fields[i].getType().toString());
- infoMap.put("f_name", fields[i].getName());
- infoMap.put("f_value", getFieldValueByName(fields[i].getName(), o));
- list.add(infoMap);
- }
- return list;
- }
-
- // // 判断属性类型
- // protected boolean checkType(String f_type) {
- // if (f_type.equals("int") || f_type.equals("float")
- // || f_type.equals("double")) {
- //
- // return true;
- // }
- // return false;
- // }
- //
- // // 轉換
- // protected boolean convert(String f_value) {
- //
- // if (Integer.parseInt(f_value) == 0)
- // return false;
- // return true;
- //
- // }
-
- }
最后是测试代码:
- package com.tan.ctesql;
-
- import static org.junit.Assert.*;
-
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
-
- import org.junit.Test;
-
- public class MyTest {
-
- @Test
- public void test() {
- // fail("Not yet implemented");
-
- User user = new User();
- //user.setId(1);
- user.setName("Tan");
- user.setEmail("tan@sina.cn");
- user.setSex("boy");
-
- Date dt = new Date();
- SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
-
- Book book = new Book();
- book.setName("精通SQL");
- book.setPrice(100);
- book.setDate(sf.format(dt));
-
- CreateInsert ci = new CreateInsert();
- // User
- System.out.println("生成User的插入SQL語句:" + ci.createinsert(user));
- //Book
- System.out.println("生成Book的插入SQL語句:" + ci.createinsert(book));
-
- }
- }
测试结果:
原文地址:https://blog.csdn.net/mr_tank_/article/details/9816771