设为首页 收藏本站
查看: 815|回复: 0

[经验分享] myBatis自定义传入参数类型(TypeHandler)

[复制链接]

尚未签到

发表于 2016-11-26 09:15:58 | 显示全部楼层 |阅读模式
为了要在myBatis查询时使用特殊的数据类型时,使用通常的jdbcType不能满足需要的时候,可以使用自定义的类型TypeHandler。
例如,有一个存储过程,我们自定义了一个类型Employee,Employee中有两个属性id(long型),name(String型),然后又要将其放在一个List中,作为参数给一个存储过程批量处理。
以下为Orcale类型:

create or replace
TYPE Employee AS OBJECT
(
ID    NUMBER,
NAME  VARCHAR2(100 BYTE)
)
create or replace
TYPE Employee_TABLE
AS TABLE OF Employee;


有存储过程如下:

create or replace
PROCEDURE Employee_Process
(
FK_LIST IN Employee_TABLE  
) AS
BEGIN
FOR I IN 1..FK_LIST.COUNT LOOP
--操作
END LOOP;
COMMIT;
END Employee_Process;


自定义handler

import ...
//这个jdbcType对应mapper文件中对应的jdbcType
//如果此处不做配置也可以在mybatis-config.xml中配置
@MappedJdbcTypes(JdbcType.ARRAY)
public class MyHandler implements TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
//获取OracleConnection
C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = (C3P0NativeJdbcExtractor) new C3P0NativeJdbcExtractor();
OracleConnection oracleConn=(OracleConnection)cp30NativeJdbcExtractor.getNativeConnection(ps.getConnection());
//这个parameter就是我们自己在mapper中传入的参数
List<Object> dto = (ArrayList<Object>) parameter;
StructDescriptor sd = new StructDescriptor("Employee",oracleConn);
STRUCT[] result = new STRUCT[dto.size()];
for(int index = 0; index < dto.size(); index++){
AccountCommissionDetailDto d = dto.get(index);
Object[] o = new Object[3];
o[0] = new Long("1"); //id
o[1] = new String("aaa"); //name
result[index] = new STRUCT(sd,oracleConn,o);
}
ArrayDescriptor des_Employee_TABLE = ArrayDescriptor.createDescriptor("Employee_TABLE",oracleConn);
ARRAY oracle_array = new ARRAY(des_Employee_TABLE,oracleConn,result);
ps.setArray(i, oracle_array);
}
public Object getResult(ResultSet rs, String columnName) throws SQLException {
log.error("no result!");
return null;
}
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
log.error("no result!");
return null;
}
}


mybatis-config.xml中加入如下的代码声明自定义handler
如果没有在Handler中注释jdbcType也可在这里设置

<typeHandlers>
<typeHandler javaType="list" <!--jdbcType="ARRAY"--> handler="com.package.MyHandler"/>
</typeHandlers>


最后只要在mapper中做如下设置就能使用了

#{dtos,jdbcType=ARRAY,javaType=list}

或者直接定义需要调用的Handler的类型

#{dtos,jdbcType=ARRAY,javaType=list,typeHandler=com.package.MyHandler}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305714-1-1.html 上篇帖子: mybatis下简单分页的一种实现 下篇帖子: 【摘】MyBatis在ORM中的自我认识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表