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支持延迟加载,如果设置延迟加载,方式一会更加高效,只有在用到子表时才会去查询字表数据。如果极少使用子表信息,可以使用方式一。
相关文章推荐
- JAVA中重写equals()方法的同时要重写hashcode()方法
- Thinkphp框架中使用数据对象自动处理添加数据库数据时,关于在数据库表中添加新列时出现新列的数据添加不上去?
- 【转】字符编码
- 如何分析Android的Log
- Same Tree 判断俩树是不是一样
- java-NoSuchMethodError问题解决——傻瓜式
- 企业服务总线解决方案剖析,第 1 部分: 企业服务总线的基本概念
- com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "safeKey"
- Windows server 2008 R2 AD DS搭建
- Android设置监听回调的方式
- 使用tableview的表头button 实现多 cell 的选择
- 9、SQL Server 操作数据
- Nginx 安装(Linux CentOS)
- 使用hexo创建github博客
- win7上python+theano+keras安装
- 在vc里使gif背景透明
- Android项目里,strings文件中字符串的格式化用法
- 操作系统学习笔记:安全
- 操作系统学习笔记:安全
- VS2010问题解决办法☞fatal error LNK1168如何避免