(五)Mybatis总结之一对多、一对一
一对多
业务场景:张三既是java开发师又是大学老师又是LOL代练,张三拥有多个角色。
1.创建实体类UserInfo和RoleInfo
package com.qf.mybatisdemo.pojo;
import java.util.List;
public class UserInfo {
int userId;
String password;
String email;
String phone;
String icon;
String userName;
String name;
List<RoleInfo> roleInfoList;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<RoleInfo> getRoleInfoList() {
return roleInfoList;
}
public void setRoleInfoList(List<RoleInfo> roleInfoList) {
this.roleInfoList = roleInfoList;
}
@Override
public String toString() {
return "UserInfo{" +
"userId=" + userId +
", password='" + password + '\'' +
", email='" + email + '\'' +
", phone='" + phone + '\'' +
", icon='" + icon + '\'' +
", userName='" + userName + '\'' +
", name='" + name + '\'' +
", roleInfoList=" + roleInfoList +
'}';
}
}
package com.qf.mybatisdemo.pojo;
import java.util.List;
public class RoleInfo {
int roleId;
String roleName;
String shortName;
List<MenuInfo> menuInfos;
public int getRoleId() {
return roleId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public List<MenuInfo> getMenuInfos() {
return menuInfos;
}
public void setMenuInfos(List<MenuInfo> menuInfos) {
this.menuInfos = menuInfos;
}
@Override
public String toString() {
return "RoleInfo{" +
"roleId=" + roleId +
", roleName='" + roleName + '\'' +
", shortName='" + shortName + '\'' +
", menuInfos=" + menuInfos +
'}';
}
}
2.UserInfoMapper接口
package com.qf.mybatisdemo.mapper;
import com.qf.mybatisdemo.pojo.UserInfo;
import com.qf.mybatisdemo.userVo.UserVo;
import java.util.List;
public interface UserInfoMapper {
<!--public UserVo userInfoLogin(UserVo userVo);-->
<!--public int addUserInfo(UserVo userVo);-->
<!--public int updateUserInfobyId(UserVo userVo);-->
<!--public int deleteUserInfo(UserVo userVo);-->
public UserInfo getUserInfoById(UserInfo userInfo);
}
3.创建UserInfoMapper.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.qf.mybatisdemo.mapper.UserInfoMapper">
<!--column是数据表字段名,可以为同一表的任一字段,而property须为type 定义的pojo属性-->
<!--resultMap的id,是识别此resultMap集合与其他resultMap的唯一的标识-->
<resultMap id="UserInfoMap" type="com.qf.mybatisdemo.pojo.UserInfo">
<id column="userid" property="userId"></id>
<!--此id为表的主键字段-->
<result column="password" property="password"></result>
<result column="email" property="email"></result>
<result column="icon" property="icon"></result>
<result column="username" property="userName"></result>
<result column="name" property="name"></result>
<result column="phone" property="phone"></result>
<!-- 集合中的property须为oftype定义的pojo对象的属性-->
<collection property="roleInfoList" ofType="com.qf.mybatisdemo.pojo.RoleInfo">
<id column="roleid" property="roleId"></id>
<result column="rolename" property="roleName"></result>
<result column="shortname" property="shortName"></result>
</collection>
<!--可以有多个collection,也可以在collection里面再嵌套collection-->
</resultMap>
<select id="getUserInfoById" parameterType="com.qf.mybatisdemo.pojo.UserInfo" resultMap="UserInfoMap">
<!--此处返回值是UserInfoMap对象-->
SELECT u.*,r.* from userinfo u,user_role ur,roleinfo r
where u.USERID = ur.USERID and r.ROLEID = ur.ROLEID and
u.userid = #{userId}
</select>
</mapper>
标签中的column:要传递给select查询语句的参数,如果传递多个参数,格式为
column= ” {参数名1=表字段1,参数名2=表字段2}
4.创建UserInfoMapper.xml
package com.qf.mybatisdemo;
import com.qf.mybatisdemo.dao.BaseDao;
import com.qf.mybatisdemo.mapper.RoleInfoMapper;
import com.qf.mybatisdemo.mapper.UserInfoMapper;
import com.qf.mybatisdemo.pojo.UserInfo;
import com.qf.mybatisdemo.userVo.UserVo;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.qf.mybatisdemo.pojo.RoleInfo;
import java.util.List;
public class MybatisDemo2 {
BaseDao baseDao = new BaseDao();
SqlSession sqlSession = baseDao.getSqlSession();
UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);
@Test
public void getUserInfoById() {
UserInfo userInfo = new UserInfo();
userInfo.setUserId(1);
UserInfo userInfos = userInfoMapper.getUserInfoById(userInfo);
System.out.println(userInfos);
}
}
记得在mybatis-config.xml添加映射
- resultMap的作用:
- 当数据表的字段名与实体类的属性名不同时,可以采用resultMap建立对应关系
- 有关系(1对多,1对1关系)建立
一对一
业务场景:比如一张订单只能有一位顾客,而不能有多位顾客
1.创建OrderInfo和Consumer实体类
public class Consumer {
int id;
int age;
String path;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "ConsumerInfo{" +
"id=" + id +
", age=" + age +
", path='" + path + '\'' +
", name='" + name + '\'' +
'}';
}
}
public class OrderInfo {
int id;
Date createTime;
BigDecimal totalPrice;
ConsumerInfo consumerInfo;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public BigDecimal getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(BigDecimal totalPrice) {
this.totalPrice = totalPrice;
}
public ConsumerInfo getConsumerInfo() {
return consumerInfo;
}
public void setConsumerInfo(ConsumerInfo consumerInfo) {
this.consumerInfo = consumerInfo;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "OrderInfo{" +
"id=" + id +
", createTime=" + createTime +
", totalPrice=" + totalPrice +
", consumerInfo=" + consumerInfo +
'}';
}
}
2.创建OrderInfoMapper接口
package com.qf.mybatisdemo.mapper;
import com.qf.mybatisdemo.pojo.OrderInfo;
import java.util.List;
public interface OrderInfoMapper {
public List<OrderInfo> listAllOrders();
}
3.创建OrderInfoMapper.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.qf.mybatisdemo.mapper.OrderInfoMapper">
<resultMap id="orderMap" type="com.qf.mybatisdemo.pojo.OrderInfo">
<id column="id" property="id"></id>
<result column="createTime" property="createTime"></result>
<result column="totalPrice" property="totalPrice"></result>
<association property="consumerInfo" javaType="com.qf.mybatisdemo.pojo.Consumer">
<!--注意,javaType是指一对一的属性类型,而ofType是指映射到List中的pojo类型,所以一对一用javaType,一对多用ofType-->
<id column="cid" property="id"></id>
<result column="name" property="name"></result>
<result column="age" property="age"></result>
<result column="path" property="path"></result>
<!--对象用association-->
</association>
</resultMap>
<select id="listAllOrders" resultMap="orderMap">
SELECT o.*,c.id cid,c.age,c.`name`,c.path from consumerinfo c,orderinfo o where c.id = o.cid
</select>
</mapper>
4.Test
public class TestAllOrders {
BaseDao baseDao = new BaseDao();
SqlSession sqlSession = baseDao.getSqlSession();
<!--UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);-->
ConsumerInfoMapper consumerInfoMapper = sqlSession.getMapper(ConsumerInfoMapper.class);
OrderInfoMapper orderInfoMapper = sqlSession.getMapper(OrderInfoMapper.class);
@Test
public void listAllOrders(){
List<OrderInfo> orderInfos = orderInfoMapper.listAllOrders();
System.out.println(orderInfos);
}
}
...
(五)Mybatis总结之一对多、一对一的更多相关文章
- Mybatis注解开发多表一对一,一对多
Mybatis注解开发多表一对一,一对多 一对一 示例:帐户和用户的对应关系为,多个帐户对应一个用户,在实际开发中,查询一个帐户并同时查询该账户所属的用户信息,即立即加载且在mybatis中表现为一对 ...
- SpringBoot使用Mybatis注解进行一对多和多对多查询(2)
SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...
- Mybatis多表查询之一对一查询的多种实现-XML配置
Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素 ...
- MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中实现查 ...
- Springboot整合Mybatis实现级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- Spring Boot整合Mybatis完成级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- Mybatis表关联一对多、多对一、多对多
项目工程结构如下: 1. 搭建MyBatis框架环境 首先需要引入两个包:mybatis.jar 和 sqljdbc42.jar包 若分页需要导入两个包:pagehelper-5.1.0.jar 和 ...
- MyBatis入门(二)---一对一,一对多
一.创建数据库表 1.1.创建数据表同时插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybati ...
- Mybatis(四) 高级映射,一对一,一对多,多对多映射
天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...
- 【mybatis深度历险系列】mybatis中的高级映射一对一、一对多、多对多
学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...
随机推荐
- Ubuntu16.04 下python2 | python3
在终端分别输入python,python2,python3 python和python2默认都是python2 python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 s ...
- [他山之石]Google's Project Oxygen Pumps Fresh Air Into Management
The Project Oxygen team spent one year data-mining performance appraisals, employee surveys, nominat ...
- 导入项目 R.java没有
网上一搜,各种 Android tools-fix your porject或者Clean ...不好使 其实可能是由于XML布局文件有错误导致,修改掉这些错误就可以了..
- PyTorch 60 分钟入门教程
PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程 http://pytorchchina.com/2018/06/25/what-is-pytorch/ PyTorch 6 ...
- diy数据库(二)--网络通信类
一.首先,我们先实现OSS层的ossSocket类.供数据库client和数据库引擎进行通信 友情提示:相应上面的类图的头文件和源码附在了本文的最以下. int _fd ;//socket的文件描写叙 ...
- Android Studio集成Genymotion 及Genymotion 配置ADB
1.打开 Android Studio,依次[File]-[Settings],快捷键 Ctrl + Alt + S 2.在打开的 settings 界面里找到 plugins 设置项,点击右侧的“ ...
- POJ1417 True Liars —— 并查集 + DP
题目链接:http://poj.org/problem?id=1417 True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- 一.OC基础之:1,OC语言的前世今生 ,2,OC语言入门,3,OC语言与C的差异,4,面向对象,5,类和对象的抽象关系,6,类的代码创建,7,类的成员组成及访问
1,OC语言的前世今生 , 一, 在20世纪80年代早期,布莱德.麦克(Brad Cox)设计了OC语言,它在C语言的基础上增加了一层,这意味着对C进行了扩展,从而创造出一门新的程序设计语言,支持对象 ...
- 并不对劲的bzoj4012:loj2116:p3241: [HNOI2015]开店
题目大意 有一棵\(n\)(\(n\leq1.5*10^5\))个节点的二叉树,有点权\(x\),边权\(w\),\(q\)(\(q\leq2*10^5\))组询问,每组询问给出\(u,l,r\),求 ...
- Java 学习路线建议
在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可, ...