/** * 根据传入的SQL,构造一个用于COUNT(*)查询的SQL * * @param sql 传入的sql语句,可以包含'?'占位符和具名占位符 * @param args 替换sql中占位符的值,或者对应具名占位符的Map * @see li.dao.QueryBuilder#setArgs(String, Object[]) */ public String countBySql(String sql, Object[] args) { if (!Verify.startWith(sql, "SELECT")) { // 不以SELECT开头 sql = "SELECT COUNT(*) FROM " + beanMeta.table + " " + sql; } else if (!Verify.regex(sql.toUpperCase(), "COUNT\\(.*\\)")) { // 不包括COUNT(*) sql = "SELECT COUNT(*) FROM " + sql.substring(sql.toUpperCase().indexOf("FROM") + 4, sql.length()).trim(); } int index = sql.toUpperCase().indexOf("LIMIT"); if (index > 0) { sql = sql.substring(0, index); // 去掉limit部分 } return setArgs(sql, args); // 处理args }
protected void setRequestURL(String path, String method) { path = Verify.startWith(path, "/") ? path : "/" + path; // request.setRequestURI(path); // request.setMethod(method); // request.setServletPath(path); Action action = ActionContext.getInstance().getAction(path, method); // Context.init(request, response, action); }
/** 根据传入的对象构建一个插入一条记录的SQL,忽略为空的属性 */ public String insertIgnoreNull(Object entity) { String columns = " (", values = " VALUES ("; for (Field field : beanMeta.fields) { Object fieldValue = Reflect.get(entity, field.name); if (!Verify.isEmpty(fieldValue)) { // 略过为null的属性 columns += field.column + ","; values += wrap(fieldValue) + ","; } } columns = columns.substring(0, columns.length() - 1) + ")"; values = values.substring(0, values.length() - 1) + ")"; return "INSERT INTO " + beanMeta.table + columns + values; }
/** 根据传入的对象构建一个用于更新一条记录的SQL,忽略对象中值为null的属性 */ public String updateIgnoreNull(Object entity) { String sql = "UPDATE " + beanMeta.table + " SET "; for (Field field : beanMeta.fields) { Object fieldValue = Reflect.get(entity, field.name); if (!beanMeta.getId().name.equals(field.name) && !Verify.isEmpty(fieldValue)) { // 更新所有属性,fieldValue可能为null sql += field.column + "=" + wrap(fieldValue) + ","; } } Object id = Reflect.get(entity, beanMeta.getId().name); return sql.substring(0, sql.length() - 1) + " WHERE " + beanMeta.getId().column + "=" + wrap(id); }
/** * 通过扫描对象结构及注解的方式得到一个类型的属性列表 List<Field>,根据类名缓存 * * @param targetType 目标对象 * @param annotated 是否只列出有Field注解的字段 */ public static List<Field> list(Class<?> targetType, Boolean annotated) { List<Field> fields = FIELDS_MAP.get("class#" + targetType.getName() + "#annotated#" + annotated); if (null == fields) { // 如果缓存中没有 log.info("Field.list() by type " + targetType.getName()); fields = new ArrayList<Field>(); java.lang.reflect.Field[] declaredFields = targetType.getDeclaredFields(); for (java.lang.reflect.Field field : declaredFields) { li.annotation.Field column = field.getAnnotation(li.annotation.Field.class); if (!annotated || null != column) { // 如果不需要Field注解或者Field注解不为空 li.model.Field attribute = new li.model.Field(); attribute.name = field.getName(); attribute.column = (null == column || Verify.isEmpty(column.value())) ? field.getName() : column.value(); fields.add(attribute); } } if (Object.class != targetType.getSuperclass()) { // 扫描超类的Field fields.addAll(list(targetType.getSuperclass(), annotated)); } FIELDS_MAP.put("class#" + targetType.getName() + "#annotated#" + annotated, fields); // 加入缓存 } return fields; }
/** 使用传入的SQL和参数,构造一个用于查询一条记录的SQL */ public String findBySql(String sql, Object[] args) { if (!Verify.startWith(sql, "SELECT")) { // 添加SELECT * FROM table 部分 sql = "SELECT * FROM " + beanMeta.table + " " + sql; } return setArgs(sql, args); // 先处理别名,再处理page }
/** * 根据传入的SQL,构建一个用于删除若干条记录的SQL * * @param sql 传入的sql语句,可以包含'?'占位符和具名占位符 * @param args 替换sql中占位符的值,或者对应具名占位符的Map * @see li.dao.QueryBuilder#setArgs(String, Object[]) */ public String deleteBySql(String sql, Object[] args) { if (!Verify.startWith(sql, "DELETE")) { sql = "DELETE FROM " + beanMeta.table + " " + sql; } return setArgs(sql, args); // 处理args }
/** 为SQL添加分页语句 */ public String setPage(String sql, Page page) { if (!Verify.contain(sql, "LIMIT") && null != page) { // 分页 return sql + " LIMIT " + page.getFrom() + "," + page.getPageSize(); } return sql; }
/** * 根据传入的SQL,构建一个用于更新若干条记录的SQL * * @param sql 传入的sql语句,可以包含'?'占位符和具名占位符 * @param args 替换sql中占位符的值,或者对应具名占位符的Map * @see li.dao.QueryBuilder#setArgs(String, Object[]) */ public String updateBySql(String sql, Object[] args) { if (!Verify.startWith(sql, "UPDATE")) { sql = "UPDATE " + beanMeta.table + " " + sql; } return setArgs(sql, args); // 处理args }
/** * 根据传入的SQL和page,构造一个用于分页查询的SQL * * @param page 分页对象 * @param sql 传入的sql语句,可以包含'?'占位符和具名占位符 * @param args 替换sql中占位符的值,或者对应具名占位符的Map * @see li.dao.QueryBuilder#setPage(String, Page) * @see li.dao.QueryBuilder#setArgs(String, Object[]) */ public String listBySql(Page page, String sql, Object[] args) { if (!Verify.startWith(sql, "SELECT")) { // 添加SELECT * FROM table 部分 sql = "SELECT * FROM " + beanMeta.table + " " + sql; } return setPage(setArgs(sql, args), page); // 先处理别名,再处理args,最后处理page }