那些年,到处刮起了业务处理分层的大风,无论何时何地,都有某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)的更多相关文章

  1. MyBatis框架的XML数据访问Dao层接口的组合使用

    MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...

  2. Yii的学习(2)--数据访问对象 (DAO)

    摘自Yii官网:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.dao Yii提供了强大的数据库编程支持.Yii数据访问对象(DAO) ...

  3. FoxOne---一个快速高效的BS框架--数据访问(Dao)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  4. Spring 4 官方文档学习(十)数据访问之DAO支持

    1.介绍 Spring 中 Data Access Object (DAO)支持 的目标是以一种一致的方式更简单的使用JDBC.Hibernate.JPA或JDO等数据访问技术.可以在前面说的几种数据 ...

  5. view是视图层+action是控制层+service是业务层+dao是数据访问层。

  6. 数据访问层 (DAO)

    数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...

  7. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因

    package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...

  8. 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据

    package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...

  9. hibernate 入门([数据访问中间件] 开源框架)

    1.内容:  hibernate 也是一个经典的[数据访问中间件] 开源框架.    2.hibernate核心组件       SessionFactory[整个数据的操作]重量级组件       ...

  10. 三、Spring——数据访问

    1.Spring 对 DAO的支持 Spring支持目前大多数常用的数据持久化技术,Spring定义了一套面向DAO层的异常体系,并未各种支持的持久化技术提供了异常转换器.这样,我们在设计DAO接口时 ...

随机推荐

  1. npm ERR! code EINTEGRITY npm! ERR! shal-

    npm ERR! code EINTEGRITY npm ERR! sha1-nbqdpC/e8IOA7poHctXL5+bVXsE= integrity checksum failed when u ...

  2. python_IO编程

    本篇文章将介绍python里面的I/O编程.更多内容请参考:python学习指南 I/O编程 读写文件时最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们必须了解 ...

  3. [整理]Linux Crontab命令总结

    一.crontab命令的基本介绍 crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab" ...

  4. ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

    前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...

  5. HttpWebRequest中GetResponse或者说GetRequestStream偶尔超时,或者是各种操作超时造成的假死的一些解决方案

    今天用了将近一天的时间来查找这个问题的存在,不停的百度查找原因测试原因,发现解决方案很是简单,不过最好还好哦啊都解决了,在这里纪录一下,希望可以帮到你们 payload = System.Text.E ...

  6. DOM拓展表格小练习

    涉及的知识点 DOM操作HTML页面.DOM操控表格.一些基本的事件.遍历知识.数组字符串知识.函数的作用域知识 效果图 html代码 <body><div id="con ...

  7. 【JavaScript声明变量的规则】

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 洛谷 P1598 垂直柱状图【字符串+模拟】

    P1598 垂直柱状图 题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数.严格地按照输出样例来安排你的输出格式. ...

  9. BZOJ2441: [中山市选2011]小W的问题

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2441 首先要注意到x1>x3且x5>x3(要是没有这个设定就是树状数组水题了.. ...

  10. Coins、Tokens、山寨币:区别在哪里

    [译] Coins, Tokens & Altcoins: What's the Difference? coin:指"正宗的"数字货币,比如比特币 tokens:比如用 ...