JFinal model简单包装,版本2

对JFianl的Model 部分进一步的扩展,对QueryParams增加一个方法。今天增加的东西也不是很多。这几天有点懒了吧。


接下来就直接开始讲吧。

public Long countSqlResult(String sqlExceptSelect, Object... params) {
    List result = Db.query("SELECT COUNT(*) " + DbKit.replaceFormatSqlOrderBy(sqlExceptSelect), params);
    int size = result.size();
    if (size == 1) {
        return ((Number) result.get(0)).longValue();
    }
    return Long.valueOf(0);
}
public Long countSqlResult(String shql, Map<String, Object> attrs) {
    List<Object> params = new ArrayList<Object>();
    String sqlExceptSelect = QueryParams.toFormatSQL(shql, attrs, params);
    return countSqlResult(sqlExceptSelect, params.toArray());
}

以上这两个方法主要用来查询记录集的,第一个方法就不用介绍了吧。

我们讲讲 第二个方法,shql这个字符串差不多就是类似与hibernate里面有的一种sql语句, 就是条件参数不是用"?"保留,而是用对映的名称标识这样比较通俗易懂。

例子:

shql="select * from zz z where z.name = :name"
 attrs.put("name", "张三")
 countSqlResult(shql,attrs);

这个方法里面有用到这个方法:QueryParams.toFormatSQL(),之前在QueryParams有提到过这个方法,但之前的是只有第一个参数的。我将其扩展了一下吧。

代码如下:

/**
 * 
 * @param hsql
 * @param attrs
 * @param values
 * @return
 */
public static  String toFormatSQL(String hsql, Map<String, Object> attrs, List<Object> values) {
    Matcher matcher = Pattern.compile(":(\\w+)").matcher(hsql);
    while ( matcher.find()){
        String rexp = null;
        String group = matcher.group(1);
        Object ov = attrs.get(group);
        if (ov instanceof List)
        {
            StringBuilder sb = new StringBuilder();
            List vs = (List) ov;
            for (Object v : vs)
            {
                sb.append("?,");
                values.add(v);
            }
            sb.deleteCharAt(sb.length() - 1);
            rexp = sb.toString();
        }else
        {
            values.add(ov);
            rexp = "?";
        }
        hsql = hsql.replace(String.format(":%s", group), rexp);
    }
    return hsql;
}



接下来这两个方法就不用讲了吧,参数跟上面一样的意思

/**
*
*  例子:
*  queryOrNamedQuery="select * from zz z where z.name = :name"
* attrs.put("name", "张三")
* findFirstBySQLQuery(queryOrNamedQuery, attrs)
* @param queryOrNamedQuery
* @param attrs
* @return List
*/
public List<Map<String, Object>> findBySQLQuery(String queryOrNamedQuery, Map<String, Object> attrs) {
    List<Object> params = new ArrayList<Object>();
    String sql = QueryParams.toFormatSQL(queryOrNamedQuery, attrs, params);
    List<Record> records = Db.find(sql, params);
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    for (Record record : records) {
        list.add(record.getColumns());
    }
    return list;
}
/**
 * 获得一条记录
 * 例子:
 * queryOrNamedQuery="select * from zz z where z.name = :name"
 * attrs.put("name", "张三")
 * findFirstBySQLQuery(queryOrNamedQuery, attrs)
 *
 * @param queryOrNamedQuery
 * @param attrs
 * @return
 */
public Map<String, Object> findFirstBySQLQuery(String queryOrNamedQuery, Map<String, Object> attrs) {
    List<Object> params = new ArrayList<Object>();
    String sql = QueryParams.toFormatSQL(queryOrNamedQuery, attrs, params);
    List<Record> records = Db.find(sql, params);
    if (records.size() >= 1) {
        return records.get(0).getColumns();
    }
    return null;
}


接下来几个就比较简单了。批量操作


public boolean saveOrUpdate() {
        if (null == this.get(getPrimaryKey())) return save();
        return update();
    }
    public boolean saveAll(List<M> ms) {
        /**
         *  这样写确定好?
         */
        for (M m : ms) {
            if (!m.saveOrUpdate()) {
//                throw new ActiveRecordException("保存失败!");
                throw new ActiveRecordException("Save failed :" + m);
            }
        }
        return true;
   /*     int size = 0;
            if ((size = ms.size()) <= 0)
            {
               throw new ActiveRecordException("(List<M> is null ?");
            }
            Config config = this.getConfig();
            Table table = this.getTable();
            Connection conn = null;
            PreparedStatement pst = null;
            boolean result = false;
            StringBuilder sql = new StringBuilder();
            ArrayList paras = new ArrayList();
            config.getDialect().forModelSave(table, ms.get(0).getAttrs(), sql, paras);
            boolean e;
            try {
                conn = config.getConnection();
                if(config.getDialect().isOracle()) {
                    pst = conn.prepareStatement(sql.toString(), new String[]{table.getPrimaryKey()});
                } else {
                    pst = conn.prepareStatement(sql.toString(), 1);
                }
                config.getDialect().fillStatement(pst, paras);
                if (size >= 2 ){
                    for (int i = 1; i < size; i++ )
                    {
                        config.getDialect().forModelSave(table, ms.get(i).getAttrs(), sql, paras);
                        pst.addBatch();
                    }
                }
                int result1 = pst.executeUpdate();
                this.getGeneratedKey(pst, table);
                clear();
                e = result1 >= 1;
            } catch (Exception var12) {
                throw new ActiveRecordException(var12);
            } finally {
                config.close(pst, conn);
            }
            return e;*/
    }
    public boolean deleteAll(List<M> ms) {
        for (M m : ms) {
            if (!m.delete()) throw new ActiveRecordException("Delete failed :" + m);
        }
        return true;
    }
    public boolean deleteAllById(List<PK> ids) {
        for (PK id : ids) {
            if (!deleteById(id)) throw new ActiveRecordException("Delete failed :" + id);
        }
        return true;
    }
    /**
     * 按PK列表获取对象列表.
     *
     * @param ids 主键ID集合
     * @return List
     */
    public List<M> get(Collection<Object> ids) {
        if (ids.size() <= 0) {
            return Collections.emptyList();
        }
        QueryParams params = new QueryParams();
        params.addIn(getPrimaryKey(), ids);
        String sqlExceptSelect = params.toSqlExceptSelect(getTableName(), "m");
        return find(String.format("SELECT * %s", sqlExceptSelect), params.getParas().toArray());
    }



差不多就这样吧,今天没有写多少。

需要具体源码可以看我的github, github地址:https://github.com/cnzzs/zjf



你可能感兴趣的:(sql,jFinal,model简单包装)