827下午 maybatis的多表查询操作(完整源码可看) || 自动映射功能 || 把插入的最新信息的主键取出来

一:在orders表的基础上查询两个表的信息

1.两个表orders表和user表(orders的uid外键为user 表的id)

2.常见错误,

如果没有在orders实体类上定义一个user变量,那么会报错

因为我们是多表查询,查询的结果不单单有orders的内容,还有user的内容,因此应该在orders实体类上加上如下代码

3.完整源码(请忽略为什么用order不用orders命名,因为我后面改了..)

ordermapper.java

ordermapper.xml

order.java 实体类

package com.bean;

public class Order {
	private int id;
	private String orderNum;
	private String orderName;
	private String orderDate;
	private User user;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getOrderNum() {
		return orderNum;
	}
	public void setOrderNum(String orderNum) {
		this.orderNum = orderNum;
	}
	public String getOrderName() {
		return orderName;
	}
	public void setOrderName(String orderName) {
		this.orderName = orderName;
	}
	public String getOrderDate() {
		return orderDate;
	}
	public void setOrderDate(String orderDate) {
		this.orderDate = orderDate;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	@Override
	public String toString() {
		return "Order [id=" + id + ", orderNum=" + orderNum + ", orderName=" + orderName + ", orderDate=" + orderDate
				+",userName="+user.getUserName()+ ",password="+user.getPassword()+",gender="+user.getGender()+"]";
	}
	

	
	
}

 

OrderTest测试类:

package com.test;

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.bean.Order;
import com.mapper.OrderMapper;

public class OrderTest {

	SqlSessionFactory factory;
	@Before
	public void init() throws IOException {
		InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
		factory = new SqlSessionFactoryBuilder().build(is);
	}
	
	@Test
	public void testGetOrders() {
		SqlSession session = factory.openSession();
		try {
			OrderMapper mapper = session.getMapper(OrderMapper.class);
			List<Order> orders = mapper.getOrders();
			for (Order order : orders) {
				System.out.println(order);
			}
		} finally {
			session.close();
		}
	}

}

4.运行结果:

 

二:在users表的基础上查询两个表的信息(跟上面的类似)

1.user.java实体类

package com.bean;

import java.util.List;

import org.apache.ibatis.type.Alias;

@Alias(value="user")
public class User {
	private int id;
	private String userName;
	private String password;
	private int gender;
	private Order order;
	/*private List<Order> orders;
	public void setOrders(List<Order> orders) {
		this.orders = orders;
	}
	public List<Order> getOrders() {
		return orders;
	}*/
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}
	
	public Order getOrder() {
		return order;
	}
	public void setOrder(Order order) {
		this.order = order;
	}

	@Override
	public String toString() {
		return "User表信息为:" + " userName=" + userName +
				"\n"+"Orders表信息为"+"ordernum:" + order.getOrderNum()+", ordername:"+order.getOrderName()+",订单时间 "+order.getOrderDate();
	}
	
		
}

2.usermapper.java

3.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">
<mapper namespace="com.mapper.UserMapper">
	<resultMap type="com.bean.User" id="BaseResultMap">
		<!-- id表主键
			column:列名
			property:对应实体类的属性名
		 -->
		 <id column="id" property="id"/>
			<result column="user_name" property="userName"></result>
			<result column="password" property="password"></result>
			<result column="gender" property="gender"></result>
		
		<association property="order" javaType="com.bean.Order">
		<id column="id" property="id"/>
		<result column="o_num" property="orderNum"></result>
		<result column="o_name" property="orderName"></result>
		<result column="o_date" property="orderDate"></result>	
		</association>
	</resultMap>
	
	<select id="getUserById"  resultMap="BaseResultMap">
		<!-- select u.user_name,o.o_num,o.o_name,o.o_date from user u inner join
		order o on u.id=o.uid where id=#{id} -->
		SELECT u.`user_name`,o.`o_num`,o.`o_name` ,o.`o_date`FROM USER u INNER JOIN orders o ON u.id=o.uid WHERE u.id=#{id}
	</select>
	
</mapper>

4.UserTest.java

5.运行结果:

 

三:难点

     个人认为难点在于实体类里,要考虑到时多表查询,因此结果集可能存在一个或多个,这时候不能单纯的用User user这样,

需要用到列表来接收(重点写在mapper.java 那里返回结果是列表,以及实体类需要另一个查询对象的属性)

还有 

    在mapper.xml里

写sql语句还有如图(内嵌字段)

 

 

四:自动映射功能

none:禁用填充功能

partial(局部的): 只自动填充不带内嵌的属性

full:自动填充所有的属性,包括内嵌

 

 

 

把插入的最新信息的主键取出来 ,下单的时候同时更新很多个表的时候可以用到

 

 

 

 

传入一个map(自行了解)

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一身正气z

打赏随心就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值