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

[经验分享] Mybatis混合对象单表存储

[复制链接]

尚未签到

发表于 2016-11-27 07:55:48 | 显示全部楼层 |阅读模式
  先吐槽几句,Mybatis的官方文档就只有那一篇User Guide,加上源码覆盖的例子和单元测试,里面覆盖的知识点最多只有7成,剩下的3成功能如果需要用到,那就悲剧了,需选择了看源码,多花一点时间,记得得到巩固,何乐而不为呢。
  我的实体对象如下所示。
  public class ProcessDefinition  {

private String id;
private String key;
private String name;
private long version;
private String description;
private String language;
private ProcessDefinitionResourceMapping mapping;
private ProcessDefinitionState state;
public ProcessDefinition(String id, String key, String name, Long version, String description,
ProcessDefinitionResourceMapping mapping) {
super();
this.id = id;
this.key = key;
this.name = name;
this.version = version;
this.description = description;
// FIXME 现在只支持bpmn
this.language = "bpmn";
this.mapping = mapping;
this.state = ProcessDefinitionState.UNPUBLISH;
}
}
public class ProcessDefinitionResourceMapping {
private String processDefinitionPath;
private Set<String> resourcePaths = new HashSet<String>();
public ProcessDefinitionResourceMapping(String processDefinitionPath, Set<String> resourcePaths) {
super();
this.processDefinitionPath = processDefinitionPath;
this.resourcePaths = resourcePaths;
}
}
  上面的符合对象,想要存储在一个数据库表中。而且映射和数据参数传递都是通构造方法。怎么实现insert和select呢?


  • insert
  经过大胆的猜测,居然给我猜中了,可以通过 . 调用引用对象的属性,这里没有跟进源码去看到底使用反射,还是get方法。

per namespace="com.apusic.bpm.engine.definition.ProcessDefinition">
<insert id="insertProcessDefinition" parameterType="com.apusic.bpm.engine.definition.ProcessDefinition">
insert into ABPM_RE_PROCESS_DEFINITION (ID_, KEY_, NAME_, VERSION_, DESCRIPTION_, LANGUATE_, PROCESS_DEFINITION_PATH_, RESOURCE_PATHS_, PROCESS_DEFINITION_STATE_)
values (#{id,jdbcType=VARCHAR},
#{key, jdbcType=VARCHAR},
#{name, jdbcType=VARCHAR},
1,
#{description, jdbcType=VARCHAR},
#{language, jdbcType=VARCHAR},
#{mapping.processDefinitionPath, jdbcType=VARCHAR},
#{mapping.resourcePaths, jdbcType=VARCHAR, javaType=java.util.Set},
#{state, jdbcType=VARCHAR, javaType=com.apusic.bpm.engine.definition.ProcessDefinitionState})
</insert>
  
 输入的属性映射,在DefaultParameterHandler中进行逻辑处理,感兴趣的童鞋可以跟一下。


  • select
  比较痛苦的是查询,折腾了好久,通过如下的设置可以完成功能。

<resultMap id="processDefinitionResultMap"
type="com.apusic.bpm.engine.definition.ProcessDefinition">
<constructor>
<idArg column="ID_" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg column="KEY_" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg column="NAME_" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg column="VERSION_" jdbcType="INTEGER" javaType="java.lang.Long" />
<arg column="DESCRIPTION_" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg javaType="com.apusic.bpm.engine.definition.ProcessDefinitionResourceMapping" resultMap="resourceMappingResultMap" />
</constructor>
</resultMap>
<resultMap id="resourceMappingResultMap"
type="com.apusic.bpm.engine.definition.ProcessDefinitionResourceMapping">
<constructor>
<arg column="PROCESS_DEFINITION_PATH_" jdbcType="VARCHAR" javaType="java.lang.String"/>
<arg column="RESOURCE_PATHS_" jdbcType="VARCHAR" javaType="java.util.Set" />
</constructor>
</resultMap>
  Mybatis通过NestedResultSetHandler,起到一个构造和映射的功能,将jdbc查询到的ResuleSet,进行resultMap对象的构造,传参。更详细的构造和传参构成,是在它的父类FastResultHandler中进行的,createParameterizedResultObject方法负责构造映射对象,并映射<constructor>属性,applyPropertyMappings负责映射属性<result>。再吐槽几句,svn拉下来的源码一句注视也没有,是作者没写映射,还是故意不暴露呢。
  还发现了一个问题。<constructor>中使用resultMap的时候,resultMap的<result/>配置对父级别中的<constructor>不起效,进过调试,发现在构造对象之后,源码没有进入applyPropertyMappings进行属性赋值,在就想到郁闷了,如果在这个情景中,我只能通过<constructor>赋值。没确定是不是BUG。

运维网声明 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-305943-1-1.html 上篇帖子: mybatis直接执行sql语句后续之一 下篇帖子: MyBatis 物理分页foreach 参数失效
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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