读书人

JROO JDBC一个ORM疾速开发框架

发布时间: 2013-11-04 16:56:03 作者: rapoo

JROO JDBC,一个ORM急速开发框架
<!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。?

?

读书人网 >其他数据库

热点推荐