`
microye
  • 浏览: 21389 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JROO JDBC,一个ORM急速开发框架

阅读更多

 

 

  • jroo 1.0版从去年底开源以来,因为一些原因一直没有发布新版本,对不起关注jroo的朋友,这里表示一下歉意。

    jroo 1.0版包含的东西很多,有cms、工作流、页面组件、很多的jquery插件等,有不少网友觉得这个版本的东西有点多、有点乱。

    jroo的新版本,我把它称为jroo 2.0,其实在今年4月份就完成的差不多了。在今后的一些日子里,我会参考这些网友的意见,会以一种合适的方式开源出来。

    如果打个比方,jroo 1.0版类似于strus1,jroo 2.0就类似于strus2.0。

    jroo 1.0 版的jdbc部分没有独立出来,2.0版本把它独立了出来,使它成为一个独立的ORM框架,现在先把它开源出来。

    我把它成为jroo-jdbc orm框架。

    目前这个框架已在多个项目中成功使用,极大的提高了开发效率和维护成本。

    欢迎感兴趣的朋友使用,如果你愿意再给我提提意见和建议,我将非常的欢迎和感谢。

    一、这里不讨论Hibernate、Mybatis这些成熟的ORM框架,只要你抽出5分钟的时间,就能明白jroo-jdbc,并能使用它。

    二、jroo-jdbc的目标是:对于Dao层开发,只要你熟悉SQL语句的编写就足够了。

    三、所需技能: 
          1)、熟悉SQL语句的编写、 
          2)、熟悉Freemarker的少量语法。

    四、需开发的代码: 
          1)、一个DAO接口、 
          2)、一个包含SQL语句的xml文件。

    五、先来看一个简单的例子:

    1)、一个DAO接口: 
    @Dao 
    public interface UserDao { 

    //新增用户 
    @InsertEntity 
    public int save(SysUser user); 

    //更新用户 
    @UpdateEntity 
    public int update(SysUser user); 

    //根据用户Id,删除用户 
    //在UserDao.xml中,有一个id为deleteUserByIds的sql与其对应 
    @Delete 
    public int deleteUserByIds(@Param("ids")String...ids); 

    //根据用户名查询用户 
    //直接在接口方法上写sql语句 
    @Select("select * from sys_user where user_name =:userName") 
    public SysUser findUserByUserName(@Param("userName")String userName); 

    //根据用户Id,查询用户 
    //在UserDao.xml中,有一个id为findUserById的sql与其对应 
    @Select 
    public SysUser findUserById(@Param("id")String id); 

    //根据用户名和密码,查询用户 
    //在UserDao.xml中,有一个id为findUserByLoginNameAndPassword的sql与其对应 
    @Select 
    public SysUser findUserByLoginNameAndPassword( 
            @Param("login_name")String loginName, 
            @Param("pass_word")String passWord); 

    //按多个条件,分页查询用户 
    //首先在UserDao.xml中查找一个id为findUserPage的sql, 
    //如果找到则使用该sql语句,如果未找到,将去所有其他sql xml文件中查找 
    @Select(id="user.findUsers") 
    public Page<Map<String,Object>> findUserPage( 
            Page<Map<String,Object>> page, 
           @Param("paramMap ")Map<String,?> paramMap); 

    }

    2)、该DAO接口对应的一个XML文件:UserDao.xml,这个XML文件的内容如下: 
    <?xml version="1.0" encoding="UTF-8" ?> 
    <!DOCTYPE sqls PUBLIC 
    "-//jroo.com//DTD sqls Configuration 1.0//EN" 
    "http://jroo.com/dtds/sqls-1.0.dtd"
    <sqls> 
    <sql id="deleteUserByIds" desc="由id删除用户"> 
         <![CDATA[ 
             delete from sys_user where id in (:ids) 
         ]]> 
    </sql> 

    <sql id="findUserById" desc="由id查询用户"> 
         <![CDATA[ 
            select * from sys_user where id=:id 
         ]]> 
    </sql> 

    <sql id="findUserByLoginNameAndPassword" desc="由用户名和密码,查询用户"> 
          <![CDATA[ 
               select * 
               from sys_user 
               where login_name =:login_name and pass_word =:pass_word 
          ]]> 
    </sql> 

    <sql id="user.findUsers" desc="按条件查询用户 "> 
         <![CDATA[ 
               select u.*,d.dept_name 
               from sys_user u,sys_dept d 
               where 1=1 
                 <#--各种查询条件,如:—> 
                 <#if paramMap.roleId?? && paramMap.roleId!=''> 
                      and u.id=ur.user_id and ur.role_id =: paramMap.roleId 
                 </#if> 
                 <#if paramMap.userIdList ?? && (paramMap.userIdList?size>0) > 
                     and u.id in (:paramMap.userIdList) 
                 </#if> 
               <#if orderProp?? && orderProp!=''> 
                    order by ${orderProp} ${orderType} 
               <#else> 
                   order by u.create_time desc 
                </#if> 
         ]]> 
    </sql> 
    </sqls>

    OK,一个完整的DAO层代码开发完毕,在service层注入该DAO接口即可。 
    上面的例子是个很简单的例子。想必你已经有来了一个大体的认识。 
    实际开发中,有各种各样的sql语句:直接写sql语句的增删改,各种返回类型的查询语句。 

    六、下面详细介绍所有的DAO注解的使用 

    DAO接口注解: 
           1)、@Dao:标识dao接口,否则无法自动注入到spring中。 

    参数注解: 
           1)、@Param:标识参数名称,对应sql语句中的 =:参数名称 
                  如:@Param("userName")String username 
                  其数据类型是所有基本数据类型、集合、数组、Map和实体对象。 

    方法注解: 
            1)、@Insert(id=””,value=””):sql语句方式插入 
                  id:对应sql xml文件中的一个id,如@Insert(id=”saveUser”) 
                  value:sql语句,如@Insert(”insert into sys_user(…) value(…)”) 
                  两种方式选择一种。 
                  如果同时写了id和value,value对应的sql语句优先,id对应的sql语句将无效。 

            2)、@InsertEntity:插入或批量插入实体,方法的参数是必须实体或实体的集合。 

            3)、@Update(id=””,value=””):sql语句方式更新 
                  id:对应sql xml文件中的一个id,如@ Update (id=updateUser”) 
                  value:sql语句,如@ Update (”update sys_user set user_name =:username where id=:id”) 
                  两种方式选择一种。 
                  如果同时写了id和value,value对应的sql语句优先,id对应的sql语句将无效。 

           4)、@UpdateEntity:更新或批量更新实体,方法的参数必须是实体或实体的集合。 

           5)、@Delete(id=””,value=””):sql语句方式删除 
                 id:对应sql xml文件中的一个id,如@ Delete (id=updateUser”) 
                 value:sql语句,如@ Delete (”delete from sys_user where id=:id”) 
                 两种方式选择一种。 
                 如果同时写了id和value,value对应的sql语句优先,id对应的sql语句将无效。 

           6)、@ Delete Entity:删除或批量删除实体,方法的参数必须是实体或实体的集合。 

           7)、@ Select(id=””,value=””, cacheable=false|true, cacheName =””):查询 
                 id和value同@Insert的id和value 
                 cacheable:查询结果是否缓存,默认是true。如果设置了全局不缓存,这里cacheable将不起作用 
                 cacheName:缓存名称,如果未指定,默认是全局配置中的缓存名称。 
                 方法的返回值类型有: 
                       boolean:判断查询结果是否存在 
                       int:返回查询结果的数量 
                       实体对象:将一笔查询结果封装到一个实体对象 
                       Map<String,Object>:将一笔查询结果封装到一个Map 
                       List<实体对象>:将多笔查询结果封装到List<实体对象> 
                       List<Map<String,Object>>:将多笔查询结果封装到List<Map<String,Object>> 
                       Page<实体对象>:分页查询,分页查询结果封装到实体对象 
                       Page<Map<String,Object>>分页查询,分页查询结果封装到Map 

          8)、@ SelectColumn(columnName=””, id=””,value=””, cacheable=false|true, cacheName =””) 
                根据列名,查询一列数据,封装到List<E>中 
                 columnName:列名称 
                 id、value、cacheable、cacheName同@Select 
                如:@ SelectColumn( columnName=”user_name”, value=”select user_name from sys_user”)

    七)、SQL XML文件: 
            通常,一个DAO接口对应一个同名的XML文件 
            如UserDao.java对应一个UserDao.xml文件 
            这些XML文件classpath下某个目录,稍后将详解。 
             SQL XML文件格式为: 
            <sqls> 
                 <sql id=" " cacheable="true|false" cacheName="" desc=""> 
                      <![CDATA[ 
                           Sql 语句 
                      ]]> 
                </sql> 
                <!—其他的sql 节点--> 
            </sqls> 
           sql节点中的 
           id、cacheable、cacheName,同方法注解中的id、cacheable、cacheName 
           desc:sql语句的描述。

    八)、全局配置: 
            在某个properties配置文件中,如在jdbc.properties中,定义dao的相关全局配置,在服务启动时,由spring加载这个配置文件。 

            全局配置有: 

             #数据库类型,mysql、oracle、db2 
             jdbc.dbType=mysql 

             #是否在打印sql日志 
             jdbc.showSql = true 

             #sql文件根路径,该根路相对与classpath的路径, 
             #如最终的路径为.. /WEB-INF/classes/sql/各种sql xml文件 
              jdbc.sqlFileRootPath = /sql 

             #是否在系统启动时,加载所有的sql xml文件到内存 
             #一般生产环境为true,开发环境为false 
             jdbc.loadSqlFileAtServerStartup = false 

             #数据库表字段与实体类属性的对应规则:是否与表字段名称的下划线去掉、下划线后面#的首字母大写得到的字符串一致 
             #true时,例子:表字段名称user_name对应实体类属性userName 
             #false时,例子:表字段名称user_name或USER_NAME对应实体类属性user_name 
             jdbc.formatColumnNameToFiledName = true 

              #缓存全局设置: 
              #缓存文件路径 
              cache.cacheConfigLocation = ehcache/ehcache.xml 

              #默认缓存名 
              cache.defaultCacheName = DEFAULT_CACHE 
     
               #查询结果是否缓 
               #false时,方法注解中、 sql xml文件中,单独设置的cacheable将不生效 
               cache.global.cacheable = false 

               #是否打印缓存日志 
               cache.showLog = false

    九)、sql语句相关语法: 

            1)、判断变量是否存在或为null,语法为: 
                  <#if 变量名??> 
                        变量存在时,执行这里的sql 
                  </#if> 

             2)、判断字符串变量是否为空,语法为: 
                   <#if 变量名?? &&变量名!=’’> 
                     变量存在,且不为空时,执行这里的sql 
                  </#if> 

            3)、变量不存在,则取默认值: 
                  变量名!”我是个默认值,当变量不存在时,取我作为它的值” 

            4)、字符串去空,变量名?trim 

            5)、集合、数组参数: 
                   如: 
                   <#if userIdList ?? && (userIdList?size>0) > 
                         and u.id in (:userIdList) 
                   </#if> 

             6)、排序变量: order by ${userName} ${descOrAsc} 

                    这样写将报错:order by :userName :descOrAsc 

             7)、其实上面的这些语法,都是freemarker中的,如果你想更加熟练的编写sql语句,请了解下freemarker。 

     

分享到:
评论
1 楼 Necro 2014-02-01  
严重期待开源大作

相关推荐

    ORM框架ORM框架ORM框架ORM框架

    "自己写的ORM很好用"这个标签可能指的是开发者或者团队自行开发了一个ORM框架,并且在实际项目中表现良好。这样的ORM框架可以根据具体需求进行定制,更好地适应项目的特性和业务逻辑。自定义ORM的优势在于可以更紧密...

    Uncode-DAL是 Java 通用数据访问组件基于mybatis、spring jdbc、hibernate等ORM框架开发

    Uncode-DAL是 Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate等ORM框架开发,同时支持基于多数据源的读写分离、主备切换、故障转移,自动恢复、负载均衡、缓存等。可以大大提高开发速度

    CRL面向对象ORM开发框架

    CRL是一个面向对象的轻便型ORM业务框架 数据处理使用了对象/数据映射,数据操作采用Lamada表达式来表示,增加了可编程性和可靠性,出错机率低,同时也能用原生的SQL实现查询或操作 数据连接以编程方式进行配置,支持多个...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...

    SqliteORM,一个很好的Sqlite ORM框架

    Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...

    ASP.NET 自已封装的ORM 框架版本2

    例如,假设我们有一个用户表和一个订单表,通过ORM框架可以方便地获取某个用户的全部订单信息,而无需手动编写JOIN SQL语句。 分页功能在Web应用中尤其重要,它能帮助提高用户体验并减轻服务器负载。在自封装的ORM...

    jdbc连接池封装及ORM框架jdbc.rar

    数据库连接池封装和ORM框架封装 涉及到知识点:多种设计模式、注解、反射.通过该封装学习,可以加深对java基础的理解

    .NET ORM开发框架:fohu.EntitySharp

    **.NET ORM 开发框架:fohu.EntitySharp** 在.NET开发环境中,ORM(Object-Relational Mapping)框架已经成为处理数据库...对于那些需要快速开发且不希望引入大型ORM库的项目,fohu.EntitySharp是一个值得考虑的选择。

    分享一个很轻的、纯JDBC ORM映射小框架,泛型化,SQL级别

    NULL 博文链接:https://yongboy.iteye.com/blog/549243

    经量级的ORM开发框架CRL

    CRL是一个面向对象的轻便型ORM业务框架 数据处理使用了对象/数据映射,条件查询采用Lambda表达式来表示,增加了可编程性和可靠性,出错机率低,同时也能用原生的SQL实现查询或操作 数据连接以编程方式进行配置,支持多个...

    eform集成开发手册

    eform集成开发手册 eform集成开发手册是专门为eform开发人员设计的指南,旨在帮助开发者快速了解eform的集成开发流程和技术细节。该手册涵盖了eform集成开发的各个方面,包括系统文件说明、系统表结构说明、eform ...

    自制ORM框架源代码

    本项目是一个基于JDK 6.0的自定义ORM框架,旨在通过注解编程来封装JDBC的繁琐操作,实现对数据库的便捷访问和数据映射。 1. 注解编程:此框架的核心思想是利用JDK 6.0引入的注解特性,为类和字段添加特定的元数据,...

    一个C#的ORM框架

    一个自己写的ORM框架,做了一些连接池和OR映射的功能, 测试效率还行,详情见http://blog.csdn.net/shmilyhe/archive/2009/09/07/4526191.aspx 暂时只支持SQL SERVER 和MYSQL 晚些会上传一些DEMO

    java一个简单的orm框架开发可以参考写习用

    简单orm框架开发,希望对有需要的你们有所帮助。

    Remobjects ORMFramework 优秀的ORM 持久层框架

    Remobjects Framework 优秀的ORM持久层框架 亲测Client可用 有源码 亲测Server可用 有源码 新测DB可用 RO接口定义亲测无法通过,自己想办法修改 有源码 1. config 文件夹下是配置文件 2. Public 文件夹存放公共PAS...

    02-01-11-基于Spring JDBC手写定制自己的ORM框架1

    //1、加载驱动类//2、建立连接//3、创建语句集//4、执行语句集Member instance = new Member();//5、获取结果集//6、关

    .NET ORM框架

    ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架

    主流ORM框架技术应用

    Hibernat详解、MyBatis详解,详细的入门教程和相关知识解析,代码截图,代码都可运行。

    基于ORM的数据库框架Room

    基于ORM的数据库框架Room,Android原生API,官方推荐使用,类似GreenDAO数据库。

    .NET ORM开发框架:Fohu.EntitySharp2.0

    EntitySharp是一款专为.NET平台设计的ORM(对象关系映射)开发框架,其最新版本为2.0。ORM框架的主要作用是将数据库中的表格映射为...如果你正在寻找一个轻量级且功能完备的ORM框架,那么Fohu.EntitySharp2.0值得考虑。

Global site tag (gtag.js) - Google Analytics