(五)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中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...
随机推荐
- windows下使用mingw和msys编译GOTOBLAS和OpenBLAS
在windows下利用msys编译openBLAS若遇到错误提示: gcc: CreateProcess : No such file or directory 问题原因参考:http://www.c ...
- [他山之石]Google's Project Oxygen Pumps Fresh Air Into Management
The Project Oxygen team spent one year data-mining performance appraisals, employee surveys, nominat ...
- VS类添加头文件注释
VS2015参考: http://blog.csdn.net/qq395537505/article/details/50853546 修改两个文件,详细信息 VS2010: 找到VS的安装目录 E ...
- CodeChef - CHEFPRAD Chef and Pairs 树形DP
题意 给你一棵由 N 个节点构成的树 T.节点按照 1 到 N 编号,每个节点要么是白色,要么是黑色.有 Q 组询问,每组询问形如 (s, b).你需要检查是否存在一个连通子图,其大小恰好是 s,并 ...
- I.MX6 android mkuserimg.sh
/************************************************************************** * I.MX6 android mkuserim ...
- Asp.net Mvc 数据库上下文初始化器
在Asp.net Mvc 和Entity FrameWork程序中,如果数据库不存在,EF默认的行为是新建一个数据库.如果模型类与已有的数据库不匹配的时候,会抛出一个异常. 通过指定数据库上下文对象初 ...
- asp.net 常用代码
asp.net 下拉菜单选中 ddlCity.SelectedIndex = ddlCity.Items.IndexOf(ddlCity.Items.FindByValue(")); 关于. ...
- 工作日记:C#获取操作系统、MAC地址、登录用户、网卡、物理内存信息
/// <summary> /// 操作系统的登录用户名 /// </summary> /// <returns>系统的登录用户名</returns> ...
- MySQL基础 -- 关系代数
MySQL基础 -- 关系代数 关系代数是一种抽象的查询语言,它用对关系的运算来表达查询. 任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的结果.所以运算对象.运算符.运算结果是运算 ...
- springboot(十一)SpringBoot任务
github地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 1 ...