码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis使用之查询详解

时间:2015-05-19 16:31:37      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:mybatis   mybatis关联查询   mybatis 一对多   mybatis一对一   mybatis多对多   

Mybatis使用之查询详解

 

一:简介

 

        此篇主要知识点:

       1、sql语句块

       2、select标签属性

       3、ResultMap 标签配置

       4、一对一关联

       5、一对多关联

       6、多对多关联

       7、嵌套查询

 

二:SQL语句块

 

       2.1 作用

 

              SQL元素可以被用来定义可重用的SQL 代码段,可以包含在其他语句中。比如在项目中常常做的分页查询、分别需要两条SQL语句、一条是查询所有具体记录信息、另一条需要查询记录数、而两条语句的where条件是一样的。这种类似情况就可以使用SQL语句块来简化配置信息。

 

       2.2 实例


              2.2.1 SQL语句定义:

      

    <sql id="queryColumns"> id, username, password </sql>

              2.2.2 使用:

 

    <select id="queryAuthor" parameterType="int" resultType="author">
        SELECT
        <include refid="queryColumns"/>
        FROM author
        WHERE id = #{id}
    </select>

三:select标签属性

 

       3.1 标签属性集合:

<select

 id="selectPerson"

 parameterType="int"

 parameterMap="deprecated"

 resultType="hashmap"

 resultMap="personResultMap"

 flushCache="false"

 useCache="true"

 timeout="10000"

 fetchSize="256"

 statementType="PREPARED"

 resultSetType="FORWARD_ONLY">

       3.2具体意义:

 

              参见补充部分。

 

四:ResultMap 标签配置

 

       4.1 介绍

 

              resultMap 元素是MyBatis 中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事情。事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。 ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。

 

       4.2 ResultMap 与ResultType的区别

 

              MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用但是resultType跟resultMap不能同时存在。

在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。

所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,Mybatis就会根据我们配置的信息做映射

 

       4.3 标签属性

   <resultMap id="resultMapId"

               type="JavaBean"

               autoMapping="false"

               extends=""/>

       4.4 标签体

 

              ResultMap的主要组成部分、并且标签体之间可以相互嵌套、来表示更复杂的JavaBean。具体的使用到对应的标签体再说明其作用与标签属性的配置及意义。

              下面是其标签体签名:

        <constructor>
            <idArg/>
            <arg/>
        </constructor>
        <id property="" column="" javaType="" jdbcType="" typeHandler=""/>
        <result typeHandler="" jdbcType="" javaType="" column="" property=""/>
        <association property=""/>
        <collection property=""/>
        <discriminator javaType="">
            <case value=""/>
        </discriminator>


五:简单对象select映射

 

        5.1 ResultType类型返回值的表示方式:

            

             因为在前面提到过、加载Mybatis总配置文件的时候会自动扫描指定包下面的类、并且用类名首字母小写作为名称作为其别名(TypeAliases)、这样我们就不必在select的resultType指定JavaBean的全限定名称了。select语句如下即可:

    <select id="getAllAuthors" resultType="author">
        SELECT
            t.id,
            t.username,
            t.password,
            t.email,
            t.bio,
            t.favourite_section favouriteSection
        FROM author t
    </select>


        5.2 ResultMap类型返回值的表示方式:

             

              5.2.1 配置ResultMap

    <resultMap id="author" type="author">
        <id property="id" column="author_id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
        <result property="bio" column="bio"/>
        <result property="favouriteSection" column="favouriteSection"/>
    </resultMap>

              5.2.2 将select标签的ResultMap属性值设置为上面ResultMap标签的id、达到映射效果

    <select id="getAllAuthors" resultMap="author">
        SELECT
            t.id,
            t.username,
            t.password,
            t.email,
            t.bio,
            t.favourite_section favouriteSection
        FROM author t
    </select>

              5.2.3 当前ResultMap中 id result子表签作用及属性意义


             技术分享


六:一对一关联

      

      6.1 一对一场景

 

       以Blog为例、从《Mybatis使用之环境搭建》中知道Blog与Author是一对一关系、这里是在Blog中关联了Author信息。其他的先不管。如何查询Blog信息、要求是除基本信息外还包含作者完整信息

 

       6.1.1 ResultMap配置一:

 

    <resultMap id="oneToOneBlog" type="blog">
        <id property="id" column="blog_id"/>
        <result property="title" column="title"/>
        <!-- 可以使用resultMap属性指向其他映射文件已经定义好的resultMap -->
        <association property="author" resultMap="org.alien.mybatis.samples.mapper.AuthorMapper.author"/>
    </resultMap>

       6.1.2 ResultMap配置二:

 

    <resultMap id="oneToOneBlog" type="blog">
        <id property="id" column="blog_id"/>
        <result property="title" column="title"/>
        <!-- 也可以在此内部定义指向Author类的映射、此种定义不能重用 -->
        <association property="author" javaType="author">
            <id property="id" column="author_id"/>
            <result property="username" column="username"/>
            <result property="password" column="password"/>
            <result property="email" column="email"/>
            <result property="bio" column="bio"/>
            <result property="favouriteSection" column="favouriteSection"/>
        </association>
    </resultMap>

       6.1.3查询语句:

 

    <select id="getBlogOneToOne" resultMap="oneToOneBlog">
        SELECT
            t1.id                blog_id,
            t1.title,
            t2.id                author_id,
            t2.username,
            t2.password,
            t2.email,
            t2.bio,
            t2.favourite_section favouriteSection
        FROM blog t1, author t2
        WHERE t1.author_id = t2.id
    </select>

       6.1.4 association标签属性以及标签体

            属性:

      技术分享


            标签体与ResultMap基本相同、支持嵌套。


补充:

 

       1、 select标签属性对应意义:

技术分享

技术分享


 

        更多内容:Mybatis 目录

        github地址:https://github.com/andyChenHuaYing/scattered-items/tree/master/items-mybatis

        源码下载地址:http://download.csdn.net/detail/chenghuaying/8713311

 

Mybatis使用之查询详解

标签:mybatis   mybatis关联查询   mybatis 一对多   mybatis一对一   mybatis多对多   

原文地址:http://blog.csdn.net/crave_shy/article/details/45844777

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!