mybatis的映射关系

一对一映射

SqlMapConfig.xml(公用的)

<?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>
	
	<!-- 加载配置文件 -->
	<properties resource="db.properties"></properties>
	<typeAliases>
	 <!-- 定义别名后,可以在mapper.xml中直接使用别名来代替被定义的数据类型 -->
		<!-- 针对单个别名定义
			type:要定义为别名的数据类型
			alias:别名名称
		 -->
		
		<!-- <typeAlias type="com.yunxiang.mybatis.pojo.User"  alias="user"/> -->
	<!-- 批量定义别名
		name:指定要定义别名的包名,
			mybatis会将该包下的所有类,
			自动定义别名,别名的名称是类名(类的首字母小写小写都可以)
	 -->
	 <package name="com.yunxiang.mybatis.pojo"/>
	</typeAliases>
	<environments default="development">
		
		<environment id="development">
			<!-- 使用jdbc事务管理,事务控制由mybatis -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池,由mybatis管理 -->
			<dataSource type="POOLED">
				<property name="driver" value="${driver}"/>
				<property name="url" value="${url}"/>
				<property name="username" value="${username}"/>
				<property name="password" value="${password}"/>
			</dataSource>
		</environment>
	</environments>
	<!-- 加载映射文件  -->
	<mappers>
		<!-- 提供resource来加载单个映射文件 -->
	<!-- 	<mapper resource="sqlmap/User.xml"/>
		<mapper resource="mapper/UserMapper.xml"/> -->
		<!-- 提供mapper接口来单个加载单个映射文件
				但是要保持mapper接口名与对应的xml文件名称一致,
				并且在一个目录下。
		
		 -->
		<!--  <mapper class="com.yunxiang.mybatis.dao.UserMapper"/> -->
		 <!-- 提供mapper接口来批量加载映射文件 -->
		 <package name="com.yunxiang.mybatis.dao"/>
	</mappers>
</configuration>

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
username=root
password=root

OrdersMapper.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">

<!-- namespace命名空间,作用就是对SQL进行
	 	分类化管理,在使用mapper代理时,namespace的值,
	 	必须是对应接口的全路径名。并且接口中的抽象方法、接受参数类型和返回值类型,
	 	必须与xml中的各标签的id值、接受参数类型和返回参数保持一致。并且xml和接口
	 	必须放置同一个包下。

 -->
<mapper namespace="com.yunxiang.mybatis.dao.OrdersMapper">

	<!-- 定义resultMap 
		id:用于指定查询列中的唯一标识,如果有多个列组成唯一标识,配置多个id
	-->
	<resultMap type="orders" id="ordersResultMapper">
		<id column="id" property="id"/>
		<result column="user_id" property="user_id"/>
		<result column="number" property="number"/>
		<result column="createTime" property="createTime"/>
		<result column="note" property="note"/>
		<!-- 
			association:用于关联单个对象的信息
			property:要将关联查询的用户对应到orders中的那个属性
			javaType:表示映射对应的对象
		
		 -->
		<association property="user" javaType="user">
			<!-- 
				id:用于指定关联用户的唯一标识
				column:指定唯一标识用户的列
				property:映射到user的那个属性
			 -->
			<id column="user_id" property="id"/>
			<result column="name" property="name"/>
			<result column="sex" property="sex"/>
			<result column="address" property="address"/>
		</association>
	</resultMap>
	
	<select id="testFindOrdersUserResultMap" parameterType="int" resultMap="ordersResultMapper">
	
		select 
			orders.*,
			user.name,
			user.sex,
			user.address
		from 
			orders,
			user 
		where user.id=orders.user_id 
		
	</select>	
	
</mapper>
	

Orders.java

import java.util.Date;
import java.util.List;

public class Orders {
	
	private int id;
	private int user_id;
	private int number;
	private Date createTime;
	private String note;
	//一对一的映射
	private User user;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
	@Override
	public String toString() {
		return "Orders [id=" + id + ", user_id=" + user_id + ", number=" + number + ", createTime=" + createTime
				+ ", note=" + note + ", user=" + user + "]";
	}
}

User.java

import java.util.Date;

public class User {
	
