一、关联数据的存储查询方式,以班级和学生为例,
在学生多方添加班级一方的引用,班级一端增加对学生集合的引用,建立双向关联
实体类
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,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得...通过学习这个Ibatis入门教程,你可以了解并掌握如何在Java应用中使用Ibatis进行数据操作,为后续的进阶学习和项目开发打下坚实的基础。
【标签】"ibaits 入门"提醒我们关注的重点是iBATIS的基础知识和入门教程。在学习过程中,我们需要了解iBATIS的基本概念、配置、SQL映射文件的编写、事务管理以及如何在实际项目中应用iBATIS。 【压缩包子文件的文件...
- "J2EE核心:iBatis DAO入门与进阶二中国IT实验室.mht":可能包含Ibatis在J2EE环境中的高级用法和最佳实践。 - "ibatis开发人员指南.mht"、"ibatis开发人员指南2.mht"、"ibatis开发人员指南3.mht":这些指南可能...
总的来说,《iBATIS-SqlMaps-2-Tutorial_cn》是一本全面覆盖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 相似之处又在哪里 ...
2. **Ibatis学习指南**:这可能是中文版的学习资料,针对初学者提供了详尽的入门教程和进阶指南。学习指南通常会涵盖Ibatis的基本概念,如SqlMapConfig.xml配置文件、Mapper接口的使用、SqlSession的操作,以及...
这是一份宝贵的Ibatis学习材料,涵盖了从基础到进阶的各种内容。 【标签】:Ibatis、整理、ZIP、入门、Java 【知识点详解】: 1. **Ibatis简介**:Ibatis是一个基于Java的持久层框架,它简化了数据库操作,通过...
在这个“webwork增删改简单入门例子(+spring+ibatis)”中,我们将探讨如何结合Spring和iBatis这两个流行的技术来构建一个基础的CRUD(创建、读取、更新、删除)应用。 1. WebWork基础知识: - 控制器:WebWork的...
首先,`ibatis的中文教程`是初学者入门的最佳选择。Ibatis中文教程通常会详细介绍如何配置Ibatis环境,包括XML配置文件的编写、Mapper接口的定义、SqlSession的使用等基础内容。此外,还会讲解动态SQL的概念,这是...
【描述】"ibatis2入门"指出这是一套针对iBATIS 2.x版本的学习资料,涵盖了从基础到进阶的内容。"struts2+spring2+ibatis2整合"则表明本资料包不仅关注iBATIS,还讨论了如何将iBATIS与另外两个流行的企业级框架——...
【Mybatis概述与进阶2】课程主要涵盖了Mybatis的基础知识和进阶使用,包括ORM框架的概念、Mybatis的特点以及快速入门步骤。Mybatis是一个流行的Java持久层框架,它的前身是iBatis,是一个半自动的ORM(对象关系映射...
《Struts2入门宝典》覆盖了Struts2框架的基础知识、核心概念以及高级特性,适合初学者快速入门和进阶学习。通过阅读这份宝典,开发者可以全面理解Struts2的工作原理和应用场景,为进一步深入学习和实践打下坚实的...
《MyIbatIS中文版电子书》是一本旨在帮助初学者轻松入门MyBatis框架的教程,涵盖了从基础到进阶的全方位知识。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,解决了在Java中操作数据库时...
【程序员从初级到高级知识汇集】是一本涵盖了程序员从入门到精通所需掌握的全面知识的资料集合。本书针对初级和高级程序员,旨在提供一个系统化的学习路径,帮助程序员提升技能,成为行业专家。 1. **Java知识** -...
总的来说,这份"hibernate资料3"是一个完整的Hibernate入门到进阶的学习资源,通过尚学堂马士兵老师的讲解,你可以系统地掌握Hibernate 3.3.2的基本用法和实践技巧,为Java开发中的数据库操作提供有力的支持。...
作者通过自己的F#探险之旅,整理了相关教程,帮助初学者快速入门,并对比了F#与C#的差异,强调了函数式编程的优势。 【Visual Studio插件增强开发体验】 Visual Studio的插件生态系统极大地丰富了IDE的功能,使...
Java的文档主要讲解了语法基础、类和对象、异常处理、集合框架、多线程、I/O流等内容,是开发者入门和进阶的重要资源。 2. **Hibernate**: Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与...
### Struts2 入门与进阶知识点梳理 #### 一、Struts2框架简介 - **起源与发展**:Struts2是由Apache软件基金会维护的一个开源Web应用框架,它是Struts1和WebWork两个框架结合的产物。Struts2继承了Struts1的一些...
在J2EE进阶阶段,你需要掌握EJB(Enterprise JavaBeans),包括无状态和有状态会话Bean、实体Bean(BMP和CMP)、JMS、事务和安全机制。此外,还需要了解WebService的开发和应用,以便于不同系统间的通信。 接下来,...