`
microye
  • 浏览: 21125 次
  • 性别: 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  
严重期待开源大作

相关推荐

Global site tag (gtag.js) - Google Analytics