	private int id;
	private String name;
	private Date brithday;
	private String sex;
	private String address;
	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 Date getBrithday() {
		return brithday;
	}
	public void setBrithday(Date brithday) {
		this.brithday = brithday;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", brithday=" + brithday + ", sex=" + sex + ", address=" + address
				+ "]";
	}
}

OrdersMapper.java

import java.util.List;

import com.yunxiang.mybatis.pojo.Orders;


public interface OrdersMapper {
	
	List<Orders> testFindOrdersUserResultMap();
}

测试

import java.io.IOException;
import java.io.InputStream;
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 org.junit.Before;
import org.junit.Test;

import com.yunxiang.mybatis.dao.OrdersMapper;
import com.yunxiang.mybatis.dao.UserMapper;
import com.yunxiang.mybatis.pojo.Orders;
import com.yunxiang.mybatis.pojo.User;

public class TestOrdersMapper {

	private SqlSessionFactory factory;
	
	@Before
	public void setUp() throws Exception{
		//mybatis配置文件
		String resource = "SQLMapConfig.xml";
		//得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建会话工厂
		factory = new SqlSessionFactoryBuilder().build(inputStream);		
	}
	
	@Test
	public void testFindOrdersUserResultMap() throws Exception {
		
		//通过工厂得到SQLSession
		SqlSession session = factory.openSession();
		//获取UserMapper对象
		 OrdersMapper ordersMapper = session.getMapper(OrdersMapper.class);
		List<Orders> list = ordersMapper.testFindOrdersUserResultMap();
		System.out.println(list);
		//释放资源
		session.close();
	}
}

一对多映射

OrdersMapper.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">

<!-- namespace命名空间,作用就是对SQL进行
	 	分类化管理,在使用mapper代理时,namespace的值,
	 	必须是对应接口的全路径名。并且接口中的抽象方法、接受参数类型和返回值类型,
	 	必须与xml中的各标签的id值、接受参数类型和返回参数保持一致。并且xml和接口
	 	必须放置同一个包下。

 -->
<mapper namespace="com.yunxiang.mybatis.dao.OrdersMapper">

	<!-- 查询订单及订单明细,使用继承 -->
	<resultMap type="orders" id="ordersAndOrderDetailResultMap">
		<!--订单信息 -->
		<id column="id" property="id"/>
		<result column="user_id" property="user_id"/>
		<result column="number" property="number"/>
		<result column="createTime" property="createTime"/>
		<result column="note" property="note"/>
		
		<!-- 订单明细信息
				一个订单关联了多个的订单明细
			collection:对关联到的多条记录映射到集合属性中
			property:将关联查询到的多条记录映射到Orders中的那个属性
		 	ofType:指定映射到list集合属性中pojo的类型
		 -->
		 <collection property="list" ofType="ordersDetail">
		 	<id column="orderdetail_id" property="id"/>
			<result column="order_id" property="order_id"/>
			<result column="item_id" property="item_id"/>
			<result column="item_unm" property="item_unm"/>
		 </collection>
		
	
	</resultMap>
	
	
	<select id="testFindOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap">
	
		select 
			orders.*,
			orderdetail.id orderdetail_id,
			orderdetail.order_id,
			orderdetail.item_id,
			orderdetail.item_unm
		from 
			orders,
			orderdetail 
		where  orders.id = orderdetail.order_id
		
	</select>	

</mapper>

Orders.java

package com.yunxiang.mybatis.pojo;

import java.util.Date;
import java.util.List;

public class Orders {
	
	private int id;
	private int user_id;
	private int number;
	private Date createTime;
	private String note;
	
	//一对多
	private List<OrdersDetail> list;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	public List<OrdersDetail> getList() {
		return list;
	}
	public void setList(List<OrdersDetail> list) {
		this.list = list;
	}
	@Override
	public String toString() {
		return "Orders [id=" + id + ", user_id=" + user_id + ", number=" + number + ", createTime=" + createTime
				+ ", note=" + note + ",  list=" + list + "]";
	}
}

OrdersDetail.java

public class OrdersDetail {

	private int id;
	private int order_id;
	private int item_id;
	private int item_unm;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public int getItem_id() {
		return item_id;
	}
	public void setItem_id(int item_id) {
		this.item_id = item_id;
	}
	public int getItem_unm() {
		return item_unm;
	}
	public void setItem_unm(int item_unm) {
		this.item_unm = item_unm;
	}
	public int getOrder_id() {
		return order_id;
	}
	public void setOrder_id(int order_id) {
		this.order_id = order_id;
	}

