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));

	}
}

测试结果:




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值