数据访问(DAO)
那些年,到处刮起了业务处理分层的大风,无论何时何地,都有某MVC框架、Spring管理的Service、以及iBatis和Hibernate等代表的DAO,SSH、SSI等成了标准。然而,我们仔细研究这些代码时,真得很有必要么?
其一,DAO的实现,以Hibernate为例,UserDAO.create(User user),其中user可以是有很多属性的,但在这个方法中,我们传入的是一个user对象,很多属性提供给后来者并不清晰,哪些是必须的,又哪些是可选的。
其二,DAO的最后使用,基本上有DAO的地方都有Service,似乎DAO是被Service代理了,类似代码:
UserService.create(User user) {UserDAO.cerate(user);};
在上面的这些场景,甚至更多的场景,DAO作为一层完全没有必要,作为Service的一个辅助实现才是最佳的处理手段。
在flying中,DAO不再是一独立的层,通过声明的DAO注解和Param注解,在运行时,完成DAO处理,代码如下:
@Service("UserService")
public class UserService extends AbstractService{
@DaoCreate(entity="security.user")
public Data create(
@Param(value="username", required=true)String username,
@Param(value="password",required=true)String password,
@Param(value="org_name",required=true)String org_name,
@Param(value="real_name",required=true)String real_name) throws Exception {
return null;
}
@DaoUpdate(entity="security.user")
public Data update(
@Param(value="org_name",required=true)String org_name,
@Param(value="real_name",required=true)String real_name,
@Param(value="user_id",required=true)long user_id) throws Exception {
return null;
}
@DaoUpdate(entity="security.user")
public Data changePassword(
@Param(value="password",required=true)String password,
@Param(value="user_id",required=true)long user_id) throws Exception {
return null;
}
@DaoRemove(entity="security.user")
public Data remove(
@Param(value="user_id",required=true)long user_id) throws Exception {
return null;
}
@DaoRemove(entity="security.user")
public Data removeByUsername(
@Param(value="username",required=true)String username) throws Exception {
return null;
}
@DaoQuery(single=true, entity="security.user.perms")
public Data findByUsernamePassword(@Param(value="username",required=true)String username,
@Param(value="password",required=true)String password) throws Exception {
return null;
}
}
对于DaoCreate,运行时会根据entity属性生成对应的insert语句,并使用参数中的值完成sql执行。
实现原理:运行时,服务消费者调用服务方法,服务执行引擎解析服务方法相关的注解,并提取相关的服务参数,使用服务参数以及注解相关的参数拼装sql,如insert 的sql,并在jdbcTemplate中完成执行。
对于DaoCreate,所有的方法参数均是insert xx values(?,?)中的参数,其他的细节欢迎参加技术讨论群讨论。
框架源码:https://github.com/hifong/flying
Demo应用:https://github.com/hifong/pas
技术QQ群:455852142
数据访问(DAO)的更多相关文章
- MyBatis框架的XML数据访问Dao层接口的组合使用
MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...
- Yii的学习(2)--数据访问对象 (DAO)
摘自Yii官网:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.dao Yii提供了强大的数据库编程支持.Yii数据访问对象(DAO) ...
- FoxOne---一个快速高效的BS框架--数据访问(Dao)
FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...
- Spring 4 官方文档学习(十)数据访问之DAO支持
1.介绍 Spring 中 Data Access Object (DAO)支持 的目标是以一种一致的方式更简单的使用JDBC.Hibernate.JPA或JDO等数据访问技术.可以在前面说的几种数据 ...
- view是视图层+action是控制层+service是业务层+dao是数据访问层。
- 数据访问层 (DAO)
数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...
- servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因
package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...
- 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据
package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...
- hibernate 入门([数据访问中间件] 开源框架)
1.内容: hibernate 也是一个经典的[数据访问中间件] 开源框架. 2.hibernate核心组件 SessionFactory[整个数据的操作]重量级组件 ...
- 三、Spring——数据访问
1.Spring 对 DAO的支持 Spring支持目前大多数常用的数据持久化技术,Spring定义了一套面向DAO层的异常体系,并未各种支持的持久化技术提供了异常转换器.这样,我们在设计DAO接口时 ...
随机推荐
- 多个JDK使用批处理命令切换JDK版本
本篇博客参考的链接 http://blog.csdn.net/hu199055/article/details/70145389 https://www.cnblogs.com/xdp-gacl/p/ ...
- Java--高效的定时任务设计
相信你在日常的开发中肯定遇到过这种问题: 需要对实体类的状态信息进行管理,比如一定时间后修改它为XXX状态. 举个例子: 订单服务,当用户提交了订单后,如果在30分钟内没有支付,自动取消订单,这就是一 ...
- \(?0\d{2}[) -]?\d{8}正则表达式的解释
正则表达式30分钟出现了这样一个正则表达式:(?0\d{2}[) -]?\d{8} "("和")"也是元字符,所以需要转义. ?匹配零或一次 (? 表示 出现( ...
- 有具体名称的匿名函数var bar = function foo(){}
http://kangax.github.io/nfe/ 命名的函数表达式 函数表达式实际上可以经常看到.Web开发中的一个常见模式是基于某种特性测试来"分叉"函数定义,从而获得最 ...
- LevelDB的源码阅读(四) Compaction操作
leveldb的数据存储采用LSM的思想,将随机写入变为顺序写入,记录写入操作日志,一旦日志被以追加写的形式写入硬盘,就返回写入成功,由后台线程将写入日志作用于原有的磁盘文件生成新的磁盘数据.Leve ...
- Elastic Stack之kibana入门
为了解决公司的项目在集群环境下查找日志不便的问题,我在做过简单调研后,选用Elastic公司的Elastic Stack产品作为我们的日志收集,存储,分析工具. Elastic Stack是ELK(E ...
- 下载的js文件本地编辑器打开中文乱码如何解决
今天遇到的小问题,已解决,直接上图 下载直接打开是这样的 用记事本打开 另存为utf-8格式 正常了!
- HDU5131-Song Jiang's rank list HDU5135-Little Zu Chongzhi's Triangles(大佬写的)
Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java ...
- Xshell无法连接到LINUX虚拟机
首先与遇到的情况是,在虚拟机下安装了Linux后,xshell无法连接远程的虚拟机. 我遇到的情况是虚拟机可以ping 主机,主机确ping不了虚拟机. 使用的VM设置了两个网卡,一个nat 一个h ...
- 4层板的pcb创建
四层板的制作可以在原先的二层板上增加层,(软件为AD17)方法如下: 一.单击Design->Layer Stack Manager菜单(快捷键为DK),将弹出以下的界面: 二,选择上图中的Ad ...