ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis中的mapper.xml的使用

2020-03-29 15:09:48  阅读:203  来源: 互联网

标签:语句 mapper xml 查询 嵌套 Mybatis id select 属性


1.typeAliases元素:

  1,这个标签里面的typeAlias标签可以定义别名,会在映射文件中使用。如果没有定义别名,那必须使用【全限定名】。

  2,其【子标签package】可以为包下所有类定义别名。
          别名默认就是类名。

 

2.自动配置主键:

  a.对于主键值可以自动增长的数据库,例如mysql  可以如下:

    <insert id="insertStudent" parameterType="Student"  useGeneratedKeys="true"  keyProperty="studId">表示主键为studId,且自动增长

     或者在数据库中配置也可(但主键必须为int类型)

  b.对于主键值不能够自动增长的数据库,例如oracle,使用【序列】(SEQUENCE)来生成主键值。

    create sequence my_seq;

    <insert id="insertStudent" parameterType="Student">
              <selectKey keyProperty="studId" resultType="int" order="BEFORE">
                  SELECT my_seq.nextval FROM DUAL
              </selectKey>
                INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
                    VALUES(#{studId},#{name},#{email},#{phone})
          </insert>

    使用了<selectKey>子元素来生成主键值,并将值保存到Student对象的studId 属性上。

    order属性:MySQLorder需要设置为after,Oracle需要设置为before

 

3.ResultMap属性:结果集映射,用来将SELECT语句的结果集映射到java对象的属性中。ResultMaps特性非常强大,你可以使用它将简单的SELECT语句映射到复杂的一对一、一对多关系的SELECT语句上。

  1)拓展 ResultMap:

    <resultMap type="Student" id="StudentResult">

    <resultMap type="Student" id="StudentWithAddressResult" extends="StudentResult">

    其中id为StudentWithAddressResult的resultMap拓展了id为StudentResult的resultMap

 

  2)使用【嵌套结果查询ResultMap】

    1)Association属性:一对一    Student对象中需生成address对象的getter和setter方法

      <resultMap type="Address" id="AddressResult">

      <....>

      </resultMap>

 

      <resultMap type="Student" id="StudentWithAddressResult">
              <....>
                  <!-- 【关联】的意思 【嵌套结果映射】-->
                <association property="address" resultMap="AddressResult" />
      </resultMap>

 

      元素<association>被用来导入“有一个”(has-one)类型的关联。在上述的例子中,

      我们使用了<association>元素引用了另外的在同一个XML文件中定义的<resultMap>。       

     2)Collection属性:将多行结果映射成一个对象的一个集合

      private List<Course> courses;

      <resultMap type="Student" id="StudentWithAddressResult">

        <!-- collection表一对多关系,遇到courses集合成员 -->
        <collection property="courses" resultMap="CourseResult" />

      </resultMap>

 

   3)使用【嵌套查询结果select】一对一

    嵌套查询本质:
              一个select语句 转化成 多条select语句去实现功能。

    【先根据addr_id去查找 地址对象】

    <resultMap type="Address" id="AddressResult"></....>

     <select id="findAddressById" parameterType="int" resultMap="AddressResult">
                  select * from addresses where addr_id=#{id}
      </select>

    <select id="findStudentById" parameterType="int" resultMap="StudentWithAddress">
                select * from addresses where addr_id=#{id}
      </select>

    <resultMap type="Student" id="StudentWithAddress">

      <........>

      <!--  addr_id列的值将会被作为输入参数传递给findAddressById语句。-->

      <association property="address" column="addr_id" select="findAddressById" />
     </resultMap>

在此方式中,<association>元素的select属性被设置成了id为findAddressById的语句。这里,两个分开的SQL语句将会在数据库中分别执行,第一个调用findStudentById加载student信息,而第二个调用findAddressById来加载address信息。
    

总结:
    嵌套结果查询 本质上是一条sql语句查询多张表;
    嵌套查询 本质上是每条sql语句查询一张表,组合在一起查询多张表。
    效率上,嵌套结果更快。

结论:
    如果是 嵌套结果,通过 association标签中的 resultMap属性 实现;
    如果是 嵌套查询,通过 association标签中的 select属性 实现

 

嵌套结果映射和嵌套查询  一对多  和  一对一  类似,只是运用collection属性而已

多对多的关系可以参照一对多,只是中间多了一个桥表。

 

 

 

不论是一对一还是一对多还是多对多,都不能在mybatis中进行级联保存、更新、删除,我们需要使用sql语句控制每一步操作(可以级联查询)

标签:语句,mapper,xml,查询,嵌套,Mybatis,id,select,属性
来源: https://www.cnblogs.com/nyhhd/p/12592310.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有