Mybatis 使用 mapper 接口规范的 一对一, 一对多,多对多映射
首先的 是 最原始的 pojo 类来 做简单映射
简单 pojo 映射:
<mapper namespace="com.ghc.dao.UserDao">
    <select id="findUserById" parameterType="int" resultType="user">
        SELECT * FROM user WHERE id = #{id}
    </select>
简单 pojo 映射文件的配置
以下都是对于原始基本的 pojo 类 进行包装扩展后来实现 其他列的映射
一对一:
<resultMap id="findUserOrderMapper" type="com.ghc.pojo.UserOrderWrapperFirst"> <!--因为继承自Order类,所以这些都可以看做是Order这个对象的基本属性-->
<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: 用于映射关联查询单个对象的信息-->
<!---->
<association property="user" javaType="com.ghc.pojo.User"> <!--此处本可以写成user 但是为了突出就不用别名了 下面都是封装 wrapper 包装类的user对象到一个User的bean中-->
<id column="user_id" property="id"/> <!--唯一标识用户的列就是主外键列 user_id 是 Order 的基本属性-->
<result column="username" property="userName"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap> <select id="findUserOrder" resultMap="findUserOrderMapper">
select o.*,u.* from user u join orders o on u.id = o.user_id
</select>
OneToOne
一对多:
<resultMap id="findOneToManyMap" type="com.ghc.pojo.UserOrderWrapper">
<id property="id" column="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="user" javaType="user">
<id column="user_id" property="id"/>
<result column="username" property="userName"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association> <collection property="orderDetails" ofType="com.ghc.pojo.OrderDetail">
<id column="odtid" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<result column="orders_id" property="ordersId"/>
</collection>
</resultMap> <select id="findOneToMany" resultMap="findOneToManyMap">
select o.*,
u.username,
u.sex,
u.address,
odt.id as odtid,
odt.items_id,
odt.items_num,
odt.orders_id
from user u join orders o on u.id = o.user_id
join orderdetail odt on o.id = odt.orders_id
</select>
OneToMany映射文件的配置
多对多:
关键还是在于 mapper.xml 文件的书写
<resultMap id="findManyToManyMap" type="user">
<!--主表 user 表-->
<id column="user_id" property="id"/>
<result column="username" property="userName"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<!--从表 order 表映射到 orderList-->
<collection property="orderList" ofType="com.ghc.pojo.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"/> <!--从表 orderDetail 表映射到 orderDetailList-->
<collection property="orderDetailList" ofType="com.ghc.pojo.OrderDetail">
<id column="odtid" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<result column="orders_id" property="ordersId"/>
<!-- 而 orderDetail 这张表的 itemid 外键只对应 items 表中一条数据,所以此处用association-->
<association property="item" javaType="com.ghc.pojo.Items">
<id column="item_id" property="id"/>
<result column="name" property="name"/>
<result column="price" property="price"/>
<result column="detail" property="detail"/>
<result column="pic" property="pic"/>
<result column="createtime" property="createtime"/>
</association>
</collection>
</collection>
</resultMap> <select id="findManyToMany" resultMap="findManyToManyMap">
select o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.sex,
u.address,
odt.id as odtid,
odt.items_id,
odt.items_num,
odt.orders_id,
i.id as item_id,
i.name,
i.price,
i.detail,
i.pic,
i.createtime
from user u join
orders o on u.id = o.user_id
join orderdetail odt on o.id = odt.orders_id
join items i on odt.items_id = i.id
</select>
ManyToMany映射文件的配置
上面配置文件都写完后,就可以进行 mapper 接口 mapper.java 的编写了
顺便贴上 相应的 pojo (User 里 包含一个 List<Orders> 然后 Orders 里又包含一个 List<OrderDetail> 最后 OrderDetail 里包含一个 Item ) 修改后的样子:
也就是 数据库的 主从表之间的外键关系,
User ------> Order (1:n)
Order -----> OrderDetail (1:n)
OrderDetail ----> Item (1:1)
下面开始 贴 多对多的 pojo 部分的 代码了 (我觉得 多对多都会了 其他的都不在话下,所以其他的没必要贴了):
package com.ghc.pojo; import java.util.Date;
import java.util.List; public class User {
private int id;
private String userName;
private Date birthday;
private String sex;
private String address;
// 一个人有多个订单
private List<Orders> orderList;
public List<Orders> getOrderList() {
return orderList;
} public void setOrderList(List<Orders> orderList) {
this.orderList = orderList;
} 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 Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} 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;
}
}
com.ghc.pojo.User
package com.ghc.pojo; import java.util.Date;
import java.util.List; public class Orders {
private int id;
private int user_id;
private String number;
private Date createtime;
private String note; public List<OrderDetail> getOrderDetailList() {
return orderDetailList;
} public void setOrderDetailList(List<OrderDetail> orderDetailList) {
this.orderDetailList = orderDetailList;
} // 一个订单可以有多个订单明细
private List<OrderDetail> orderDetailList; 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 String getNumber() {
return number;
} public void setNumber(String 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;
}
}
com.ghc.pojo.Orders
package com.ghc.pojo;
public class OrderDetail {
    private int id;
    private int ordersId;
    private int itemsId;
    private int itemsNum;
    //而一个订单明细对应一条项目
    private  Items item;
    public Items getItem() {
        return item;
    }
    public void setItem(Items item) {
        this.item = item;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getOrdersId() {
        return ordersId;
    }
    public void setOrdersId(int ordersId) {
        this.ordersId = ordersId;
    }
    public int getItemsId() {
        return itemsId;
    }
    public void setItemsId(int itemsId) {
        this.itemsId = itemsId;
    }
    public int getItemsNum() {
        return itemsNum;
    }
    public void setItemsNum(int itemsNum) {
        this.itemsNum = itemsNum;
    }
}
com.ghc.pojo.OrderDetail
package com.ghc.pojo;
import java.util.Date;
public class Items {
    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;
    }
}
com.ghc.pojo.Items
package com.ghc.dao; import com.ghc.pojo.User;
import com.ghc.pojo.UserOrderWrapper;
import com.ghc.pojo.UserOrderWrapperFirst; import java.util.List; public interface UserDao {
User findUserById(int id) throws Exception;
List<UserOrderWrapperFirst> findUserOrder() throws Exception;
List<UserOrderWrapper> findOneToMany() throws Exception;
List<User> findManyToMany() throws Exception;
}
UserDao
如果经常要打印输出,建议在 pojo 中 覆写 toString,不然就要跟下面这么苦逼的 拼 String 打印了
import com.ghc.dao.UserDao; import com.ghc.pojo.*;
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 java.io.IOException;
import java.util.List; public class UserDaoTest {
private SqlSessionFactory sqlSessionFactory; @Before
public void injectSqlSessionFactory() throws IOException {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("config/SqlMappingConfig.xml"));
} @Test
public void testFindUserById() throws Exception {
UserDao userDao = sqlSessionFactory.openSession().getMapper(UserDao.class);
User user = userDao.findUserById(1);
System.out.println(user.getUserName()); List<UserOrderWrapperFirst> userOrderWrapperFirstList = userDao.findUserOrder();
for (UserOrderWrapperFirst userOrder : userOrderWrapperFirstList) {
String userName = userOrder.getUser().getUserName();
int orderId = userOrder.getId();
System.out.println(userName + " <-----> " + String.valueOf(orderId)); }
} @Test
public void testFindOneToMany() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<UserOrderWrapper> userOrderWrappers = userDao.findOneToMany();
for (int i = 0; i < userOrderWrappers.size(); i++) {
UserOrderWrapper uow = userOrderWrappers.get(i);
List<OrderDetail> orderDetails = uow.getOrderDetails();
User user = uow.getUser();
for (int j = 0; j < orderDetails.size(); j++) {
System.out.print(uow.getId() + "--" + uow.getUser_id() + "--" + uow.getNumber() + "--" + uow.getCreatetime() + "--" + uow.getNote() + "--");
System.out.print(user.getUserName() + "--" + user.getSex() + "--" + user.getAddress() + "--");
OrderDetail odt = orderDetails.get(j);
System.out.println(odt.getId() + "--" + odt.getItemsId() + "--" + odt.getItemsNum() + "--" + odt.getOrdersId());
}
}
} @Test
public void testFindManyToMany() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.findManyToMany();
for (User user : userList) {
List<Orders> orderList = user.getOrderList();
for (Orders order : orderList) {
List<OrderDetail> orderDetailList = order.getOrderDetailList();
for (OrderDetail orderDetail : orderDetailList) {
Items item = orderDetail.getItem();
System.out.println(order.getId() + "--" + order.getUser_id() + "--" + order.getNumber() + "--" + order.getCreatetime() +
"--" + order.getNote() +"--" + user.getUserName() + "--" + user.getSex() + "--" +
user.getAddress() + "--" + orderDetail.getId() + "--" + orderDetail.getItemsId() + "--" + orderDetail.getItemsNum() + "--" +
orderDetail.getOrdersId() + "--" + item.getId() + "--" + item.getName() + "--" + item.getName() + "--" + item.getPrice() + "--" +
item.getDetail() + "--" + item.getPic() + "--" + item.getCreatetime());
}
}
}
}
}
Junit 测试Mapper 接口方法
测试结果 与数据库基本一致 :