	@Override
	public String toString() {
		return "OrdersDetail [id=" + id + ", order_id=" + order_id + ", item_id=" + item_id + ", item_unm=" + item_unm
				+ "]";
	}
	
}

OrdersMapper.java

import java.util.List;

import com.yunxiang.mybatis.pojo.Orders;

public interface OrdersMapper {

	List<Orders> testFindOrdersAndOrderDetailResultMap();
}

测试

import java.io.IOException;
import java.io.InputStream;
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 org.junit.Before;
import org.junit.Test;

import com.yunxiang.mybatis.dao.OrdersMapper;
import com.yunxiang.mybatis.dao.UserMapper;
import com.yunxiang.mybatis.pojo.Orders;
import com.yunxiang.mybatis.pojo.User;

public class TestOrdersMapper {

	private SqlSessionFactory factory;
	
	@Before
	public void setUp() throws Exception{
		//mybatis配置文件
		String resource = "SQLMapConfig.xml";
		//得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建会话工厂
		factory = new SqlSessionFactoryBuilder().build(inputStream);		
	}
	
	@Test
	public void testFindOrdersUserResultMap() throws Exception {
		
		//通过工厂得到SQLSession
		SqlSession session = factory.openSession();
		//获取UserMapper对象
		 OrdersMapper ordersMapper = session.getMapper(OrdersMapper.class);
		List<Orders> list = ordersMapper.testFindOrdersAndOrderDetailResultMap();
		System.out.println(list);
		//释放资源
		session.close();
	}
}

多对多

思路:在User中定义List集合,再在Orders中定义List集合,再在OrdersDetail中定义Item;这是根据表是设计来实现的方法。
UserMapper.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">

<!-- namespace命名空间,作用就是对SQL进行
	 	分类化管理,在使用mapper代理时,namespace的值,
	 	必须是对应接口的全路径名。并且接口中的抽象方法、接受参数类型和返回值类型,
	 	必须与xml中的各标签的id值、接受参数类型和返回参数保持一致。并且xml和接口
	 	必须放置同一个包下。

 -->
<mapper namespace="com.yunxiang.mybatis.dao.UserMapper">
	
	<!-- 查询用户及购买商品 -->
	<resultMap type="user" id="userAndItemResultMap">
		<!-- 用户信息 -->
		<id column="id" property="id"/>
		<result column="name" property="name"/>
			<result column="sex" property="sex"/>
			<result column="address" property="address"/>
		<!-- 订单信息
			一个用户对应多个订单,使用collection
		 -->
		 <collection property="orderList" ofType="orders">
	 		<id column="id" property="id"/>
			<result column="user_id" property="user_id"/>
			<result column="number" property="number"/>
			<result column="createTime" property="createTime"/>
			<result column="note" property="note"/>
		 	
		 	<!-- 订单明细
		 		一个订单有多个明细
		 	 -->
		 	 <collection property="list" ofType="ordersDetail">
		 	 	<id column="orderdetail_id" property="id"/>
				<result column="order_id" property="order_id"/>
				<result column="item_id" property="item_id"/>
				<result column="item_unm" property="item_unm"/>
		 		<!-- 商品信息 -->
		 		<association property="item" javaType="item">
		 			<id column="item_id" property="id"/>
		 			<result column="item_name" property="name"/>
		 			<result column="item_detail" property="detail"/>
		 			<result column="item_price" property="price"/>
		 		</association>
		 		
		 	 </collection>
		 	
		 </collection>
		 
	</resultMap>

	
	<select id="testFindUserAndItemResultMap" resultMap="userAndItemResultMap">
	
			select 
				orders.*,
				user.name,
				user.sex,
				user.address,
				orderdetail.id orderdetail_id,
				orderdetail.order_id,
				orderdetail.item_id,
				orderdetail.item_unm,
				item.name item_name,
				item.price,
				item.detail
			from 
				orders,
				user,
				orderdetail,
				item 
			where user.id=orders.user_id and orders.id = orderdetail.order_id and item.id = orderdetail.item_id
		
	</select>

</mapper>

User.java

