예제 #1
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /**
  * 根据传入的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
 }
예제 #2
0
  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);
  }
예제 #3
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /** 根据传入的对象构建一个插入一条记录的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;
 }
예제 #4
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /** 根据传入的对象构建一个用于更新一条记录的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);
 }
예제 #5
0
파일: Field.java 프로젝트: richxnh/li
 /**
  * 通过扫描对象结构及注解的方式得到一个类型的属性列表 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;
 }
예제 #6
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /** 使用传入的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
 }
예제 #7
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /**
  * 根据传入的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
 }
예제 #8
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /** 为SQL添加分页语句 */
 public String setPage(String sql, Page page) {
   if (!Verify.contain(sql, "LIMIT") && null != page) { // 分页
     return sql + " LIMIT " + page.getFrom() + "," + page.getPageSize();
   }
   return sql;
 }
예제 #9
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /**
  * 根据传入的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
 }
예제 #10
0
파일: QueryBuilder.java 프로젝트: hooqee/li
 /**
  * 根据传入的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
 }