MyBatis 之 使用四(三) (mapper.xml)

  1. 一对多套一对多

    Items类:

public class Items {
	private int itemId;
	private String itemName;
	private Float itemPrice;
	private String itemDetail;
	public int getItemId() {
		return itemId;
	}
	public void setItemId(int itemId) {
		this.itemId = itemId;
	}
	public String getItemName() {
		return itemName;
	}
	public void setItemName(String itemName) {
		this.itemName = itemName;
	}
	public Float getItemPrice() {
		return itemPrice;
	}
	public void setItemPrice(Float itemPrice) {
		this.itemPrice = itemPrice;
	}
	public String getItemDetail() {
		return itemDetail;
	}
	public void setItemDetail(String itemDetail) {
		this.itemDetail = itemDetail;
	}
	@Override
	public String toString() {
		return "Items [itemId=" + itemId + ", itemName=" + itemName
				+ ", itemPrice=" + itemPrice + ", itemDetail=" + itemDetail
				+ "]";
	}
}
<!-- 一对多套一对多:用户以及用户的订单和订单明细信息 -->
<resultMap type="user" id="orderDetailInOrderInUserMap">
  <!-- 查询结果集的主键 -->
  <id property="userId" column="userId"/>
  <result property="username" column="username"/>
  <result property="sex" column="sex"/>
  <result property="birthday" column="birthday"/>
  
  <collection property="orders" ofType="mybatis_b.model.Order">
  <!-- 一对多的时候,id 不能缺省 -->
      <id property="orderId" column="orderId"/>
      <result property="orderNumber" column="orderNumber"/>
      <!-- collect中再嵌套 collect -->
      <collection property="orderDetails" ofType="mybatis_b.model.OrderDetail">
          <id property="orderDetailId" column="orderDetailId"/>
  	  <result property="order_id" column="order_id"/>
          <result property="item_id" column="item_id"/>
  	  <result property="item_number" column="item_number"/>
          <result property="item_price" column="item_price"/>
      </collection>
  	  
  </collection>
</resultMap>
  
<!-- 一对多套一对多:用户以及用户的订单和订单明细信息 -->
<select id="findUserAndOrdersAndDetails" resultMap="orderDetailInOrderInUserMap">
  select users.userid, users.username, users.birthday, users.sex, orders.orderid, 
  orders.ordernumber, orderdetail.* from users, orders, orderdetail 
  where users.userid = orders.user_id and orders.orderid = orderdetail.order_id
</select>

java代码调用:

//一对多套一对多:用户以及用户的订单和订单明细信息
@Test
public void testFindUserAndOrdersAndDetails() throws Exception {
	//获取SqlSession
	SqlSession sqlSession = sqlSessionFactory.openSession();
	//指定 mapper 接口的类型,MyBatis通过动态代理的方式实现mapper接口
	OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

	List<User> list = orderMapper.findUserAndOrdersAndDetails();

	System.out.println(list.size());
	Iterator<User> iterator = list.iterator();
	while (iterator.hasNext()) {
		User order = (User) iterator.next();
		System.out.println(order);
	}
}

执行结果:

  1. 多对多(manyToMany)
<!-- 多对多:查询用户,用户下的订单和订单明细以及商品信息 -->
  <resultMap type="user" id="itemInOrderDetailInOrderInUserMap">
  	<!-- 查询结果集的主键 -->
  	<id property="userId" column="userId"/>
  	<result property="username" column="username"/>
  	<result property="sex" column="sex"/>
  	<result property="birthday" column="birthday"/>
  
  	<collection property="orders" ofType="mybatis_b.model.Order">
  	  <!-- 一对多的时候,id 不能缺省 -->
  	  <id property="orderId" column="orderId"/>
  	  <result property="orderNumber" column="orderNumber"/>
  	  
  	  <collection property="orderDetails" ofType="mybatis_b.model.OrderDetail">
  	  	<id property="orderDetailId" column="orderDetailId"/>
  	  	<result property="order_id" column="order_id"/>
  		<result property="item_id" column="item_id"/>
  		<result property="item_number" column="item_number"/>
  		<result property="item_price" column="item_price"/>
  		<association property="item" javaType="mybatis_b.model.Items">
  		  <id property="itemId" column="itemId"/>
  		  <result property="itemName" column="itemName"/>
  		  <result property="itemPrice" column="itemPrice"/>
  		  <result property="itemDetail" column="itemDetail"/>
  		</association>
  	  </collection>
  	</collection>
  </resultMap>
  <!-- 多对多:查询用户,用户下的订单和订单明细以及商品信息 -->
