-
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。
JROO JDBC,一个ORM急速开发框架
猜你喜欢
转载自yeshujun.iteye.com/blog/1964348
今日推荐
周排行