至此, mybatis 的 所谓高级部分全部完成(动态 sql 部分另开一篇去说好了),实际项目开发的时候,单表是采用 generator 逆向工程生成 pojo,mapper.xml , mapper.java 的
但是也需要配置数据库连接,表信息等等。。。到一个 generatorconfig.xml 这样类似的 一个 配置文件里,然后调用生成工具的代码进行生成。
但是懂了原理,任他怎么来都容易理解了。
Mybatis 使用 mapper 接口规范的 一对一, 一对多,多对多映射的更多相关文章
- mybatis  一对一  一对多  多对多
		
一对一 一对多 多对多
 - JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
		
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
 - Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
		
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景:      由于如果只使用一张表存储所有的数据,就会操作数 ...
 - MyBatis的关联关系  一对一  一对多  多对多
		
一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...
 - mybatis入门_一对多,多对多映射以及整合spring框架
		
一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...
 - 使用NHibernate(7)-- 一对一 && 一对多 && 多对多
		
1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...
 - day 69-70 一对一 一对多 多对一联表查询
		
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
 - JPA 一对一 一对多 多对一 多对多配置
		
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
 - Mybatis学习第四天——一对一&&一对多
		
两表关系: 1.Mybatis中一对一关系 <!-- 两表联查,通过相同属性user_id left join 表示以左边的表为主表 --> <select id="fin ...
 
