(五)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中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...
随机推荐
- Linux 简单的Shell输出
echo:用于输出指定字符串或用于在Shell中打印Shell变量的值 语法格式:echo [选项] [参数] -n:不输出换行 linlin@ubuntu:~/linlin/text$ ...
- HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化
题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...
- 一步一步学Silverlight 2系列(4):鼠标事件处理
一步一步学Silverlight 2系列(4):鼠标事件处理 概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言V ...
- 网页动画插件---Super Scrollorama , TweenMax 和skrollr
SuperScrollorama 是一个用来实现超酷的滚动动画效果的 jQuery 插件. 实现的效果有:文字褪色,飞,旋转,缩放,斯马什,针脚,滑动,隐退,反弹,颜色,扔,移动,视差. 地址:htt ...
- Spring 各种注解(@)的含义与认识
依赖注入,从字面上理解,即是:以注入的方式实现依赖: Spring 容器负责创建应用程序中的 bean,并通过 DI(依赖注入)来协调这些对象之间的关系.当描述 bean 如何进行装配(autowir ...
- 并不对劲的p3709:大爷的字符串题
题目大意 区间众数 题解 莫队 代码 #include<algorithm> #include<cmath> #include<cstdio> #include&l ...
- JAVA JVM 流程一
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机 ...
- zoj 3471(状态压缩DP,类似于点集配对)
Most Powerful Time Limit: 2 Seconds Memory Limit: 65536 KB Recently, researchers on Mars have d ...
- 关于ArcGis for javascript的使用
1.引用ArcGis for javascript核心类库的两种方式: 1.1.下载js包,解压缩放入项目中 1.1.1.下载核心类库压缩文件, 下载地址: https://developers.ar ...
- ubuntu/linuxmint搜狗输入法无法输入中文或崩溃
执行下列命令: cd ~/.config rm -rf SogouPY SogouPY.users sogou-qimpanel 然后重启电脑.