一对一,一对多,多对多查询 (注解写法)

目录

    • 1、实体
    • 2、一对一
    • 3、一对多
    • 4、多对多
    • 5、测试

核心:
一对一,注解:@Select @Results @Result @One
一对多 & 多对多,@One改为@Many共同的操作:查询多表时,先查一个表,
把这个实体属性作为查询条件。
然后引用用接口中的方法,查询。

从用户,订单之间说一对一,和多对一的关系
从用户,用户角色,以及两者关系的表,来说多对多

^_^ 多表操作查询 一对一
😀一对多,多对多查询

1、实体

/*** 用户订单表  一对一* 一个订单对应一个用户...* @author echo lovely* @date 2020/9/13 10:26*/
public class Order {private Integer orderId;private Timestamp orderTime;private Double orderMoney;// 当前订单对应的用户..private User user;
}
/*** 多对多关系测试* @author echo lovely* @date 2020/9/13 16:38*/
public class Role {private Integer roleId;private String roleName;}
/*** @author echo lovely* @date 2020/9/11 20:55*/
public class User {private Integer userId;private String userName;private String userPassword;// 一对多 每个用户 有多个订单private List<Order> orderList;// 新增角色表 每个用户有多个角色,每个角色可能对应多个用户private List<Role> roleList;}

2、一对一

查询订单对应的用户

package cn.bitqian.dao;import cn.bitqian.entity.Order;
import cn.bitqian.entity.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 注解 一对一模型*/
public interface OrderMapper {/*@Select("select * from orders, users1 where orders.order_id = users1.userid")@Results({@Result(id = true, property = "orderId", column="order_id"),@Result(property = "orderName", column = "order_name"),@Result(property = "orderMoney", column = "order_money"),@Result(property = "user.userId", column = "userid"),@Result(property = "user.userName", column = "username"),@Result(property = "user.orderPassword", column = "orderpassword")})public List<Order> queryOrder();*/@Select("select * from orders")@Results({@Result(id = true, property = "orderId", column="order_id"),@Result(property = "orderName", column = "order_name"),@Result(property = "orderMoney", column = "order_money"),@Result(property = "user", // 要封装的属性名称column = "order_id", // 根据哪个字段查询user表的数据javaType = User.class, // 要封装的实体类型// select 代表查询对应接口 获得数据one = @One(select="cn.bitqian.dao.UserMapper.queryOneUser"))})List<Order> queryOrder();// 根据uid 查询对应的order@Select("select * from orders where uid = #{uid}")@Results({@Result(id = true, property = "orderId", column = "order_id"),@Result(property = "orderName", column = "order_name"),@Result(property = "orderMoney", column = "order_money")})Order queryOneOrder(int uid);}

3、一对多

查询用户对应的订单

package cn.bitqian.dao;import cn.bitqian.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserMapper {@Select("select * from users1")@Results({@Result(property = "userId", column = "userid"),@Result(property = "userName", column = "username"),@Result(property = "userPassword", column="userpassword"),@Result(property = "orderList", // 封装的属性名称为orderListcolumn = "userId",javaType = List.class,// mapper接口中 方法many = @Many(select = "cn.bitqian.dao.OrderMapper.queryOneOrder") // 在OrderMapper里面)})List<User> queryUserAndOrder();// 一对多 (一个用户多个订单)}

4、多对多

查询用户和角色

package cn.bitqian.dao;import cn.bitqian.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserMapper {// 用户 & 角色@Select("select * from users1")@Results({@Result(id = true, property = "userId", column = "userId"),@Result(property = "userName", column = "userName"),@Result(property = "userPassword", column = "userPassword"),@Result(property = "roleList", // 要封装的实体属性名称column = "userId",// 根据user id查询role表的数据javaType = List.class, // 要封装的实体类型many = @Many(select = "cn.bitqian.dao.RoleMapper.queryRoleByUserId"))// 查询对应的接口 获取数据})List<User> queryUserAndRole();}

角色接口

package cn.bitqian.dao;import cn.bitqian.entity.Role;
import org.apache.ibatis.annotations.*;import java.util.List;// 角色 & 用户 & 角色关系
public interface RoleMapper {@Select(value = "SELECT r.* FROM user_role ur, role r " +"WHERE ur.role_id = r.role_id " +"AND user_id = #{userId}")@Results({@Result(property = "roleId", column = "role_id"),@Result(property = "roleName", column = "role_name")})List<Role> queryRoleByUserId(int userId);}

5、测试

import cn.bitqian.dao.OrderMapper;
import cn.bitqian.dao.UserMapper;
import cn.bitqian.entity.Order;
import cn.bitqian.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** @author echo lovely* @date 2020/9/13 21:14*/
public class MybatisAnnotationTest {private SqlSession sqlSession;private UserMapper userMapper;@Beforepublic void initSqlSession() {try {InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);sqlSession = sqlSessionFactory.openSession(true);userMapper = sqlSession.getMapper(UserMapper.class);} catch (IOException e) {e.printStackTrace();}}// 一对一测试 注解@Testpublic void oneToOneTest() {OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);List<Order> orderList = orderMapper.queryOrder();for (Order order : orderList) {System.out.println(order);}}// 一对多测试@Testpublic void oneToManyTest() {List<User> userList = userMapper.queryUserAndOrder();for (User user : userList) {System.out.println(user);}}// 多对多测试@Testpublic void manyToMany() {List<User> userAndRoleList = userMapper.queryUserAndRole();for (User userAndRole : userAndRoleList) {System.out.println(userAndRole);}}@Afterpublic void destroySqlSession() {if (sqlSession != null) {sqlSession.close();System.out.println("close session...");}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核中影响tcp三次握手的一些协议配置

在Linux的发行版本中&#xff0c;都存在一个/proc/目录&#xff0c;有的也称它为Proc文件系统。在 /proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数&#xff0c;它们可以通过 cat 工具进行读取&#xff0c;或使用 echo 命令进行修…

ssm整合 durid数据源 报错java.sql.SQLException: Access denied for user ‘xxx‘@‘localhost‘

目录1、报错原因2、如何解决1、报错原因 连接数据库账号密码错误… 但我在jdbc.properties中检查账号&#xff0c; 密码都是正确的呀&#xff0c;&#x1f623; drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/mybatis_study?serverTimezoneGMT usernamer…

CS无线电语

〔Radio Commands (" Z "键) - 无线电指令〕1."Cover me" (掩护我)2."You Take The Point"(你守住这个位置)3."Hold This Position"(各单位保持现在的位置)4."REGROUP TEAM"(重新组队)&#xff0c;队友过于分散的时候可以用…

ssm整合 报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):xxx

目录1. 报错原因2. 解决3. 说明1. 报错原因 使用MapperScannerConfigurer扫描对应的mapper接口&#xff0c;帮我把mapper放入spring容器中&#xff0c;但是我的mapper映射文件并没有关联到sessionFactory中。 加载mybatis核心配置文件时&#xff0c; 其中的环境&#xff0c;数…

Teradata Fastload 使用方法

第一步&#xff1a; 首先打开 teradata fastload.exe 第二步&#xff1a; 通过粘贴导入脚本 脚本&#xff1a; SESSIONS 4; ERRLIMIT 25; SET RECORD VARTEXT ",";LOGON localhost/Teradata_Education,Educate; /* localhost:IP Address; Teradata_Education:user…

linux编译警告 will be initialized after

http://blog.chinaunix.net/uid-17019762-id-3152012.html 作为一个有强迫症的人&#xff0c;实在是受不了 warning 的存在 这个warning是由于初始化顺序引起的, // 会出现warning 的代码&#xff01;class cInit{public: cInit(std::string str, int a) : str_(str), a_(a…

Java实现邮箱发送(阿里云邮箱推送)

Java mail邮箱发送1. 邮箱信息实体类2. jar包依赖3. 发送邮箱实现绑定阿里云域名&#xff0c;创建域名账户&#xff0c;并配置解析域名账户&#xff0c;获得发送邮箱的权限&#xff0c;上限两百封&#xff0c;超出要&#xffe5;… 阿里云邮件推送控制台https://www.aliyun.co…

Android组件系列----BroadcastReceiver广播接收器

​【声明】 欢迎转载&#xff0c;但请保留文章原始出处→_→ 生命壹号&#xff1a;http://www.cnblogs.com/smyhvae/ 文章来源&#xff1a;http://www.cnblogs.com/smyhvae/p/3960623.html 【正文】 一、广播的功能和特征 广播的生命周期很短&#xff0c;经过调用对象-->…

vue.js 入门,简介

vue的源代码下载——开发版本和生产版本 https://cn.vuejs.org/js/vue.jshttps://cn.vuejs.org/js/vue.min.js vue中文学习官网 https://cn.vuejs.org/v2/guide/ vue学习入门1. 什么是vue.js2. vue的要学的核心3. 我的第一个vue程序(&#xffe3;▽&#xffe3;)"1. 什么…

项目开发--高级功能汇总

祭奠曾经逝去的青春…… 1.高级功能汇总-->Memcached之ASP.NET实现 2.高级功能汇总-->HubbleDotNet软件安装转载于:https://www.cnblogs.com/dmeiyang002/p/3961520.html

vue中的数据单向绑定,判断,循环,函数

vue基本语法1. 前言2. 数据绑定v-bind3. v-if || v-else-if || v-else 条件判断4. v-for 循环5. v-on 元素监听事件1. 前言 vue语法&#xff0c;基本照着官网的来的&#xff0c;也有一些看了b站某kuang的视频&#xff0c;受了些启发。 <div id"app">// 取dat…

Asp.Net MVC4入门指南(5):从控制器访问数据模型

在本节中&#xff0c;您将创建一个新的MoviesController类&#xff0c;并在这个Controller类里编写代码来取得电影数据&#xff0c;并使用视图模板将数据展示在浏览器里。 在开始下一步前&#xff0c;先Build一下应用程序(生成应用程序)(确保应用程序编译没有问题) 用鼠标右键单…

vue双向数据绑定v-model绑定单选框,复选框,下拉框

v-model使用1. 简单的demo2. 三种框的绑定注意它是自动帮你确认值的&#xff01;&#xff01;&#xff01;无需关心过程&#xff0c;把json数据一丢到data中&#xff0c;自动选中。1. 简单的demo 实现一边在输入框输入&#xff0c;一边显示输入框的内容 2. 三种框的绑定 &l…

WebApp基础01-设置读取assets目录下文件

要读取assets下的目录&#xff0c;只需要修改三个地方即可 1.res/layout/activity_main.xml 2.AndroidManifest.xml 3.src\com\example\lcy\MainActivity.java 第一步.res/layout/activity_main.xml加入代码,需要在xml布局文件中声明WebView组件 <WebView android:id"i…

vue借助axios实现网络通信

vue的好处之一&#xff0c;只关注视图层。对于通信&#xff0c;可以在vue实例对象创建前通过mounted钩子函数发送ajax请求&#xff0c;来拿到json数据。 发送请求通过axios&#xff0c;或者jQuery发送。 请求的数据在response对象里面。并绑定到vue对象data方法里。 1. 要访问…

vue自定义组件,插槽,自定义事件

vue组件套娃1. vue自定义组件2. 组件和插槽套娃3. vue组件通过自定义事件更改vue实例中的数据1. vue自定义组件 语法 Vue.component(自定义组件名, {props: [var1, var2, var3], //每个属性可以和页面绑定值template: <p>{{ var1 }}</p> // 自定义模板 里面套htm…

【编程题目】给你 10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数...

第 6 题&#xff08;数组&#xff09;腾讯面试题&#xff1a; 给你 10 分钟时间&#xff0c;根据上排给出十个数&#xff0c;在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下&#xff1a; 【0&#xff0c;1&#xff0c;2&…

vue脚手架v-cli,第一个vue程序

运行在node服务器上的vue程序1. v-cli安装2. 使用webpack构建vue程序3. 目录介绍4. webpack将vue打包成js文件1. v-cli安装 在玩v-cli vue客户端脚手架时&#xff0c;需要安装好node.js&#xff0c;是前端管理js包的工具正式安装vue-cli脚手架 1. npm install vue-cli -g 2. …

Shallow Copy Deep Copy in Python list

今天在写一个小程序的时候用到了2维数组, 顺手就写成了[[0.0]*length]*length, 结果为了这个小错,调试了半个多小时, 其实之前对与浅复制和深复制已经做过学习和总结, 但真正编程用到这些知识时还是掉入了陷阱中. 所以在此做进一步的总结: 本文通过几个实例来说明Python中list的…