HikariCP 简易ORM

时间 2018/6/19 23:21:40 加载中...

我们已经总结了一个 SQLHelper 了 ,有

int add(String sql, List<Object> params)
int update(String sql,List<Object> params)
<T> List<T> query(String sql, List<Object> params, Class<T> type)
<T> PageResult<T> queryPage(String sql, List<Object> params, int currentPage, int pageSize, Class<T> type)

四个基本方法了。


ORM


通过指定类和实体自动生成  sql 和 参数?通过 反射 


public class SqlString {

	public static <T> String toInsertSql(Class<T> type) {
		String classname = type.getSimpleName();

		List<Field> fields = filterFields(type);
		String[] values = new String[fields.size()];
		for (int i = 0; i < values.length; i++) {
			values[i] = "?";
		}
		String valStr = String.join(",", values);

		String[] cols = new String[fields.size()];
		for (int i = 0; i < fields.size(); i++) {
			cols[i] = fields.get(i).getName();
		}
		String colStr = String.join(",", cols);

		return MessageFormat.format("insert {0}({1}) values({2})", classname, colStr, valStr);
	}

	public static <T> List<Object> toInsertParams(T instance) throws IllegalArgumentException, IllegalAccessException {

		ArrayList<Object> params = new ArrayList<Object>();

		Class<?> type = instance.getClass();
		List<Field> fields = filterFields(type);
		for (Field field : fields) {
			field.setAccessible(true);
			Object val = field.get(instance);

			params.add(val);
		}

		return params;
	}

	private static <T> List<Field> filterFields(Class<T> type) {
		ArrayList<Field> list = new ArrayList<Field>();

		String className = type.getSimpleName();

		Field[] fields = type.getDeclaredFields();
		for (Field field : fields) {
			if (field.getName().equalsIgnoreCase("id") || field.getName().equalsIgnoreCase(className + "id")) {
				continue;
			}
			list.add(field);
		}

		return list;
	}

	private static <T> Field primaryField(Class<T> type) throws Exception {

		String className = type.getSimpleName();

		Field[] fields = type.getDeclaredFields();
		for (Field field : fields) {
			if (field.getName().equalsIgnoreCase("id") || field.getName().equalsIgnoreCase(className + "id")) {
				return field;
			}
		}
		
		throw new Exception("没有主键( [id] 或 [表名id] )");
	}

	public static <T> String toUpdateSql(Class<T> type) throws Exception {

		/* update user set username = ? where userid = ? */

		String classname = type.getSimpleName();

		List<Field> fields = filterFields(type);
		String[] cols = new String[fields.size()];
		for (int i = 0; i < fields.size(); i++) {
			cols[i] = MessageFormat.format("{0} = ?", fields.get(i).getName());
		}
		String colStr = String.join(",", cols);

		Field primaryField = primaryField(type);				
		String whereStr = MessageFormat.format("{0} = ?", primaryField.getName());

		return MessageFormat.format("update {0} set {1} where {2}", classname, colStr, whereStr);
	}
	
	public static <T> List<Object> toUpdateParams(T instance) throws Exception {

		ArrayList<Object> params = new ArrayList<Object>();

		Class<?> type = instance.getClass();
		List<Field> fields = filterFields(type);
		for (Field field : fields) {
			field.setAccessible(true);
			Object val = field.get(instance);

			params.add(val);
		}
		
		Field primaryField = primaryField(type);
		primaryField.setAccessible(true);
		params.add(primaryField.get(instance));

		return params;
	}
}


上面给出了生成insert语句和update语句的方法。

根据给出的 类型,通过反射,获取类型的字段名称来生成 SQL 语句。

这里的更新语句是根据id(或[表明id])来更新的。


在使用的时候,如何使用呢?


public static int add(User user) throws IllegalArgumentException, IllegalAccessException {
	String sql = SqlString.toInsertSql(User.class);
	List<Object> params = SqlString.toInsertParams(user);
	print(sql);
	print(params);
	int val = SQLHelper.add(sql, params);
	return val;
}

public static int update(User user) {
	
	try {		
		String sql = SqlString.toUpdateSql(User.class);
		List<Object> params = SqlString.toUpdateParams(user);
		print(sql);
		print(params);
		
		int val = SQLHelper.update(sql, params);
		return val;
		
	} catch (Exception e) {
		e.printStackTrace();
	}	
	
	return -1;
}

public static void print(Object obj) {
	System.out.println(obj);
}


其实本质是还是调用的 SQLHelper 中的方法,只不过我们不再手动写 SQL 语句了而已。

扫码分享
版权说明
作者:SQBER
文章来源:http://blog.sqber.com/articles/HikariCP-simple-orm.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。