HikariCP 简易ORM


我们已经总结了一个 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
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
{0}
{5}
{1}
{2}回复
{4}
*昵称:
*邮箱:
个人站点:
*想说的话: