Org.oproject.framework简要说明
一、Oproject动态生成DAO接口实现类框架
用途/好处
通过动态字节码生成技术,我们只需根据预定的规则定义我们的DAO接口,框架将在spring容器加载bean定义时为我们自动生成DAO接口的实现类,并将实现类注入到spring容器中。省去了我们自己编写DAO接口实现类的工作,节约时间,提高开发效率。
既然是由框架来生成接口实现类,就必须按框架定义的规则来定义我们的DAO接口。
框架原理简要说明
在spring 加载时,扫描指定的类路径的类文件,对每个类文件做如下处理
1、 判断是否为接口且接口标注为 @DynamicIbatisDAO (动态Ibatis DAO接口),
是则进行下面步骤;
2、 从接口的 @DynamicIbatisDAO 注解中获取指定的用于实现类的bean id,如
在 @DynamicIbatisDAO 中未指定,则从
@Component("constantTypeDAO")注解中获取。如仍未指定则抛出异常;
3、 从接口的 @DynamicIbatisDAO 注解中获取sqlMapClientTemplate 的
bean id。如未指定sqlMapClientTemplate 的bean id,抛出异常;
4、 采用ASM动态字节码生成技术生成DAO接口的实现类;
5、 以指定的bean id 将实现类注入到spring容器中。
框架使用规定
SQL Mapper的要求:
1、 对应的SQL Mapper的 namespace 为DAO接口的短名去掉DAO三个字符的剩
余部分。如 com.wzh.dao.UserDAO 则 namespace应为 User。
2、 SQL Mapper 中的操作语句与DAO接口方法是一一对应的,SQL操作语句以方法名为id。
3、 分页查询中的获取总记录数的语句的id 为方法名+Count。
为什么这么规定?
解释:框架在自动生成DAO的实现类时,内部代码是以DAO接口名(去掉DAO三个字符)为名称空间,以方法名为语句id,来获取对应的语句。
接口申明要求:
1、DAO接口声明必须定义 @DynamicIbatisDAO 注解,可以通过如下方式指定自动生成的实现类的bean id和sqlMapClientTemplate 的bean id。
@DynamicIbatisDAO(value=”yourBeanId",sqlMapClientTemplate=”sqlMapClientTemplate”)
Value的默认值为”” ,sqlMapClientTemplate的默认值为 “sqlMapClientTemplate”。
如果未采用上面的方式指定value值(实现类的bean id),框架默认从如下注解获取id。
@Component("")
如获不到id,将抛出异常。
2、必须指定sqlMapClientTemplate 的 bean id(通过@DynamicIbatisDAO),
其默认值为sqlMapClientTemplate,如果和默认值一致,当然不需再显式指定。
3、必须为接口。
接口中方法声明的要求:
1、 查询只返回一个对象的方法
方法名要求:以 load、get、select、read开头,如User getUserById(int id)
方法参数要求:一个参数(查询条件)
返回值:和SQL Mapper中对应的语句的returnType一致。
说明:实际调用的是SqlMapClientTemplate.queryForObject方法。
2、 查询返回多个对象的List的方法
方法名要求:以 query 开头,ForList 结尾,如 ListqueryUserForList(String name)
方法参数要求:一个(查询条件)或三个参数(第一个为查询条件,第二、三个为
int型的分页参数:起始行、行数)
返回值:List
说明:其实际调用的是 SqlMapClientTemplate的如下两个方法。
List queryForList(final String statementName, final Object
parameterObject)
List queryForList(
final String statementName, final ObjectparameterObject, finalint skipResults, finalint maxResults)
3、 分页查询
方法名要求:以query开头,ForPageResult结尾,
如 PageResultqueryUserForPageResult(String name,int startRow,int fetchsize)
方法参数要求:两个或三个
两个:int 类型,pageNumber、pageSize。
三个:第一个为条件参数,后两个为pageNumber、pageSize。
返回值:PageResult
说明:其实现为,先通过SqlMapClientTemplate.queryForObject获得符合条件的总
记录行数,计算出起始行,
然后通过SqlMapClientTemplate.queryForList方法获得对应的记录。
4、 单个Insert方法
方法名要求:以save、insert、add 开头,如 intaddUser(User user)
参数要求:一个参数(要写入的对象)
返回值:
说明:其实现调用的是SqlMapClientTemplate的
Object insert(final String statementName, final ObjectparameterObject)
方法。
5、 批量insert
方法名要求:以batchSave、batchInsert、batchAdd开头,如 void batchSaveUsers(List userList)
方法参数要求:一个,集合(要批量insert的对象集合)
返回值:void
说明:其实现是调用了 BatchExecuteUtils.batchInsert方法。BatchInsert方法调用SqlMapClientTemplate.execute,通过SqlMapExecutor 的批量方法实现批量写入。
6、 单个update
方法名要求:以update开头,如 intupdateUser(User user)
方法参数要求: 一个,要update的对象类型。
返回值:当方法返回值定义为 int 时将返回操作影响的行数。如为其他类型将得不到值。
说明:其实现调用的是SqlMapClientTemplate.update(string,Object)方法。
7、 批量update
方法名要求:以batchUpdate开头,如 void batchUpdateUsers(ListuserList)
方法参数要求:一个,集合(要批量update的对象集合)
返回值:void
说明:其实现是调用了 BatchExecuteUtils.batchUpdate方法。BatchInsert方法调用SqlMapClientTemplate.execute,通过SqlMapExecutor 的批量方法实现批量写入。
8、 单个delete
方法名要求:以delete、remove、del开头,如 intdeleteUser(User user)
方法参数要求:一个,要删除的对象或条件
返回值:当方法返回值定义为 int 时将返回操作影响的行数。如为其他类型将得不到值。
说明:其实现调用的是SqlMapClientTemplate.delete(string,Object)方法。
9、 批量delete
方法名要求:以batchDelete、batchRemove、batchDel开头,
如 void batchDeleteUsers(List userList)
方法参数要求:一个,集合(要批量delete的对象集合)
返回值:void
说明:其实现是调用了 BatchExecuteUtils.batchUpdate方法。BatchInsert方法调用SqlMapClientTemplate.execute,通过SqlMapExecutor 的批量方法实现批量写入。