`

ibatis 学习笔记 4

阅读更多
这篇实践一下一对一、一对多两种关系的映射操作,首先建立数据库
一共三张表 分别为 person表 card表 address表
关系是person有一个card,多个address数据

address表
address_id address_name address_person
1 nb 1
2 hz 1
3 bj 1

card表
card_id card_info
1 vip

person表
person_id person_name person_card_id
1 pf 1
新建一个工程,目录结构如下:

需要添加的jar包:
ibatis-3-core-3.0.0.242.jar
dglib-nodep-2.2.jar
asm-1.4.1.jar
ojdbc14_g.jar
可以在http://www.findjar.com/index.x这个网址上搜到相关jar包

SqlMapConfig.xml

<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>

<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
settings>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="puf"/>
<property name="password" value="pufang890505"/>
<property name="poolMaximumActiveConnections" value="10"/>
<property name="poolMaximumIdleConnections" value="10"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
<property name="poolTimeToWait" value="20000"/>
<property name="poolPingQuery" value="NO PING QUERY SET"/>
<property name="poolPingEnabled" value="false"/>
<property name="poolPingConnectionsNotUsedFor" value="0"/>
dataSource>
environment>
environments>

<mappers>
<mapper resource="cn/pf/ibatis/domain/Person.xml"/>
mappers>

configuration>


相关的pojo

person.java
package cn.pf.ibatis.domain;

import java.util.List;

/**
* ...
* @author  pf
* @version 2010-3-22下午08:07:20
*/
public class Person {
private int id;
private String name;
private Card card;
private List
addressList;
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 Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
public List
getAddressList() {
return addressList;
}
public void setAddressList(List
addressList) {
this.addressList = addressList;
}
@Override
public String toString() {
String s = "Person [id=" + id + ", name=" + name;
s += ", card=[id:"+card.getId()+", info:"+card.getInfo()+"]";
s += ", address=[";
for(int i=0;i
s += "[id:"+addressList.get(i).getId()+", address:"+addressList.get(i).getAddress()+"]";
}
s += "]]";
return s;
}

}

Address.java

package cn.pf.ibatis.domain;
/**
 * ...
 * @author  pf
 * @version 2010-3-22下午08:09:46
 */
public class Address {
	private int id;
	private String address;
	private Person person;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	
}


Card.java

package cn.pf.ibatis.domain;
/**
 * ...
 * @author  pf
 * @version 2010-3-22下午08:07:48
 */
public class Card {
	private int id;
	private String info;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	
}

Person.xml

<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">




<mapper namespace="cn.pf.ibatis.dao.PersonDAO">

<resultMap id="cardResultMap" type="cn.pf.ibatis.domain.Card">
<id property="id" column="card_id" />
<result property="info" column="card_info"/>
resultMap>

<resultMap id="addressResultMap" type="cn.pf.ibatis.domain.Address">
<id property="id" column="address_id" />
<result property="address" column="address_address"/>

resultMap>

<resultMap id="personResultMap" type="cn.pf.ibatis.domain.Person">
<id property="id" column="person_id" />
<result property="name" column="person_name"/>
<association property="card" column="person_card_id" javaType="cn.pf.ibatis.domain.Card" resultMap="cardResultMap"/>
<collection property="addressList" ofType="cn.pf.ibatis.domain.Address" resultMap="addressResultMap"/>
resultMap>
<select id="queryAllPerson" resultMap="personResultMap">
select
c.card_id as card_id,
c.card_info as card_info,
p.person_id as person_id,
p.person_name as person_name,
a.address_id as address_id,
a.address_address as address_address
from Person p ,Address a,Card c
where c.card_id = p.person_card_id
and p.person_id = a.address_person_id
select>
mapper>


PersonDAO.java

package cn.pf.ibatis.dao;

import java.util.List;

import cn.pf.ibatis.domain.Person;

/**
* ...
* @author  pf
* @version 2010-3-22下午11:11:30
*/
public interface PersonDAO {
public List queryAllPerson();
}


test.java

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

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import cn.pf.ibatis.dao.PersonDAO;
import cn.pf.ibatis.domain.Person;

/**
 * ...
 * @author  pf
 * @version 2010-3-16下午03:13:24
 */
public class test {

	/**
	 * ...
	 * @param args
	 */
	public static void main(String[] args) {
		String resource = "SqlMapConfig.xml";
		Reader reader = null;
		try {
			//使用ibatis提供的Resources类读取资源文件
			reader = Resources.getResourceAsReader(resource);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//根据资源文件内容建立session工厂
		SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);   
		//session工厂打开一个session
		SqlSession session = sqlMapper.openSession(true);  
		

		PersonDAO personDAO = session.getMapper(PersonDAO.class);		
		List personList;	
		try{
			personList = personDAO.queryAllPerson();
		}finally{
			session.close();
		}
	}



上面采用的是Nested Results方法实现的,sql语句中的表关联均为手动实现,下面我们试着用Nested Select方法实现以下。

Person.xml
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">




<mapper namespace="cn.pf.ibatis.dao.PersonDAO">

<resultMap id="cardResultMap" type="cn.pf.ibatis.domain.Card">
<id property="id" column="card_id" />
<result property="info" column="card_info"/>
resultMap>

<resultMap id="addressResultMap" type="cn.pf.ibatis.domain.Address">
<id property="id" column="address_id" />
<result property="address" column="address_address"/>

resultMap>

<resultMap id="personResultMap" type="cn.pf.ibatis.domain.Person">
<id property="id" column="person_id" />
<result property="name" column="person_name"/>
<association property="card" column="person_card_id" javaType="cn.pf.ibatis.domain.Card" select="queryCardById"/>
<collection property="addressList" ofType="cn.pf.ibatis.domain.Address" column="person_id" select="queryAddressByPersonId"/>
resultMap>

<select id="queryCardById" parameterType="int" resultMap="cardResultMap">
select
card_id,
card_info
from card
where card_id = #{id}
select>

<select id="queryAddressByPersonId" parameterType="int" resultMap="addressResultMap">
select
address_id,
address_address
from address
where address_person_id = #{id}
select>

<select id="queryAllPerson" resultMap="personResultMap">
select
person_id,
person_name,
person_card_id
from person
select>
mapper>


跟踪变量的时候发现personList = personDAO.queryAllPerson();语句并没有将card和address属性查出,均为null,在后面for循环输出的时候才进行赋值,但是又发现一个问题,test.java代码段中for循环输出前以前调用session.close(),按照hibernate的理解应该不能懒加载了,可是居然可以,而使用session.getConnection().close();直接关闭链接就无法查出card和address属性。不明白session.close()关闭了什么东西。。。

发现ibatis还有很多事情是需要自己动手编码完成的,hibernate自动化程度就高很多了,还是喜欢hibernate一点,ibatis 还有很多没搞明白,继续找资料,继续学习。
分享到:
评论

相关推荐

    IBatis学习笔记以及使用心得

    IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得

    ibatis学习笔记

    ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记

    iBatis2学习笔记

    4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc 6.iBatis2学习笔记:一对多映射(双向).doc 7.iBatis2学习笔记:多对多映射(双向) .doc 8.iBatis2学习笔记:总结与...

    ibatis学习笔记.txt

    ### iBatis 学习笔记知识点总结 #### 一、iBatis 概念与特点 **1.1 iBatis 定义** - **iBatis** 是一个基于 Java 的开源持久层框架,它专注于 SQL 映射,提供了一种将对象与数据库交互过程中的 SQL 语句进行分离的...

    ibatis 学习笔记

    iBATIS 是一款著名的Java持久层框架,它与Hibernate等全自动化ORM解决方案不同,提供了一种半自动化的处理方式,让开发者对SQL拥有更大的控制权。在iBATIS中,主要包括SQL Maps和Data Access Objects(DAO)两个核心...

    持久层框架ibatis学习笔记

    通过本文的学习笔记,我们可以了解到 iBatis 在简化数据库访问的同时提供了足够的灵活性。尽管 iBatis 相比 Hibernate 在自动化程度上略显不足,但对于需要高度定制 SQL 查询的场景来说,iBatis 的优势十分明显。...

    ibatis学习笔记(一)

    这篇“ibatis学习笔记(一)”可能是博主对Ibatis基础概念、安装配置以及基本使用的介绍,让我们通过标签“源码”和“工具”来深入探讨Ibatis的相关知识。 首先,Ibatis是一个轻量级的Java ORM(对象关系映射)框架...

    Ibatis学习笔记,文档,资源6合1

    这个压缩包集合了Ibatis的学习笔记、文档和相关资源,为想要深入理解和掌握Ibatis的人提供了一站式的自学材料。 Ibatis的核心概念是SQL Mapping,它允许开发者将SQL语句直接写在XML配置文件中,或者使用注解方式,...

    IBATIS学习笔记

    ### IBATIS学习笔记知识点详解 #### 一、IBATIS简介 iBatis是一个用于Java的数据持久化框架,类似于Hibernate、JDO和EJB等技术。它的主要特点是将对象映射为SQL语句,这使得开发人员可以更加灵活地控制SQL的执行,...

    ibatis教程学习笔记

    ### ibatis教程学习笔记 #### 一、ibatis简介与特点 ibatis 是一个基于 Java 的持久层框架,它提供了一种将 SQL 映射到 Java 对象的方式,简化了 JDBC 的复杂操作。ibatis 通过 XML 配置文件或者注解的形式来描述 ...

    ibatis学习资料及个人学习笔记,对初学者很有用

    【ibatis学习资料及个人学习笔记】 Ibatis,作为一个轻量级的持久层框架,它在Java开发领域中占有重要地位。本资料包是针对Ibatis的学习资源集合,旨在帮助初学者快速掌握这一强大的数据库操作工具。Ibatis的核心...

    iBatis学习笔记

    ### iBatis学习笔记 #### 一、iBatis简介 iBatis,又被称为SqlMap,是一款开源的“半自动”对象关系映射(Object Relational Mapping, ORM)框架,它通过将SQL语句与Java代码进行解耦,简化了数据库操作。与全自动...

Global site tag (gtag.js) - Google Analytics