-
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。
相关推荐
标题中的“轻量级、纯JDBC ORM映射小框架”指的是一个小型的Java库,它实现了对象关系映射(ORM)的功能,但不依赖于像Hibernate或MyBatis这样的大型框架,而是直接使用JDBC进行数据库操作。ORM是将数据库表结构映射...
在本课程"02-01-11-基于Spring JDBC手写定制自己的ORM框架1"中,我们将探讨如何利用Spring的JdbcTemplate设计理念,来构建一个自定义的ORM(对象关系映射)框架。ORM框架的主要目的是简化Java应用程序与数据库之间的...
在这个“jdbc连接池封装及ORM框架jdbc.rar”文件中,我们可以探讨几个核心概念和技术,包括设计模式的应用、注解的使用以及反射机制。 首先,**设计模式**在软件开发中起着至关重要的作用。例如,工厂模式可能被...
Uncode-DAL是 Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate等ORM框架开发,同时支持基于多数据源的读写分离、主备切换、故障转移,自动恢复、负载均衡、缓存等。可以大大提高开发速度
CRL是一个面向对象的轻便型ORM业务框架 数据处理使用了对象/数据映射,数据操作采用Lamada表达式来表示,增加了可编程性和可靠性,出错机率低,同时也能用原生的SQL实现查询或操作 数据连接以编程方式进行配置,支持多个...
SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...
数据库持久化ORM开发框架是现代软件开发中的一个重要概念,它主要解决了应用程序与数据库之间的交互问题。ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术,用于将关系数据库的数据映射到对象...
本教程将带你了解如何开发一个简单的ORM框架,以此为基础,你可以深入理解ORM的工作原理,并扩展出更复杂的功能。 首先,我们需要理解ORM的核心思想:将数据库中的表映射为Java类,表中的记录映射为类的实例,字段...
Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...
在【压缩包子文件的文件名称列表】中,“mORMot2-master”很可能是指mORMot框架的源码仓库,可能是一个Git仓库的主分支,其中包含了框架的所有源代码、文档和示例。这个框架的版本可能是2,表示它已经过了一次或多次...
例如,假设我们有一个用户表和一个订单表,通过ORM框架可以方便地获取某个用户的全部订单信息,而无需手动编写JOIN SQL语句。 分页功能在Web应用中尤其重要,它能帮助提高用户体验并减轻服务器负载。在自封装的ORM...
1. **数据库连接管理**:ORM框架会提供一个连接管理机制,用于创建、打开、关闭SQLite3数据库。这通常涉及到初始化配置,如数据库文件路径、错误处理等。 2. **数据模型类**:开发者会定义一系列类,这些类与数据库...
**.NET ORM 开发框架:fohu.EntitySharp** 在.NET开发环境中,ORM(Object-Relational Mapping)框架已经成为处理数据库...对于那些需要快速开发且不希望引入大型ORM库的项目,fohu.EntitySharp是一个值得考虑的选择。
FluentAdo,根据名称可以推测,这可能是一个基于.NET平台的ORM框架,其设计灵感可能来自于Fluent NHibernate,一个知名的NHibernate扩展。Fluent接口是一种编程风格,通过链式方法调用来构建复杂的配置或查询,使...
CRL是一个面向对象的轻便型ORM业务框架 数据处理使用了对象/数据映射,条件查询采用Lambda表达式来表示,增加了可编程性和可靠性,出错机率低,同时也能用原生的SQL实现查询或操作 数据连接以编程方式进行配置,支持多个...
在本篇“基于Java简易ORM框架实现(二)”中,我们将深入探讨如何构建一个简单的对象关系映射(Object-Relational Mapping,ORM)框架。ORM框架是Java开发中常用的一种技术,它允许开发者以面向对象的方式操作数据库,...
"自己写的ORM很好用"这个标签可能指的是开发者或者团队自行开发了一个ORM框架,并且在实际项目中表现良好。这样的ORM框架可以根据具体需求进行定制,更好地适应项目的特性和业务逻辑。自定义ORM的优势在于可以更紧密...
本项目是一个基于JDK 6.0的自定义ORM框架,旨在通过注解编程来封装JDBC的繁琐操作,实现对数据库的便捷访问和数据映射。 1. 注解编程:此框架的核心思想是利用JDK 6.0引入的注解特性,为类和字段添加特定的元数据,...
Spring是一个广泛使用的Java企业级应用开发框架,它提供了一整套工具和功能来简化JDBC(Java Database Connectivity)的使用,并且支持ORM(Object-Relational Mapping)框架,如Hibernate和MyBatis,以便于进行对象...