您的位置:首页 > 其它

IBatis配置一对一、一对多两种实现方式

2016-01-08 22:41 357 查看

IBatis配置一对一、一对多两种实现方式

有两张表:student(id,name,num,classes_id)、classes(id,description),一个学生只属于某一个班级,但某一个班下可以有多个学生。

一对一配置

方式一:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="one-to-one">
<typeAlias alias="student" type="com.test.Student" />
<typeAlias alias="classes" type="com.test.Classes" />

<resultMap class="student" id="studentResult">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="num" column="num" />
<result property="classes" column="classes_id" select="getClasses" />
</resultMap>

<resultMap class="classes" id="classesResult">
<result property="id" column="id" />
<result property="description" column="description" />
</resultMap>

<select id="getStudent" parameterClass="student" resultMap="studentResult">
select id,name,num,classes_id from student where id = #id#
</select>

<select id="getClasses" parameterClass="int" resultMap="classesResult">
select id,description from classes where id = #value#
</select>
</sqlMap>


方式二:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="one-to-one">
<typeAlias alias="student" type="com.test.Student" />
<typeAlias alias="classes" type="com.test.Classes" />

<resultMap class="description" id="studentResult">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="num" column="num" />
<result property="classes" resultMap="classesResult" />
</resultMap>

<resultMap class="classes" id="classesResult">
<result property="id" column="classes_id" />
<result property="description" column="description" />
</resultMap>

<select id="getStudent" parameterClass="student" resultMap="studentResult">
select s.id,s.name,s.num,s.classes_id,c.description from student s
join classes c on s.classes_id = c.id where id = #id#
</select>

</sqlMap>


一对多配置

方式一:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="one-to-many">
<typeAlias alias="student" type="com.test.Student" />
<typeAlias alias="classes" type="com.test.Classes" />

<resultMap class="classes" id="classesResult">
<result property="id" column="id" />
<result property="description" column="description" />
<result property="studentList" column="id" select="getStudent"/>
</resultMap>

<resultMap class="student" id="studentResult">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="num" column="num" />
<result property="classes.id" column="classes_id" />
</resultMap>

<select id="getClasses" parameterClass="classes" resultMap="classesResult">
select id,description from classes where id = #id#
</select>

<select id="getStudent" parameterClass="int" resultMap="studentResult">
select id,name,num,classes_id from student where id = #value#
</select>

</sqlMap>


方式二:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="one-to-many">
<typeAlias alias="student" type="com.test.Student" />
<typeAlias alias="classes" type="com.test.Classes" />

<resultMap class="classes" id="classesResult" groupBy="id">
<result property="id" column="id" />
<result property="description" column="description" />
<result property="studentList" column="id" resultMap="studentResult"/>
</resultMap>

<resultMap class="student" id="studentResult">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="num" column="num" />
</resultMap>

<select id="getClasses" parameterClass="classes" resultMap="classesResult">
select c.id,c.description,s.id as student_id,s.name,s.num from classes c
join student s on s.classes_id = c.id where id = #id#
</select>

</sqlMap>


对比:

方式一结构清晰,但查询会有N+1(N为主表的结果集数量,主表查询一次,附表查询N次)的问题

方式二(推荐)是方式一的改进,性能更好,一次查询出所有结果,但结构复杂时维护起来不如方式一简介明了

ibatis支持延迟加载,如果设置延迟加载,方式一会更加高效,只有在用到子表时才会去查询字表数据。如果极少使用子表信息,可以使用方式一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: