对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

转载于:https://blog.51cto.com/7041393/1681440

JFinal model简单包装,版本2相关推荐

  1. android:简单包装实现伪自定义DatePickerDialog和TimePickerDialog

    之所以写这个东西,是因为在我们的设计中需要给 日期选择器加一个标题,一开始直接使用 原生的 DatePickerAlertDialog ,因为他继承自 AlertDialog ,所以就直接 调用了 s ...

  2. python-ABM-mesa库:Agent Based Model 简单教程:可视化与排队论

    python-mesa:Agent Based Model 简单教程 教程链接:https://mesa.readthedocs.io/en/latest/tutorials/intro_tutori ...

  3. jfinal的简单使用(一)

    这些天,应公司的需求,说有个新项目需要用到jfinal框架,让我去了解一下.一开始抱着尝试的心态去耍一耍,然后发现这个框架是真的好用,虽然这些天的摸索也入了不少坑,还有好些功能没用上,但是评价还是两个 ...

  4. log双线性模型log-bilinear model简单概括

    LBLM(log-bilinear model)是自然语言处理中的比较简单的模型. LBLM根据上下文的词向量来预测下一个词向量wnw_nwn​,通过对上下文词向量的一个线性组合来表示: rwr_wr ...

  5. python配置opencv最简单_Python版本OpenCV安装配置及简单实例

    原博文 2018-06-03 14:52 − # 2018-06-03 # 1. Python下载:https://www.python.org/downloads/ 选择对应平台对应版本的的Pyth ...

  6. FullCalendar日历插件的简单使用(版本4.2.0)

    最近开的一个项目,涉及到了日历日程安排的功能,所以选用了一个免费的日历插件:FullCalendar 1.首先去官网将官方的demo下载下来,通过官方的demo进行一个初步的了解,下面正式开始 PS: ...

  7. 不借助任何工具将CLOVER引导添加进UEFI的正确姿势(简单暴力版本)

    经常安装hackintosh的同学会发现,安装完macOS后,需要做的第一件事情就要将EFI移进机器自带的磁盘中,同时添加CLOVER引导项到UEFI中以实现CLOVER引导加载macOS.通常的作法 ...

  8. VueJS的Frappe Charts的简单包装

    Vue 2 Frappe图表 (Vue 2 Frappe Charts) This is a simple package to get using Frappe Charts within VueJ ...

  9. 7-1 ysu小吃街 (100分)【思路超级简单的版本】

    燕大食堂为了改善学生伙食,新开了一条小吃街.这里共有n个摊位,剁椒鱼头.水煮肉片.牛奶冻.红烧狮子头--各种各样的美食数不胜数,散发着诱人的香气. SueJane和swoky非常开心地走进小吃街.这里 ...

最新文章

  1. php学习之道:WSDL具体解释(三)
  2. C/C++版数据结构之链表三
  3. b+树时间复杂度_深入理解数据库系统之存储存引擎(二叉搜索树)
  4. Determine destination location of apt-get install package?
  5. Windows客户机脱域问题及解决办法
  6. Leetcode PHP题解--D25 500. Keyboard Row
  7. LINUX下安装ORACLE,完全搞定
  8. 【机器学习】算法面试知识点整理(持续更新中~)
  9. 前端布局神器display:flex
  10. stm32f103移植到f0_STM32F042替换STM32F103
  11. mysql++pc客户端_Mysql超详细安装配置+客户端连接
  12. 葡萄城发布新版ActiveReports 9报表控件和报表服务器
  13. 一款基于Netty开发的WebSocket服务器
  14. oracle明文传输http,oracle密码在网络传输中的安全问题
  15. Authlib OAuth2.0
  16. 基于SSM的医院药品管理系统答辩PPT模板
  17. 深度学习实践指南(二)—— 符号编程
  18. 活动 | 腾讯×Nature Research:42问AI与机器人的未来
  19. matlab 定义离散函数,matlab离散点拟合函数
  20. 【18】processing-声音(中文)

热门文章

  1. 利用互斥体阻断想哭蠕虫,实现联网升级
  2. Linux Shell 简介
  3. Spring框架的设计理念与设计模式分析
  4. Silverlight实用窍门系列:51.Silverlight页面控件的放大缩小、Silverlight和Html控件的互相操作...
  5. 用一个按钮做主窗口,可以吗?
  6. Java的新项目学成在线笔记-day14(四)
  7. 关于flink的setCommitOffsetsOnCheckpoints
  8. FIR和IIR的区别+差分方程的单位冲激响应(matlab图解)
  9. error: 'syms' undefined near line 1 column 1
  10. ubuntu环境下一键切换python的virtualenv虚拟环境