mybatis开发--总结--简要说明

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 的批量方法实现批量写入。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章