Ibatis学习总结之一对多、多对一的对应关系

     写对象之间的对应关系的语句只要知道下面几个标签和属性就一点也不难,就是比着葫芦画瓢。只要认真的看看下面的文章,理解它们的意思,知道它们是干什么的、有什么用,就能组织IBatis的相关语句编写一对多、多对一的对应关系。在文章后面有一个自己写的小案例,可以参照一下。对于一些少量的数据可以按照下面案例的写法,对于大量的数据按照案例的写法会频繁的访问数据库使之效率低下,这时可以使用IBatis的缓存机制进行处理,把一些不需要频繁修改拿出来放到内存中。例如学生和班级,班级一般是不会经常的进行修改的,就可以把它取出来放在内存中,联查时直接从内存中取数就行了,不用再访问数据库了。Ibatis的缓存机制可以在数据发生改变时进行对数据库的交互操作。缓存这块可以参照其他的资料自己了解了解,这篇文章只是简单的介绍一下Ibatis一对多、多对一的编写。

标签

resultClass
      resultClass属性可以让您指定一个类,只要是类的属性名称和ResultSet的列名匹配,列值自动赋值给属性。这使得查询mapped statement变得很短。

<select id="SelectAllCraft" resultClass="StudentMap">
      select * from Student
</select>

      使用resultClass的自动映射存在一些限制,无法指定输入字段的数据类型(如果需要的话),无法自动装入相关的数据(复杂属性),并且因为需要ResultSetMetaData的信息,会对性能有轻微的不利影响。但是用resultMap,这些限制都可以很容易的解决。

resultMap
      resultMap是最常用和最重要的属性。ResultMap属性的值等于预先定义的resultMap元素的name属性值。使用resultMap可以控制数据如何从结果集中取出,以及哪一个属性匹配哪一个字段。不像使用resultClass的自动映射方法,resultMap属性可以允许指定字段的数据类型,null的替代值复杂类型映射(包括其他类,集合类型和基本类型包装类)。

注意:使用resultMap时,并不要求定义ResultSet所有返回字段的映射。但Sql输出的列中一定要包含resultMap指定的列,否则报错。resultMap支持“select *”,

resultMap的result元素各个属性
property:指定类的属性
column:指定resultset列
columnIndex:属性columnIndex是可选的,用于改善性能属性columnIndex的值是ResultSet中用于赋值类属性的字段次序号。在99%的应用中,不太可能需要牺牲可读性来换取性能。使用columnindex,某些数据库驱动可以大幅提高性能,某些则没有任何效果。

<resultMap id="studentmap" class="student">
      <result property="Id" column="ID" columnIndex="0">
      <result property="Name" column="Name" columnIndex="1">
      <result property="Sex" column="Sex" columnIndex="2">
</resultMap>

dbType:指定resultset列数据类型,带来一定性能能提升
nullValue:属性nullValue指定数据库中null的替代值。因此,如果从ResultSet中读出null值,对象属性将被赋值属性null指定的替代值。属性null的值可以指定任意值,但必须对于对象属性的类型是合法的。

<resultMap id="studentmap" class="student">
     <result property="Id" column="ID">
     <result property="Name" column="Name">
     <result property="Sex" column="Sex">
     <result property="Address" column="Address" nullValue="学校宿舍">
</resultMap>

select:嵌套查询
      属性select用于描述对象之间的关系,并自动地装入复杂类型(即用户定义的类型)属性的数据。属性select的值必须是另外一个mapped statement元素的名称。在同一个result元素中定义的数据库字段(column属性)以及property属性,将被传给相关的mapped statement作为参数。因此,字段的属性类型必须是SQL MAP支持的简单数据类型。

案例:

<resultMap id="StudentMap" class="Student">
      <result property="Id" column="Id"/>
      <result property="Name" column="Name"/>
      <result property="Age" column="Age"/>
      <result property="Address" column="Address"/>
      <result property="ClassID" column="ClassID"/>
      <result property="Class" column="ClassID" select="SelectClass"/>
    </resultMap>
    
    <select id="SelectAllStudent" resultMap="StudentMap">
      SELECT
      Id,
      Name,
      Age,
      Address,
      ClassID
      FROM Student
    </select>
    <select id ="SelectClass" resultClass="Class">
      Select Id,ClassName from Class where Id=#Id#
    </select>

resultMap里的<result property="Class" column="ClassID" select="SelectClass"/>这一句里的Class是Student对象类里声明的Class对象的属性。
column="ClassID" 这是往关联查询SelectClass里传的参数。

column可以把多个参数传给相关的mapped statement。例如{param1=column1,param2=column2,.....,paramN=columnN}

在相关的mapped statement里就可以直接使用#param1#,#param2#等获取传来的参数。只要字段的次序和statement参数的次序相同,您也可以只指定字段名称。例如:{column1,column2},但通常这样做会对性能有轻微的影响,应影响到可读性和可维护性。

原文地址:https://www.cnblogs.com/gyyc/p/3330636.html