ibatis扩展支持主键生成的方法(非数据库方式)

时间:2021-03-19 13:39:51


问题:          
    持久层使用ibatis保存数据进数据库的时候,会用到一些序列(sequence)的数据通常被用于数据表主键唯一标识。Ibatis框架中主要通过selectKey节点完成sequence值生成和返回,但selectKey仅局限于数据库sql语句使用,不适用于想通过某个类方法自定义生成序列(主键)的方式。
这里我们在了解selectKey运行流程的基础上,效仿它的工作设计方法扩展完成“类方式生成生成序列(主键)”这一功能,同时也扩展了ibatis框架的使用场景。"          
                    
分析问题:          
1、先从熟悉selectKey工作流程入手。          
2、打开ibatis源码工程并进行代码跟踪,可以发现selectKey的解析位于com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser的parseGeneralStatement方法中,          
这里调用私有方法findAndParseSelectKey查找并完成selectKey的读取和转化并将结果存放到MappedStatementConfig配置中。          
3、在sql执行代理类com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate对象insert方法中,程序校验当前sqlmap节点是否存在selectKey,并完成序列值(sequence)的读取和返回操作。          
4、好了,下面我们模仿com.ibatis.sqlmap.engine.mapping.statement.SelectKeyStatement来实现“类方式生成生成序列(主键)”。          
          
解决方法:          
1、首选我们在com.ibatis.sqlmap.engine.mapping.statement创建类ClassKeyStatement(见附件)用于通过java程序实现序列生成。          
2、在sqlmap的数据格式文件sql-map-2.dtd新增classKey节点,用于构建lassKey的解析和调用。          
3、在SqlStatementParser中解析selectKey方法之后新增classKey的解析方法findAndParseClassKey,主要包含的解析数据有:          
"   1)className:自定义生成序列(主键)类路径解析;
   2)methodName:自定义生成序列(主键)的方法名解析;
   3)resultClass:返回序列(主键)的数据类型定义(全路径);
   4)paramTypes、args:方法输入参数类型、值定义,默认为空。"          
4、范例参考:调用test.util.GenerateSerial这个类的getUUID方法来完成序列生成,并要求有两个输入参数(字符串、整型)

ibatis扩展支持主键生成的方法(非数据库方式)

使用方法:
1、编译ClassKeyStatement.java生成可运行文件ClassKeyStatement.class(见附件),并将其添加到ibatis.jar中。
2、在系统sqlmap配置文件添加调用。范例如下:

ibatis扩展支持主键生成的方法(非数据库方式)

 

(注:本人文章均为原创,转载请注明出处!刀光剑影2012写于深圳。)