随机推荐
- JQ_插件开发
			
在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. ...
 - Python3 str去除空格
			
一.去除str两端空格(strip()) a.去除左端空格 lstrip() str0='abcdef' str1=' abcdef' print(str0) print(str1.lstrip() ...
 - cocos2dx渲染架构
			
2dx的时代UI树便利和渲染是没有分开的,遍历UI树的时候就渲染.3dx版本为了分离了ui树的遍历和渲染,先遍历生成渲染命令发到渲染队列,之后遍历渲染命令队列开始渲染.这样做的好处是渲染命令可以重用, ...
 - 1065 A+B and C
			
同样是一题会产生溢出的题,不同的是这个用大数类很麻烦,因为有负数的可能性 不妨利用溢出的特性来解题:两个整数和为负数 或者 两个负数和为正数,那么就溢出了. #include<bits/stdc ...
 - 了不起的Node.js--之五 TCP连接
			
TCP连接 传输控制协议(TCP)是一个面向连接的协议,它保证了两台计算机之间数据传输的可靠性和顺序. TCP是一种传输层协议,它可以让你将数据从一台计算机完整有序地传输到另一台计算机. Node.j ...
 - 审评(HelloWorld团队)
			
炸弹人:我觉得炸弹人的构想很不错,很像以前玩的qq堂,不过上课时讲的不够深入,我没有找到项目的思路,项目的介绍也很粗糙,后面说的目标很大,希望你可以实现,我觉得越多的功能,就意味着越多的工作量,总的来 ...
 - 云平台项目--学习经验--jsrender前端渲染模板
			
jsrender的好处:可以预先自定义一些固定的html标签,在需要显示数据的时候,可以直接传入真实的数据并显示在web页面中,避免了Js编写中的复杂过程:针对高性能和纯字符串渲染并优化,不需要依赖D ...
 - File类操作文件
			
简单示例: public static void main(String[] args) { // 列出系统所有的根路径 File[] listRoots = File.listRoots(); fo ...
 - 助教日志—请沈航13级同学将GIT地址和CNBLOG地址发到这篇博文的评论中
			
一.评论形式: 学号 姓名 博客地址 GIT地址 如 2011102456 郑蕊 http://www.cnblogs.com/zhengrui0452/ http://121.42.14.1/Rui ...
 - PAT 甲级 1087 All Roads Lead to Rome
			
https://pintia.cn/problem-sets/994805342720868352/problems/994805379664297984 Indeed there are many ...