MyBatis笔记四之一对一关联映射

一对一关系推荐使用唯一主外键关联,即两个表使用外键关联,由于是一对一关联,因此还需要给外键增加unique唯一约束。

下面我们以每个人只有一张身份证,一个身份证对应一个人为例。

1、在数据库mybatis中新建两张表,并插入一条数据,表结构如下:

表数据如下:

2、在mybatis项目中的pojo目录下新建与两个表相对应的pojo对象。

package pojo;

import java.io.Serializable;

public class Card implements Serializable{

	private Integer id;
	private String code;
	public Card(){}
	public Card(String code){
		this.code = code;
	}
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
}
package pojo;

import java.io.Serializable;

public class Person implements Serializable{

	private Integer id;
	private String name;
	private Card card;
	public Person(){}
	public Person(String name,Card card){
		this.name = name;
		this.card = card;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer 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;
	}
}

3、在mapping目录下新建两个对象的映射文件

mapping/CardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapping.CardMapper">
	<select id="selectCardById" parameterType="int" resultType="pojo.Card">
		select*from card where id = #{id}
	</select>
</mapper>

mapping/PersonMapper.xml,在这里使用了<association/>元素映射一对一的关联关系,select属性表示会使用column属性的card_id值作为参数执行CardMapper中定义的selectCardById查询对的Card数据,查询出的数据将封装到property表示的card对象当中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapping.PersonMapper">
	<!-- 设置返回的对象 -->
	<resultMap type="pojo.Person" id="personResult">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<!-- 一对一关联 select的值对应CardMapper.xml的命名空间+select的id-->
		<association property="card" column="card_id" javaType="pojo.Card" select="mapping.CardMapper.selectCardById"/>
	</resultMap>
	<!-- 查询person -->
	<select id="selectPersonById" parameterType="int" resultMap="personResult">
		select*from person where id = #{id}
	</select>
</mapper>

4、编写mapper接口,与mapper映射文件在同级目录下。注意,这里的类名需与配置文件中的namespace一致,而方法名和参数也必须与xml文件中<select/>标签的id属性和parameterType属性一致,

package mapping;

import pojo.Person;

public interface PersonMapper {

	Person selectPersonById(Integer id);
}

5、在mybatis-config配置文件下声明刚刚创建的两个映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 指定所有日志的具体实现 -->
	<settings>
		<setting name="logImpl" value="LOG4J"/>
	</settings>
	<!-- 环境配置 -->
	<environments default="mysql">
		<environment id="mysql">
			<!-- 指定事务管理类型 -->
			<transactionManager type="JDBC" />
			<!-- 配置数据源,POOLED是JDBC连接对象的数据源连接池的实现 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	<!-- mappers告诉mybatis找持久化类的映射文件 -->
	<mappers>
		<mapper resource="mapping/UserMapper.xml"/>
		<mapper resource="mapping/PersonMapper.xml"/>
		<mapper resource="mapping/CardMapper.xml"/>

	</mappers>
</configuration>

6、编写一个工厂类用于读取mybatis-config配置文件并生成对应的SqlSession

package factory;

import java.io.IOException;
import java.io.InputStream;

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

public class MyFactory {

	private static SqlSessionFactory ssf = null;
	static{
		try {
			InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
			ssf = new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//获取SqlSession的静态方法
	public static SqlSession getSqlSession(){
		return ssf.openSession();
	}
	//获取SqlSessionFactory的静态方法
		public static SqlSessionFactory getSqlSessionFactory(){
			return ssf;
		}
}

7、编写一对一的测试类

package reflectTest;

import org.apache.ibatis.session.SqlSession;

import factory.MyFactory;
import mapping.PersonMapper;
import pojo.Person;

public class OneToOne {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SqlSession session = MyFactory.getSqlSession();
		PersonMapper pm = session.getMapper(PersonMapper.class); //通过代理对象访问
		Person p = pm.selectPersonById(1); //查询id为1的person信息
		System.out.println(p.getId()+":"+p.getName());
		System.out.println(p.getCard().getId()+":"+p.getCard().getCode());
		session.commit();
		session.close();
	}

}

运行结果:

 

注意:mapper的接口代理对象一定要与映射文件处于同一级目录,否则会报错

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值