• 数据访问(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

  • 相关阅读:
    高性能javascript 笔记 第一章 loading and executing (一)
    css 微信webui
    C语言之指针
    Java中的异常
    Java中的接口
    SQL Server中自连接和联合的用法
    SQL Server中多对多关系的实现
    SQL Server中用SQL命令建表和主外键约束
    SQL Server中的分页查询
    SQL Server中的内连接
  • 原文地址:https://www.cnblogs.com/hifong/p/5426752.html
Copyright © 2020-2023  润新知