您的位置:首页 > 数据库

JFinal model简单包装,版本2

2015-08-03 23:56 435 查看
对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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息