mybatis3 autoMappingBehavior

转载请注明: TheViper http://www.cnblogs.com/TheViper

autoMappingBehavior是一个容易被忽略的属性

可以看到,默认是PARTIAL,只会自动映射没有定义嵌套结果集映射的结果集。这句话有点拗口,意思就是映射文件中,对于resultMap标签,如果没有显式定义result标签,mybatis不会帮你把结果映射到model(pojo)上.

具体的,比如feeling(心情)和feeling_comment(评论)是一对多关系。

    <resultMap id="FeelingCommentResult" type="Feeling">
        <id property="feeling_id" column="feeling_id" />
        <!-- <result property="content" column="content" /> -->
        <collection property="feelingComments" ofType="FeelingComment">
            <id property="feeling_comment_id" column="feeling_comment_id" />
            <!-- <result property="commentContent" column="commentContent" /> -->
        </collection>
    </resultMap>
    <select id="selectFeelingComment" parameterType="map" resultMap="FeelingCommentResult">
        select * from feeling left outer join feeling_comment on feeling.feeling_id=feeling_comment.feeling_id where feeling.id =#{id}
    </select>

<resultMap>和<collection>中都没有定义<result>,这时

        List<Feeling> feeling = (List<Feeling>) sqlSessionTemplate.selectList(
                "user.selectFeelingComment", map);
        System.out.println(feeling.get(0).getContent());
        System.out.println(feeling.get(0).getFeelingComments().get(0).getCommentContent());

取出content和commentcontent都是null,当然,如果只是

System.out.println(feeling);
System.out.println(feeling.get(0).getFeelingComments());

mybatis会初始化model的,因此输出会有结果的,但里面除了id属性有具体值外,其余都没有,因为没有定义<result>。去掉上面的注释,再去取content和commentcontent就会有具体的值了。

如果select语句中有很多需要取的字段,autoMappingBehavior就派上用场了。只需要将其设置为FULL,就不用再写那一大堆<result>了。

<setting name="autoMappingBehavior" value="FULL" />

注意,mybatis的autoMappingBehavior确实很赞,使用很方便,但是前提是开放者需要确保model和数据库字段是一一对应的,还有相应表的字段名不要重复。

比如,feeling的内容是content,feeling_comment的内容是commentContent,这时数据库feeling表保存内容的字段名字也应该是content,feeling_comment同理。

另外这里对feeling_comment表保存内容的字段名就不能简单的设置为content.

至于model那边,可以有名字相同的属性,比如feeling类和feeling_comment类都可以有一个content属性,但必须要用<result>。

    <resultMap id="FeelingCommentResult" type="Feeling">
        <id property="feeling_id" column="feeling_id" />
        <collection property="feelingComments" ofType="FeelingComment">
            <id property="feeling_comment_id" column="feeling_comment_id" />
            <result property="content" column="commentContent" />
        </collection>
    </resultMap>

可以看出<result>相当于sql里面的as.如果相应表间有重复的字段名,比如这里保存内容的字段名都是content,就算用<result>

<result property="commentContent" column="content" />

也是无能为力,这相当于select content as commentContent,content as content,....

mybatis不会知道是哪个表的content,美中不足!

当然,如果直接就在<select>里面把sql写好,如select feeling.content,feeling_comment.content as commentContent,。。。上面的内容都可以不看了,没有用到mybatis的autoMappingBehavior。

最后如果用的是懒加载,比如

    <resultMap type="Feeling" id="FeelingResult">
        <collection property="feelingComments" select="selectComment"
            column="feeling_id" ofType="FeelingComment"></collection>
    </resultMap>
    <select id="selectComment" parameterType="int" resultType="FeelingComment">
        select * from feeling_comment where feeling_comment_id = #{id}
    </select>
    <select id="selectFeeling" parameterType="int" resultMap="FeelingResult">
        select * from feeling where id = #{id}
    </select>

虽然有<resultMap>,但由于本质上是多条select语句,所以不用写<result>仍然取得到具体值。

如果您觉得本文的内容对您有所帮助,您可以打赏我:

