(五)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中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...
随机推荐
- centos7 64位系统jdbc连接oracle报错问题
这两天发生了一个错误,记录下来. 报错如下: ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could n ...
- 【iOS系列】-oc中特有的语法
[iOS系列]-oc中特有的语法 oc数据类型: 1,基本类型 2,对象类型 3,id 4,BOOL 5,block 6,SEL 1:category 使用继承关系来扩充一个类,有一个弊病,高耦合性 ...
- github的提交源码到服务器
github是现代的代码库,各种牛人,各种开源,也是现在大公司招聘的一个考察点, 这里介绍一下怎样把本地源码提交到github上. 首先我们需要在github上创建一个respository. 2,输 ...
- Android大牛的博客
1 谦虚的天下:http://www.cnblogs.com/qianxudetianxia/ 2 csdn博文精选:http://www.csdn.net/article/2011-08-30/30 ...
- HTTP要点概述:一,TCP/IP协议族
一,协议: 计算机与网络设备之间如果要相互通信,双方必须基于相同的方法.比如说,怎么探测到通讯目标,哪一方发起通信,使用哪一种语言通信,怎么结束通信,都需要事先规定.不同硬件,操作系统之间的通信需要一 ...
- YTU 2887: D--机器人Bill
2887: D--机器人Bill 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 22 题目描述 最近,Dr. Jiang 新设计一个机器人Bill.Bill很聪明,会做 ...
- UITabBarController简单介绍
一.简单介绍 UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例 ...
- gunicorn部署Flask服务
作为一个Python选手,工作中需要的一些服务接口一般会用Flask来开发. Flask非常容易上手,它自带的app.run(host="0.0.0.0", port=7001)用 ...
- VS2013Xml文件节点导航插件开发
一.功能描述 该插件的功能跟代码文件的导航功能类似,只是下拉框里的内容是元素的某一属性值,如图-1所示 图-1 当点击下拉框的选项后,会自动定位到该内容在xml文件的位置.此功能适用于xml文件内容较 ...
- 《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》论文笔记
参考 http://blog.csdn.net/u011534057/article/details/55052304 代码 https://github.com/yusuketomoto/chain ...