`
lzh166
  • 浏览: 297233 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iBATIS入门知识进阶四

阅读更多
一、关联数据的存储查询方式,以班级和学生为例,
在学生多方添加班级一方的引用,班级一端增加对学生集合的引用,建立双向关联

实体类
public class Classes {
	private int id;
	private String name;
         private List students; //不可以用set否则会出错
	
	public List getStudents() {
		return students;
	}
	public void setStudents(List students) {
		this.students = students;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

public class Student {
	private int id;
	private String name;
	private String sex;
	private Classes classes;
	
	public Classes getClasses() {
		return classes;
	}
	public void setClasses(Classes classes) {
		this.classes = classes;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

}


Classes.xml文件信息:
	<typeAlias alias="Classes" type="com.lzh.ibatis.Classes"/>

	<insert id="saveClasses" parameterClass="Classes">
		insert into t_classes values (null,#name#)
		<selectKey resultClass="int" keyProperty="id">
			select @@identity as id//存储时必须将id返回,以备学生所用
		</selectKey>
	</insert>

	<resultMap class="Classes" id="classes-result">
		<result property="id"/>
		<result property="name" column="cname"/>
		<result property="students" column="id" select="findStudentByCid"/>
	</resultMap>
	
	<select id="findClassesById" resultMap="classes-result" parameterClass="int">
		select * from t_classes where id=#id#
	</select>
	
	<select id="findClasses" resultMap="classes-result" parameterClass="int">
		select * from t_classes where id=#id#
	</select>


Student.xml文件:
	<typeAlias alias="Student" type="com.lzh.ibatis.Student"/>
  
           <insert id="saveStudent"  parameterClass="Student">
		insert into t_student values (null,#name#,#sex#,#classes.id#)
	</insert>

	<resultMap class="Student" id="findStudent-result">
		<result property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="sex" column="sex"/>
		<result property="classes" column="cid" select="findClassesById"/>
	</resultMap>
	
	<select id="findStudent" resultMap="findStudent-result" parameterClass="int">
		select * from t_student where id=#id#
	</select>
	
	<select id="findStudentByCid" resultMap="findStudent-result" parameterClass="int">
		select * from t_student where cid=#cid#
	</select>

在sqlMapConfig.xml文件增加上面这两个映射文件,为了是大家能更清楚,xml文件中所变化的内容,我将xml文件全部贴出:
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig SYSTEM "http://ibatis.apache.org/dtd/sql-map-config-2.dtd" >
<sqlMapConfig>
	<settings lazyLoadingEnabled="true"/>
	<transactionManager type="JDBC" commitRequired="false">
		<dataSource type="SIMPLE">
		<property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
		<property name="JDBC.ConnectionURL" value="jdbc:mysql://127.0.0.1/ibatis"/>
		<property name="JDBC.Username" value="root"/>
     	<property name="JDBC.Password" value="123"/>
		</dataSource>
	</transactionManager>
  <sqlMap resource="com/lzh/ibatis/Student.xml"/>
  <sqlMap resource="com/lzh/ibatis/Classes.xml"/>
</sqlMapConfig>


利用上面的方式,是可以实现的,不过需要明白为什么可以,如果在上面的xml配置文件中不增加lazyLoadingEnabled="true",程序将会陷入死循环,值栈溢出,同时集合映射时也必须指定为list,而无法使用set集合。
因此实现双向关联,需要完成下面两步操作

* 【双向关联】如果没有启用懒加载,将会出现StackOverFlow的异常!在设置lazyLoadingEnabled="true"(上面的xml文件中可以看到)
* 【双向关联】启用懒加载特性,而且将关联的集合定义为Set,无法进行双向关联定义(但定义成List就可以)

测试代码:
public void testSaveStudent()throws Exception{
		
		SqlMapClient sqlMapper = IbatisSQLMapConfig.getSqlMapInstance();
		Classes classes = new Classes();
		classes.setName("测试班级"+ new Random().nextInt(9999));
		sqlMapper.insert("saveClasses", classes);
		Student student = new Student();
		student.setName("学生"+new Random().nextInt(9999));
		student.setSex("男");
		student.setClasses(classes);
		sqlMapper.insert("saveStudent",student);
	}
	
	public void testFindClasses()throws Exception{
		
		SqlMapClient sqlMapper = IbatisSQLMapConfig.getSqlMapInstance();
		
		Classes cla = (Classes)sqlMapper.queryForObject("findClasses",1);
		System.out.println(cla.getName()+"有学生人数:"+cla.getStudents().size());
	}
    
         	public void testFindStudent()throws Exception{
		
		SqlMapClient sqlMapper = IbatisSQLMapConfig.getSqlMapInstance();
		
		Student stu = (Student)sqlMapper.queryForObject("findStudent",1);
		System.out.println(stu.getName()+"所属班级是:"+stu.getClasses().getName());
	}

下面来贴出sql语句:
CREATE TABLE t_student(
	id integer not null auto_increment,
	name varchar(255),
	sex varchar(255),
	cid integer,
	primary key(id)
);

CREATE TABLE t_classes(
	id integer not null auto_increment,
	cname varchar(255),
	primary key(id)
)


二、多态查询的映射策略

在设计数据库表的时候,需要提供一个辨别字段,来记录对象的类型,在插入数据的时候,我们要自己定义这个辨别字段的值,在查询数据的时候可以利用iBATIS提供的discriminator元素来映射多态的数据。
下面来贴出实体类代码:
/**
 * 基类
 * @author Administrator
 *
 */
public class Animal {
	private int id;
	private String name;
	private String sex;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}
/**
 * Bird子类
 * @author Administrator
 */
public class Bird extends Animal{
	private int height;

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}
}
/**
 * Pig子类
 * @author Administrator
 */
public class Pig extends Animal{
	private int weight;

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}
}
下面贴出Animal.xml配置文件的信息:
<sqlMap>
	<typeAlias alias="Animal" type="com.lzh.ibatis.Animal"/>
	<typeAlias alias="Bird" type="com.lzh.ibatis.Bird"/>
	<typeAlias alias="Pig" type="com.lzh.ibatis.Pig"/>

	<insert id="insertAnimal" parameterClass="Animal">
		insert into t_animal (name,sex,animal_type) values (#name#,#sex#,'Animal')
	</insert>
	<insert id="insertBird" parameterClass="Bird">
		insert into t_animal (name,sex,height,animal_type) values (#name#,#sex#,#height#,'Bird')
	</insert>
	<insert id="insertPig" parameterClass="Pig">
		insert into t_animal (name,sex,weight,animal_type) values (#name#,#sex#,#weight#,'Pig')
	</insert>
	
	<resultMap class="Animal" id="animal">
		<result property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="sex" column="sex"/>
		<discriminator column="animal_type" javaType="string">
			<subMap value="Bird" resultMap="bird"/>
			<subMap value="Pig" resultMap="pig"/>
		</discriminator>
	</resultMap>
	<resultMap class="Bird" id="bird" extends="animal">
		<result property="height" column="height"/>
	</resultMap>
	<resultMap class="Pig" id="pig" extends="animal">
		<result property="weight" column="weight"/>
	</resultMap>
	<select id="findAllAnimals" resultMap="animal">
		select * from t_animal
	</select>
</sqlMap>


在sqlMapConfig.xml文件中增加下面的映射
  <sqlMap resource="com/lzh/ibatis/Animal.xml"/>


测试代码:
public void testSaveAnimal() throws Exception{
		
		//从配置文件中得到SqlMapClient对象 
		SqlMapClient sqlMapper = IbatisSQLMapConfig.getSqlMapInstance();
		
		Animal a = new Animal();
		a.setName("动物");
		a.setSex("1");
		sqlMapper.insert("insertAnimal", a);
		
		Bird b = new Bird();
		b.setName("鸟");
		b.setSex("0");
		b.setHeight(1000);
		sqlMapper.insert("insertBird", b);
		
		Pig p = new Pig();
		p.setName("猪");
		p.setSex("1");
		p.setWeight(500);
		sqlMapper.insert("insertPig", p);
	}
	
	public void testFindAllAnimals() throws Exception{
		
		//从配置文件中得到SqlMapClient对象 
		SqlMapClient sqlMapper = IbatisSQLMapConfig.getSqlMapInstance();;
		
		List animals = sqlMapper.queryForList("findAllAnimals");
		for (Iterator iterator = animals.iterator(); iterator.hasNext();) {
			Animal a = (Animal) iterator.next();
			System.out.println(a.getName()+","+a);
		}
	}

sql建表语句:
create table t_animal(
	ID integer not null auto_increment,
	NAME varchar(255),
	SEX varchar(255),
	HEIGHT integer,
	WEIGHT integer,
	ANIMAL_TYPE varchar(20),
	primary key(ID)
);
分享到:
评论

相关推荐

    ibatis入门教程_ibatis入门教程_源码

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得...通过学习这个Ibatis入门教程,你可以了解并掌握如何在Java应用中使用Ibatis进行数据操作,为后续的进阶学习和项目开发打下坚实的基础。

    ibatis经典入门

    【标签】"ibaits 入门"提醒我们关注的重点是iBATIS的基础知识和入门教程。在学习过程中,我们需要了解iBATIS的基本概念、配置、SQL映射文件的编写、事务管理以及如何在实际项目中应用iBATIS。 【压缩包子文件的文件...

    Ibatis的相关指南

    - "J2EE核心:iBatis DAO入门与进阶二中国IT实验室.mht":可能包含Ibatis在J2EE环境中的高级用法和最佳实践。 - "ibatis开发人员指南.mht"、"ibatis开发人员指南2.mht"、"ibatis开发人员指南3.mht":这些指南可能...

    iBATIS-SqlMaps-2-Tutorial_cn

    总的来说,《iBATIS-SqlMaps-2-Tutorial_cn》是一本全面覆盖iBATIS基础和进阶内容的教程,它不仅适合初学者入门,也对有一定经验的开发者有很好的参考价值。通过阅读本书,你可以深入理解iBATIS的工作原理,掌握其...

    iBATIS实战

    附录A iBATIS.NET快速入门 264 A.1 比较iBATIS和iBATIS.NET 264 A.1.1 为何Java开发人员应该关心iBATIS.NET 264 A.1.2 为何.NET开发人员应该关心iBATIS.NET 265 A.1.3 主要区别是什么 265 A.1.4 相似之处又在哪里 ...

    ibatis学习资料大全

    2. **Ibatis学习指南**:这可能是中文版的学习资料,针对初学者提供了详尽的入门教程和进阶指南。学习指南通常会涵盖Ibatis的基本概念,如SqlMapConfig.xml配置文件、Mapper接口的使用、SqlSession的操作,以及...

    ibatis资料整理.zip

    这是一份宝贵的Ibatis学习材料,涵盖了从基础到进阶的各种内容。 【标签】:Ibatis、整理、ZIP、入门、Java 【知识点详解】: 1. **Ibatis简介**:Ibatis是一个基于Java的持久层框架,它简化了数据库操作,通过...

    webwork增删改简单入门例子(+spring+ibatis)

    在这个“webwork增删改简单入门例子(+spring+ibatis)”中,我们将探讨如何结合Spring和iBatis这两个流行的技术来构建一个基础的CRUD(创建、读取、更新、删除)应用。 1. WebWork基础知识: - 控制器:WebWork的...

    ibatis相关的3个文档

    首先,`ibatis的中文教程`是初学者入门的最佳选择。Ibatis中文教程通常会详细介绍如何配置Ibatis环境,包括XML配置文件的编写、Mapper接口的定义、SqlSession的使用等基础内容。此外,还会讲解动态SQL的概念,这是...

    ibatis大全

    【描述】"ibatis2入门"指出这是一套针对iBATIS 2.x版本的学习资料,涵盖了从基础到进阶的内容。"struts2+spring2+ibatis2整合"则表明本资料包不仅关注iBATIS,还讨论了如何将iBATIS与另外两个流行的企业级框架——...

    01 mybatis概述与进阶2

    【Mybatis概述与进阶2】课程主要涵盖了Mybatis的基础知识和进阶使用,包括ORM框架的概念、Mybatis的特点以及快速入门步骤。Mybatis是一个流行的Java持久层框架,它的前身是iBatis,是一个半自动的ORM(对象关系映射...

    Struts2入门宝典

    《Struts2入门宝典》覆盖了Struts2框架的基础知识、核心概念以及高级特性,适合初学者快速入门和进阶学习。通过阅读这份宝典,开发者可以全面理解Struts2的工作原理和应用场景,为进一步深入学习和实践打下坚实的...

    MyIbatIS中文版电子书

    《MyIbatIS中文版电子书》是一本旨在帮助初学者轻松入门MyBatis框架的教程,涵盖了从基础到进阶的全方位知识。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,解决了在Java中操作数据库时...

    程序员从初级到高级知识汇集

    【程序员从初级到高级知识汇集】是一本涵盖了程序员从入门到精通所需掌握的全面知识的资料集合。本书针对初级和高级程序员,旨在提供一个系统化的学习路径,帮助程序员提升技能,成为行业专家。 1. **Java知识** -...

    hibernate资料3

    总的来说,这份"hibernate资料3"是一个完整的Hibernate入门到进阶的学习资源,通过尚学堂马士兵老师的讲解,你可以系统地掌握Hibernate 3.3.2的基本用法和实践技巧,为Java开发中的数据库操作提供有力的支持。...

    一个程序员的自省(博客园)--超级推荐

    作者通过自己的F#探险之旅,整理了相关教程,帮助初学者快速入门,并对比了F#与C#的差异,强调了函数式编程的优势。 【Visual Studio插件增强开发体验】 Visual Studio的插件生态系统极大地丰富了IDE的功能,使...

    帮助文档大全

    Java的文档主要讲解了语法基础、类和对象、异常处理、集合框架、多线程、I/O流等内容,是开发者入门和进阶的重要资源。 2. **Hibernate**: Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与...

    java学习知识点,从何学起

    在J2EE进阶阶段,你需要掌握EJB(Enterprise JavaBeans),包括无状态和有状态会话Bean、实体Bean(BMP和CMP)、JMS、事务和安全机制。此外,还需要了解WebService的开发和应用,以便于不同系统间的通信。 接下来,...

Global site tag (gtag.js) - Google Analytics