时间: 2024-10-10 14:57:41

mybatis3 autoMappingBehavior的相关文章

mybatis Result Maps对结果分组

转载请注明: TheViper http://www.cnblogs.com/TheViper  一对多的关系,比如文章和评论,这时需要展示文章和评论,并按文章分组.很多时候,页面只显示评论数,如果用户要看具体评论,就要点击评论数的链接. 比如微博 知乎 如果一定要在展示文章(或微博)时,显示前几条评论该怎么做呢?(这里不讨论mongodb) 一个常见的做法是对一方,外连接多方,一并取出,然后手工遍历分组. 这里还是以文章评论和回复为例 评论表 回复表 两个表的id字段分别表示评论的用户id和回

SpringMVC4 + Spring + MyBatis3 【转】

本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我们知道springmvc是基于Servlet: DispatcherServlet来处理分发请求的,所以我们需要先在web.xml文件中配置DispatcherServlet,而Spring的启动则是使用了监听器,所以需要配置spring的监听器: <?xml version="1.0" encoding="UTF-8"?&

SpringMVC4 + Spring + MyBatis3

SpringMVC4 + Spring + MyBatis3 本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我们知道springmvc是基于Servlet: DispatcherServlet来处理分发请求的,所以我们需要先在web.xml文件中配置DispatcherServlet,而Spring的启动则是使用了监听器,所以需要配置spring的监听器: <?xml version="1.0&quo

mybatis3 配置文件解析

2013-05-08 19:43 34388人阅读 评论(0) 收藏 举报 分类: mybatis3(19) 目录(?)[+] 配置文件的基本结构 configuration -- 根元素 properties -- 定义配置外在化 settings -- 一些全局性的配置 typeAliases -- 为一些类定义别名 typeHandlers -- 定义类型处理,也就是定义java类型与数据库中的数据类型之间的转换关系 objectFactory plugins -- Mybatis的插件,

对Mybatis3源码结构理解(每天不断完善中...)

一.mybatis简介 Mybatis是支持普通SQL查询查询.存储过程和高级映射的优秀持久层框架.Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.Mybatis使用简单的XML或注解用于配置和原始映射,将接口和java的POJOS(Plan old java Objects,普通的java对象)映射成数据库中的记录. 二.框架结构图 刚开始学习源码,有哪儿不对的地方还望指出,十分感谢! (20160810第一版,以mybatis-3.4.1为例) 三.暂无

mybatis3动态创建表,判断表是否存在,删除表

1.mybatis3动态创建表,判断表是否存在,删除表 mapper配置文件: <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/

MyBatis 学习总结 05 Mybatis3.x与Spring3.x整合 OLD

本文通过加载mybatis-configuration.xml 文件来产生SqlSessionFactory,然后通过SqlSessionFactory去产生sqlSession,然后在通过 sqlSession对数据库表所映射的实体类进行增删改查操作.通过spring的DI和IOC,能产生对象并管理对象的声明周期,而sprig的AOP也能管理对象的事务.主要有两点: 1.需要spring通过单例的方式管理 SqlSessionFactory,并用 SqlSessionFactory 去创建 s

MyBatis3.4.0以上的分页插件错误:Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepare. Cause: java.lang.NoSuchMethodException: org.apache.ibatis.executor.stateme

错误: Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepare. Cause: java.lang.NoSuchMethodException: org.apache.ibatis.executor.statement.StatementHandler.prepare(java.sql.Connection)] with root cause 问题

Mybatis3+Spring4+SpringMVC4 整合【转】

首先在整合这个框架的时候,想想其一般的步骤是怎样的,先有个步骤之后,不至于在后面的搞混了,这样在整合的时候也比较清晰些. 然后我们就细细的一步一步来整合. 1  创建一个Web项目. 2  导入Mybatis3.Spring4.SpringMVC4.连接数据库(我使用的数据库是mysql)的jar包. 我所用的包:  spring-websocket-4.2.0.RELEASE.jar 3  创建Mybatis3.Spring4.SpringMVC4.连接数据库的配置文件. 4  配置web.x