`
tonyJ
  • 浏览: 145090 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

ibatis多对多示例

 
阅读更多
1、iBATIS的多对多映射配置方法和多对一映射配置方法差不多,不同的是,多对多映射,数据库设计上需要一个记录两个类关系的中间表,本文以学生-老师为例,在iBATIS的sqlmap中配置多对多关系。

2、构建数据库表如下,student表,teacher表和student_teacher表:(使用mysql数据库)
student表:
create table student(
   id int(10) not null auto_increment,
   name varchar(20) ,
   birthday varchar(20),
   primary key(id) 
);

insert into student(name,birthday) values('张三','1982-01-01'); 
insert into student(name,birthday) values('李四','1983-02-02');  
insert into student(name,birthday) values('王五','1984-03-03');
insert into student(name,birthday) values('赵六','1985-04-04'); 

teacher表:
create table teacher(
   id int(10) not null auto_increment,
   name varchar(20),
   subject varchar(20),
   primary key(id) 
);

insert into teacher(name,subject) values('Jerry','语文'); 
insert into teacher(name,subject) values('Tom','数学');  
insert into teacher(name,subject) values('Steven','英语'); 

student_teacher表:
create table student_teacher(
	studentid int(10) not null,
	teacherid int(10) not null,
	primary key(studentid,teacherid) 
);

insert into student_teacher(studentid,teacherid) values(1,1);
insert into student_teacher(studentid,teacherid) values(1,2);
insert into student_teacher(studentid,teacherid) values(2,1);
insert into student_teacher(studentid,teacherid) values(3,2); 


3、生成相应的JavaBean
Student.java
package com.tonyj.pojo;

import java.util.List;

public class Student {
	private int id;
	private String name;
	private String birthday;
	private List<Teacher> teachers;//表示一个学生可以有多个老师教
	//相应的getter和setter 方法,构造方法
}


Teacher.java
package com.tonyj.pojo;

import java.util.List;

public class Teacher {
	private int id;
	private String name;
	private String subject;
	private List<Student> students; //表示一个老师可以教多个学生
	//相应的getter和setter方法,构造方法
}


4、ibatis的配置文件的配置
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<properties resource="jdbc.properties"/>
	<settings 
		cacheModelsEnabled="true"
		enhancementEnabled="true"
		lazyLoadingEnabled="true"
		maxRequests="32"
		maxSessions="10"
		maxTransactions="5"
		useStatementNamespaces="true"/> 
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			 <property name="JDBC.Driver" value="${jdbc.driverClassName}"/>
			 <property name="JDBC.ConnectionURL" value="${jdbc.url}"/>
			 <property name="JDBC.Username" value="${jdbc.userName}"/>
			 <property name="JDBC.Password" value="${jdbc.password}"/>
		</dataSource>
	</transactionManager>
	<sqlMap resource="teacher.xml"/>
	<sqlMap resource="student.xml"/>
</sqlMapConfig>


配置连接数据库的资源文件:
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/vin
jdbc.userName=root
jdbc.password=sa


studnet.xml配置文件:
<?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 >
	<typeAlias alias="Teacher" type="com.tonyj.pojo.Teacher"/>
	<typeAlias alias="Student" type="com.tonyj.pojo.Student"/>
	<resultMap class="Student" id="studentBasicResultMap">
		<result property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="birthday" column="birthday"/>
	</resultMap>
	<resultMap class="Student" id="studentWithTeacherResultMap"
				extends="studentBasicResultMap">
		<result property="teachers" column="id" select="getTeachersByStudentId"/>
	</resultMap>
	<select id="getStudents" resultMap="studentWithTeacherResultMap">
		<![CDATA[
			select * from student
		]]>
	</select>
	<select id="getTeachersByStudentId" resultClass="Teacher" parameterClass="int">
		<![CDATA[
			select t.* 
			from teacher t,student_teacher st 
			where t.id=st.teacherid and st.studentid=#value#
		]]>
	</select>
</sqlMap>


teacher.xml配置文件:
<?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>
	<typeAlias alias="Teacher" type="com.tonyj.pojo.Teacher"/>
	<typeAlias alias="Student" type="com.tonyj.pojo.Student"/>
	<resultMap class="Teacher" id="teacherBasicResultMap">
		<result property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="subject" column="subject"/>
	</resultMap>
	<!-- 下面这个resultMap中有个students属性,这个结果映射继承自上面的结果映射   
		 由于有了继承,结果映射可以任意扩展 -->
	<resultMap class="Teacher" id="teacherWithTeacherResultMap" 
				extends="teacherBasicResultMap">
		<result property="students" column="id" select="getStudentsByTeacherId"/>
	</resultMap>
	<!--这个查询中使用到了上面定义的结果映射,从而决定了查询出来的Teacher中关联出相关的students,
	在student.xml中配置相似,不再注释。 -->
	<select id="getTeachers" resultMap="teacherWithTeacherResultMap">
		<![CDATA[
			select * from teacher
		]]>
	</select>	 
	<select id="getStudentsByTeacherId" resultClass="Student" parameterClass="int">
		<![CDATA[
			select s.* 
			from student s,student_teacher st 
			where s.id=st.studentid and st.teacherid=#value#
		]]>
	</select>
</sqlMap>


5、测试类的编写
IbatisMany2Many.java
package com.tonyj.test;

import java.io.Reader;
import java.util.List;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.tonyj.pojo.Student;
import com.tonyj.pojo.Teacher;

public class IbatisMany2Many {
	public static void main(String[] args) throws Exception {
		Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
		
		List<Student> studentList=sqlMap.queryForList("getStudents");
		Student stu=null;
		for(int i=0;i<studentList.size();i++){
			stu=studentList.get(i);
			System.out.println("name:"+stu.getName() + "\t" + "birthday:"
								+stu.getBirthday());  
			List<Teacher> tList=stu.getTeachers();
			if(tList!=null){
				System.out.println("his teachers as follows:");
				Teacher t=null;
				for(int j=0;j<tList.size();j++){
					t=tList.get(j);
					System.out.println("teacher name:"+t.getName());
				}
			}
		}
		System.out.println("============================================");
		List<Teacher> tcherList=sqlMap.queryForList("getTeachers");
		Teacher tcher=null;
		for(int k=0;k<tcherList.size();k++){
			tcher=tcherList.get(k);
			System.out.println("name:"+tcher.getName()+"\t subject:"
								+tcher.getSubject());
			List<Student> studsList=tcher.getStudents();
			if(studsList!=null){
				System.out.println("his students as follows:");
				Student s=null;
				for(int m=0;m<studsList.size();m++){
					s=studsList.get(m);
					System.out.println("student name:"+s.getName());
				}
			}
		}
	}
}



6、执行结果如下:
log4j:WARN No appenders could be found for logger (com.ibatis.common.jdbc.SimpleDataSource).
log4j:WARN Please initialize the log4j system properly.
name:张三	birthday:1982-01-01
his teachers as follows:
teacher name:Jerry
teacher name:Tom
name:李四	birthday:1983-02-02
his teachers as follows:
teacher name:Jerry
name:王五	birthday:1984-03-03
his teachers as follows:
teacher name:Tom
name:赵六	birthday:1985-04-04
his teachers as follows:
============================================
name:Jerry	 subject:语文
his students as follows:
student name:张三
student name:李四
name:Tom	 subject:数学
his students as follows:
student name:张三
student name:王五
name:Steven	 subject:英语
his students as follows:

分享到:
评论

相关推荐

    ibatis多对多关系(详细)

    在本例中,我们将使用学生(Student)和教师(Teacher)之间的多对多关系作为示例。一个学生可以有多个教师,而一个教师也可以有多个学生。 数据库设计 首先,我们需要设计数据库表来存储学生和教师之间的多对多...

    ibatis一对一、多对一示例

    利用ibatis实现一对一、多对一的示例代码。每种关系用两种方式实现,具体的讲解可看我的博客http://blog.csdn.net/duwenchao1986/article/details/8565386

    ibatis多对一代码示例

    ### ibatis多对一代码示例解析 #### 一、ibatis简介与多对一映射概念 在深入了解本文档之前,我们先简单回顾一下ibatis(现称为MyBatis)的基本概念及其在多对一关系处理上的应用。ibatis是一款优秀的持久层框架,...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,...实践是检验真理的唯一标准,所以亲自动手尝试这个ibatis demo,会让你对Ibatis的理解更加深入。

    一个用ibatis框架开发的示例项目

    《深入解析:基于Ibatis框架的示例项目》 Ibatis,作为一个轻量级的Java持久层框架,因其简单易用、灵活性高而备受开发者喜爱。在这个示例项目中,我们将探讨Ibatis的核心概念,包括SQL映射文件、动态SQL、事务管理...

    Castle+ibatis代码示例

    在这个"Castle+ibatis代码示例"中,我们将深入探讨这两个框架如何协同工作,以实现更加灵活、可维护的软件架构。 首先,让我们了解Castle项目。Castle Project是一个.NET平台上的开源开发工具集,它包含多个组件,...

    Struts+Spring+Ibatis示例

    这个"Struts+Spring+Ibatis示例"提供了一个基础的整合应用,帮助开发者理解这三者如何协同工作。 **Struts** 是一个基于 Model-View-Controller (MVC) 设计模式的Java web框架,主要负责处理用户请求,控制应用程序...

    JSF+Spring+Ibatis示例

    JSF+Spring+Ibatis示例,对学习JAVA企业应用开发有巨大的帮助!

    ibatis 完整示例下载

    同时支持复杂的一对多、多对一、一对一关系的映射。 4. **事务管理**:iBATIS支持手动和自动的事务控制,可以根据业务需求灵活配置事务的边界。 5. **缓存机制**:内置的本地缓存和二级缓存机制,可以提高数据访问...

    JSF+iBATIS+MySQL示例代码

    目前网上罕见的JSF+iBATIS+MySQL示例代码,公司某软件项目所需而做的前期DEMO,只有两个Web页面,用户登录和用户列表,但已经能够说明JSF+iBATIS的典型应用方式。 MyEclipse6.5 项目工程文件,内含SQL建库指令。 ...

    ibatis3.0示例

    《深入解析iBatis 3.0:基于mybatis-jpetstore-6.0.1示例》 iBatis,又称MyBatis,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。iBatis 3.0版本(也称为MyBatis 3.0)引入了许多新特性,极大地...

    ibatis经典示例

    本篇将通过一个典型的iBatis示例,深入解析其核心概念、配置及使用方法。 ## 一、iBatis简介 iBatis起源于MyBatis的早期版本,它是一个轻量级的ORM(对象关系映射)框架,主要解决了在Java应用中操作数据库时的...

    ibatis-缓存使用示例

    本示例主要关注iBATIS的缓存功能,这是提升系统性能的重要机制。缓存可以减少对数据库的直接访问,从而降低系统负载,提高响应速度。 首先,iBATIS的缓存分为两种类型:一级缓存和二级缓存。一级缓存是SqlSession...

    ibatis多表查询过程

    在数据库设计中,多表查询通常涉及到表之间的关联,例如一对一、一对多、多对多关系。在iBatis中,我们可以使用`&lt;select&gt;`标签来定义多表查询的SQL语句。 ### 3. 使用`&lt;include&gt;`标签 为了保持SQL语句的整洁和可...

    ibatis API及示例

    5. **结果映射**:自动映射查询结果到Java对象,包括一对一、一对多、多对一的复杂映射。 6. **API使用**:解释SqlSession和Mapper接口的常用方法,如selectList、selectOne、insert、update和delete。 7. **事务...

    ibatis one to many mapping

    综上所述,iBatis 的一对多和多对多映射是数据库操作中的重要概念,它们通过 ResultMap 和特定的标签实现对象关系的映射,简化了数据访问层的编程。深入理解和熟练运用这些映射技术,能有效提高开发效率并降低维护...

    ibatis实现的学生信息管理示例

    这个名为“ibatis实现的学生信息管理示例”的项目,旨在帮助初学者理解并掌握如何利用Ibatis来处理数据库操作,如CRUD(创建、读取、更新、删除)学生信息。下面将详细介绍Ibatis框架的基本概念、工作原理以及如何...

    spring集成ibatis示例-websphere5.1选型webservice

    在本示例中,我们将探讨如何在Spring框架中集成iBATIS,并且将这个集成应用部署到WebSphere 5.1服务器上,并提供一个基于Web服务的接口。首先,我们需要理解Spring和iBATIS的基本概念。 Spring是一个开源的Java企业...

    struts + spring + ibatis 示例

    这个"Struts + Spring + iBatis 示例"项目Demo,旨在展示如何将这三个框架集成到一个应用中,实现高效且松耦合的开发模式。 **Struts框架**是MVC(Model-View-Controller)设计模式的一种实现,主要用于处理Web应用...

Global site tag (gtag.js) - Google Analytics