<select id="findUserAndOrdersDetailsAndItems" resultMap="itemInOrderDetailInOrderInUserMap">
  select users.userid, users.username, users.birthday, users.sex, orders.orderid, 
  orders.ordernumber, orderdetail.*, items.itemname, items.itemprice, items.itemdetail 
  from users, orders, orderdetail, items where users.userid = orders.user_id
  and orders.orderid = orderdetail.order_id and items.itemid = orderdetail.item_id
</select>

java代码调用同上,只需修改:

List<User> list = orderMapper.findUserAndOrdersDetailsAndItems();

执行结果:

时间: 2024-08-01 17:28:18

MyBatis 之 使用四(三) (mapper.xml)的相关文章

mybatis自动生成dao, model, mapper xml文件

用mybatis的时候,手写xml或model文件是一个力气活,所以可以用mybatis-gennerator插件自动生成mybatis所需要的dao.bean.mapper xml文件 (原文地址:http://blog.csdn.net/tolcf/article/details/50835165) 附件下载地址:http://files.cnblogs.com/files/cc-robot/generator.rar 把附件解压到本地,我放在d:\web\java目录下了 只需要修改下面x

spring mybatis 整合问题Error parsing Mapper XML. Cause: java.lang.NullPointerException

14:30:40,872 DEBUG SqlSessionFactoryBean:431 - Parsed configuration file: 'class path resource [mybatis/mybatis-config.xml]'14:30:40,883  WARN XmlWebApplicationContext:489 - Exception encountered during context initialization - cancelling refresh att

mybatis如何通过接口查找对应的mapper.xml及方法执行详解

转:http://www.jb51.net/article/116402.htm 本文主要介绍的是关于mybatis通过接口查找对应mapper.xml及方法执行的相关内容,下面话不多说,来看看详细的介绍: 在使用mybatis的时候,有一种方式是 ? 1 BookMapper bookMapper = SqlSession().getMapper(BookMapper.class) 获取接口,然后调用接口的方法.只要方法名和对应的mapper.xml中的id名字相同,就可以执行sql. 那么接

MyBatis 之 使用四(二) (mapper.xml)

执行查询操作的时候,通常返回的结果集会出现一下几种情况: 1. 一对一查询:返回的结果集的唯一主键是非重复的.(下面会标出唯一主键,和 oracle 的主键有区别) 查询订单以及订单的用户信息,两种接收结果集的方式: 1)使用 pojo 对象去接收结果集(唯一主键:) public class OrderCustom extends User { private int orderId; //订单id private int user_id; //用户id private String orde

MyBatis 之 使用四(一) (mapper.xml)

mapper.xml 映射文件是 MyBatis 的核心,定义了操作数据库的 sql,每个sql 是一个statement. parameterType(输入类型),输入类型包括:基本类型.pojo对象类型.hashmap. a. #{} 与 ${} #{} 是向 prepareStatement 中的预处理语句中设置参数值,表示一个占位符,相当于 ? .使用占位符 #{} 可以有效防止sql 注入,在使用时不需要关心参数值的类型,mybatis 会根据参数值的类型调用不同的statement

Mybatis传多个参数(三种解决方案) mapper.xml的sql语句修改!

第一种 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_area=#{1} </select> 其中,#{0}代表接收的是dao层中的第一个参数,#{

mybatis入门基础(三)----SqlMapConfig.xml全局配置文件解析

阅读目录 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 二:properties属性 三:settings全局参数配置 四:typeAiases(别名)--重点掌握 五:typeHandlers(类型处理器) 六:mappers(映射配置) 回到顶部 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器) objectFactor

Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务器所提供的SQL语句的巨大威力.与此同时,MyBaits消除了书写大量冗余代码的痛苦,它使使用SQL更容易. 在代码里直接嵌套SQL语句是很差的编码实践,并且维护起来困难.MyBaits使用了映射器配置文件或注解来配置SQL语句.在本章中,我们会看到具体怎样使用映射器配置文件来配置映射SQL语句.

利用mybatis generator插件反向生成Dao、Mapper.xml、pojo(通过maven)

直接进入主题,由于项目选择的利用maven构建,所以选择了利用maven的生成方式.(还有一种可自行百度) 一.在pom.xml中添加插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configur

【MyBatis】Mapper XML 文件

Mapper XML文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码.MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好. SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序): cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的引用. resultMap – 是最复杂