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

孤人 提交于 2020-03-01 13:34:59

  • 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。 



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!