import java.util.Date;
import java.util.List;

public class User {
	
	private int id;
	private String name;
	private Date brithday;
	private String sex;
	private String address;
	
	//用户创建的订单列表
	private List<Orders> orderList;
	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 Date getBrithday() {
		return brithday;
	}
	public void setBrithday(Date brithday) {
		this.brithday = brithday;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	
	public List<Orders> getOrderList() {
		return orderList;
	}
	public void setOrderList(List<Orders> orderList) {
		this.orderList = orderList;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", brithday=" + brithday + ", sex=" + sex + ", address=" + address
				+ ", orderList=" + orderList + "]";
	}
	
	
}

Orders.java

import java.util.Date;
import java.util.List;

public class Orders {
	
	private int id;
	private int user_id;
	private int number;
	private Date createTime;
	private String note;
	//一对多
	private List<OrdersDetail> list;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public List<OrdersDetail> getList() {
		return list;
	}
	public void setList(List<OrdersDetail> list) {
		this.list = list;
	}
	@Override
	public String toString() {
		return "Orders [id=" + id + ", user_id=" + user_id + ", number=" + number + ", createTime=" + createTime
				+ ", note=" + note + ",  list=" + list + "]";
	}

}

OrdersDetail.java

public class OrdersDetail {

	private int id;
	private int order_id;
	private int item_id;
	private int item_unm;
	
	//明细对应的商品信息
	private Item item;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public int getItem_id() {
		return item_id;
	}
	public void setItem_id(int item_id) {
		this.item_id = item_id;
	}
	public int getItem_unm() {
		return item_unm;
	}
	public void setItem_unm(int item_unm) {
		this.item_unm = item_unm;
	}
	public int getOrder_id() {
		return order_id;
	}
	public void setOrder_id(int order_id) {
		this.order_id = order_id;
	}
	public Item getItem() {
		return item;
	}
	public void setItem(Item item) {
		this.item = item;
	}
	@Override
	public String toString() {
		return "OrdersDetail [id=" + id + ", order_id=" + order_id + ", item_id=" + item_id + ", item_unm=" + item_unm + ", item=" + item + "]";
	}

}

Item.java

import java.util.Date;

public class Item {
	
	private int id;
	private String name;
	private float price;
	private String detail;
	private String pic;
	private Date createTime;
	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 float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public String getDetail() {
		return detail;
	}
	public void setDetail(String detail) {
		this.detail = detail;
	}
	public String getPic() {
		return pic;
	}
	public void setPic(String pic) {
		this.pic = pic;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	@Override
	public String toString() {
		return "Item [id=" + id + ", name=" + name + ", price=" + price + ", detail=" + detail + ", pic=" + pic
				+ ", createTime=" + createTime + "]";
	}
}

UserMapper.java

import java.util.List;
import com.yunxiang.mybatis.pojo.User;

public interface UserMapper {

	List<User>testFindUserAndItemResultMap();

}

测试

import java.io.IOException;
import java.io.InputStream;
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 org.junit.Before;
import org.junit.Test;

import com.yunxiang.mybatis.dao.OrdersMapper;
import com.yunxiang.mybatis.dao.UserMapper;
import com.yunxiang.mybatis.pojo.Orders;
import com.yunxiang.mybatis.pojo.User;

public class TestOrdersMapper {

	private SqlSessionFactory factory;
	
	@Before
	public void setUp() throws Exception{
		//mybatis配置文件
		String resource = "SQLMapConfig.xml";
		//得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建会话工厂
		factory = new SqlSessionFactoryBuilder().build(inputStream);		
	}
	
	@Test
	public void testFindUserAndItemResultMap() throws Exception {
		
		//通过工厂得到SQLSession
		SqlSession session = factory.openSession();
		//获取UserMapper对象
		 OrdersMapper ordersMapper = session.getMapper(UserMapper.class);
		List<User> list = ordersMapper.testFindUserAndItemResultMap();
		System.out.println(list);
		//释放资源
		session.close();
	}
	
}

注:在mybatis映射时,如果是一对一的映射,在定义resultMap时,使用"association"子标签和"javaType"属性来定义被关联的pojo对象信息。如果是一对多的映射,在定义resultMap时,使用"collection"子标签和"ofType"属性来定义被关联的pojo对象信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值