(五)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中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...
随机推荐
- android <application> 开发文档翻译
由于本人英文能力实在有限,不足之初敬请谅解 本博客仅仅要没有注明"转",那么均为原创.转贴请注明本博客链接链接 <application>语法: <appl ...
- 深度学习笔记之使用Faster-Rcnn进行目标检测 (原理篇)
不多说,直接上干货! Object Detection发展介绍 Faster rcnn是用来解决计算机视觉(CV)领域中Object Detection的问题的.经典的解决方案是使用: SS(sele ...
- 有关java构造器的笔记
当程序中首次出现使用一个类A时, 无论是使用A的静态成员还是创建一个对象(声明一个A类对象不算), 那么类加载器就会首先对A进行加载, 在对A进行加载的过程中, 如果A有一个extends的父类B, ...
- Redhat enterpise6 安装unix2dos/dos2unix
初用unix2dos,在rhel6 上 用yum install unix2dos , 提示源不可用, 那好吧, 就去rpm包网:http://rpm.pbone.net/ 下载了一个unix2dos ...
- android锁屏软件制作
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mingyue_1128/article/details/33726515 转载请标明出处http:/ ...
- myqsl02
常用的表的引擎 Myisam ,批量插入速度快, 不支持事务,锁表 Innodb, 批量插入相对较慢,支持事务,锁行. 全文索引:目前5.5版本,myisam,innodb都已经支持 关于事务的引擎: ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX【转】
本文转载自:http://www.cnblogs.com/52php/p/5681751.html 四.更好一点的Hello World 没有最好,只有更好 从本小节开始,后面所有的构建我们都将采用 ...
- bzoj4594: [Shoi2015]零件组装机
论静态查错的重要性...乱搞题真难调 首先这题看起来就是要分治检验了. 考虑对于区间[l,r],分成[l,p-1]和[p,r]使得这两个区间合并可以得到[l,r],并且要保证后面一个区间较大 设前一个 ...
- 浅入分析和Linux内核相关的文件夹/proc和/sys .
近来文章被踩的厉害,我只想把自己从马哥学的知识自己总结下发到博客里,但是没想到昨天一篇文章刚发一上午被踩了9次...如果您真的觉得我的文章很烂,请告诉我原因,不胜感激. 这星期,马哥讲了关于Linux ...
- Gerrit2安装配置
我主要根据下面这个文章而安装,遇到一些小问题,记录如下:2016.4.30 安装 2.12.2,要将加密的东东全装上!!!注意 1) 由于新的git-bash ...