框架——MyBatis查询(单表查询,多表联查)

目录

1.单表查询

 2.多表查询

想查询student并且查询student所选择的专业major

①通过id查一个

②不传入值直接查所有的学生列表

 ③嵌套查询

想查询专业major并且查询该专业被哪些学生student选择

①通过id查一个

 ②不传入值直接查所有的专业列表

 ③嵌套查询

3. 设置自动映射级别

4.注解


1.单表查询

 在AdminDao类中写该方法

//根据id查询管理员对象
Admin findAdminById(int id);

 在AdminMapper.xml文件中写相应的SQL语句 

<select id="findAdminById" parameterType="int" resultType="Admin">select * from admin where id = #{id}</select>

 在测试类的main方法中调用该方法,传入想要查询的管理员的信息(比如我们要查询id=1的管理员的信息)

此时数据库中id=1的数据如下 

结果查询正确 

若此时在数据库中新增一列admin_age年龄,在idea的Admin方法中新增一个adminAge的属性,则查询时不会查询出adminAge的值,因为数据库和java对于年龄的命名方式不同,他们两个都严格使用了他们的命名规范,所以怎么解决这一问题呢?

如果java中使用 标准驼峰命名 ,数据库中使用 下划线连接命名 ,可以开始全局设置实现自动转换
<setting name="mapUnderscoreToCamelCase" value="true"/>

 在mybatis.xml文件中配置全局设置实现自动转换,这样就可以解决命名的问题啦

此时数据库中id=1的数据如下  

 

 结果查询正确 ,包含年龄的值

 2.多表查询

在mysql中创建两张表,一个student学生表,一个major专业表,想要通过传入学生student的id来查询学生的姓名、性别、学号和该学生选择的专业

接着在idea中创建studentmajor类,在两个类中设置相关的属性,并生成set,get方法

其中Student类中要传入专业Major的类

 Major类中要传入Student类的集合(因为一个专业可以被多个学生选,而一个学生只能选择一个专业)

 


 接着还是环境的搭建的步骤:

具体可以看我之前写过的文章http://t.csdnimg.cn/pl52Kicon-default.png?t=N7T8http://t.csdnimg.cn/pl52K


在dao包下创建StudentDao接口,创建对应的sql映射文件StudentMapper.xml,并配置接口地址到映射文件StudentMapper.xml(其他的基本和之前创建的AdminMapper.xml文件一样)

在mybatis.xml文件配置sql映射文件 

 接着就可以写方法进行查询了操作啦! ! !

想查询student并且查询student所选择的专业major

①通过id查一个

 在StudentDao类中写该方法

//通过id查一个
Student findStudentById(int id);

 在StudentMapper.xml文件中写相应的SQL语句 

因为是多表查询所以不用再传入resultType了,但是要传入resultMap来手动设置映射,这样major专业的名字就可以查询到了

 <resultMap id="studentMap" type="Student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><association property="major" javaType="Major"><result column="mname" property="name"></result></association>
</resultMap>
<select id="findStudentById" parameterType="int" resultMap="studentMap">SELECTs.id,s.num,s.name,s.gender,m.name mnameFROM student s LEFT JOIN major m ON s.majorid = m.id WHERE s.id = #{id}</select>

  在测试类的main方法中调用该方法,传入想要查询的学生的id

多表查询的结果就出来啦!

②不传入值直接查所有的学生列表

 在StudentDao类中写该方法

//查所有
List<Student> findStudents();

  在StudentMapper.xml文件中写相应的SQL语句 

  <resultMap id="studentMap" type="Student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><association property="major" javaType="Major"><result column="mname" property="name"></result></association></resultMap><select id="findStudents" resultMap="studentMap">SELECTs.id,s.num,s.name,s.gender,m.name mnameFROM student s LEFT JOIN major m ON s.majorid = m.id</select>

在测试类的main方法中调用该方法

多表查询的结果就出来啦!

 ③嵌套查询

 在StudentDao类中写该方法

//嵌套查询
Student findStudentById1(int id);

  在StudentMapper.xml文件中写相应的SQL语句 

把一个关联查询,分成了两单表查询,先查询学生信息,然后通过学生专业外键查询关联的专业信息

<!--嵌套查询,把一个关联查询,分成了两单表查询,先查询学生信息,然后通过学生专业外键查询关联的专业信息--><resultMap id="studentMap1" type="Student"><association property="major" javaType="Major" select="findMajorById" column="majorid"></association></resultMap><select id="findStudentById1" parameterType="int" resultMap="studentMap1">SELECTs.id,s.num,s.name,s.gender,s.majoridFROM student s WHERE s.id = #{id}</select><select id="findMajorById" parameterType="int" resultType="Major">select name from major where id = #{id}</select>

在测试类的main方法中调用该方法,传入想要查询的学生的id

多表查询的结果就出来啦!

想查询专业major并且查询该专业被哪些学生student选择

①通过id查一个

 在MajorDao类中写该方法

//通过id查一个

Major findMajorById(int id);

 在MajorMapper.xml文件中写相应的SQL语句 

因为是多表查询所以不用再传入resultType了,但是要传入resultMap来手动设置映射,这样student学生的名字就可以查询到了

    <resultMap id="majorMap" type="Major"><id column="id" property="id"></id><result column="name" property="name"></result><collection property="students" javaType="List" ofType="Student"><result column="num" property="num"></result><result column="sname" property="name"></result></collection></resultMap><select id="findMajorById" resultMap="majorMap">SELECT m.id, m.name,s.num,s.name snameFROM major m LEFT JOIN student s ON m.id = s.majorid WHERE m.id = #{id}</select>

  在测试类的main方法中调用该方法,传入想要查询的专业的id

多表查询的结果就出来啦!

 ②不传入值直接查所有的专业列表

在MajorDao类中写该方法

//查所有
List<Student> findStudents();

在MajorMapper.xml文件中写相应的SQL语句 

    <resultMap id="majorMap" type="Major"><id column="id" property="id"></id><result column="name" property="name"></result><collection property="students" javaType="List" ofType="Student"><result column="num" property="num"></result><result column="sname" property="name"></result></collection></resultMap><select id="findMajors" resultMap="majorMap">SELECT m.id, m.name,s.num,s.name snameFROM major m LEFT JOIN student s ON m.id = s.majorid</select>

在测试类的main方法中调用该方法

多表查询的结果就出来啦!

 ③嵌套查询

在MajorDao类中写该方法

//嵌套查询

Major findMajorById1(int id);

在MajorMapper.xml文件中写相应的SQL语句 

把一个关联查询,分成了两单表查询,先查询专业信息,然后通过学生的专业外键查询关联的学生信息

<!--嵌套查询--><resultMap id="majorMap1" type="Major"><collection property="students" javaType="List" ofType="Student" select="findStudents" column="id"></collection></resultMap><select id="findMajorById1" resultMap="majorMap1">SELECT id,name FROM major WHERE id = #{id}</select><select id="findStudents" resultType="student">select num,name from student where majorid = #{id}</select>

 在测试类的main方法中调用该方法,传入想要查询的专业的id

多表查询的结果就出来啦!

3. 设置自动映射级别

NONE完全关闭自动映射

PARTIAL当查询没有嵌套查询时,会自动映射,一旦有嵌套查询就不会自动映射

FULL 无论是否有嵌套都会自动映射

mabatis官方默认给的是部分映射:PARTIAL

4.注解

是直接将SQL语句写在Dao层的方法上(推荐SQL语句比较简单的使用),这样SQL语句就不用在sql 映射文件中写了,减少了代码的冗余,更加便利简洁

常用注解标签
@Insert : 插入 sql , 和 xml insert sql 语法完全一样
@Select : 查询 sql, 和 xml select sql 语法完全一样
@Update : 更新 sql, 和 xml update sql 语法完全一样
@Delete : 删除 sql, 和 xml delete sql 语法完全一样
@Param : 入参
@Results : 设置结果集合
@Result : 结果

 就比如这样,直接将SQL写在方法上

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

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

相关文章

SQL, 有终止条件的多次累计计算

MSSQL数据库的data表存储了多人上电梯的情况&#xff0c;turn表示进电梯的顺序。电梯最大承重1000公斤&#xff0c;每趟能上的人数有限&#xff0c;超重的人要等下一趟。nameweightturnAlice2501Bob1702Alex3503John4004Winston5005Marie2006 请计算每趟电梯最后一个进入的人的…

IOS半越狱工具nathanlr越狱教程

简介 nathanlr 是一款半越狱工具&#xff0c;不是完整越狱。 半越狱只能使用一些系统范围的插件。 无法做到完整越狱 Dopamine 越狱一样插件兼容性。 nathanlr支持 iOS 16.5.1 – 16.6.1 系统。 支持 A12 及以上设备。 肯定有人问&#xff0c;为什么仅仅支持这些系统&#xff…

嵌入式学习day33

tcp的特点 面向字节流特点&#xff0c;会造成可能数据与数据发送到一块&#xff0c;成为粘包&#xff0c;数据之间不区分 拆包 因为缓冲区的大小&#xff0c;一次性发送的数据会进行拆分&#xff08;大小不符合的时候&#xff09; 就和水一样一次拆一次沾到一块&#xff0c…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例&#xff1f; 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例&#xff1f; 由于时间…

Git 的基本使用

1.创建 Git 本地仓库 仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制&#xff0c;就必须先创建⼀个仓库出来&#xff0c;例如下面代码创建了gitcode_linux的文件夹&#xff0c;之后再对其进行初始化。创建⼀个 Git 本地仓库对应的命令为 git init &#xff0c…

少年我看你有缘,这部《html标签大合集》就送你了

HTML标签是用于定义网页结构和内容的元素。标签通常是成对出现的&#xff0c;由开始标记和结束标记组成&#xff0c;开始标记使用尖括号< >包围&#xff0c;结束标记使用尖括号和斜杠/包围。开始标记中的元素属性可以提供额外的信息。 1.基础标签 html 标签 head 头标…

Codeforces Round 967 (Div. 2) C题Guess The Tree

题目链接 令1是根&#xff0c;我们可以一层一层的递推出去。容易知道询问a&#xff0c;b如果结果是c&#xff0c;那么c就是a&#xff0c;b路径上的中点。我们可以先让根1和其他n-1个点都询问一遍&#xff0c;如果返回值是1&#xff0c;那么这些点就是第二层&#xff0c;深度为2…

【注解】反序列化时匹配多个 JSON 属性名 @JsonAlias 详解

JsonAlias 注解是 Jackson 提供的一个功能强大的注解&#xff0c;允许一个字段在反序列化时匹配多个 JSON 属性名。它适用于在处理多种输入数据格式时&#xff0c;或当 JSON 数据的键名可能变化时。 一、JsonAlias 的作用 多种别名&#xff1a;JsonAlias 允许你为一个字段定义…

ZNS SSD是不是持久缓存的理想选择?

随着数据量的增加和技术的进步&#xff0c;对于高效、可靠的存储解决方案的需求日益增长。传统的基于块的SSD虽然具有成本效益和持久性的优点&#xff0c;但在处理写密集型和更新密集型工作负载时存在局限性。 NAND闪存的特点是数据只能按页&#xff08;例如4KiB&#xff09;写…

2024年最新最全的【大模型学习路线规划】从零基础入门到精通!

2024年最新最全的大模型学习路线规划&#xff0c;对于零基础入门到精通的学习者来说&#xff0c;可以遵循以下阶段进行&#xff1a; 文章目录 一、基础准备阶段数学基础&#xff1a;编程语言&#xff1a;深度学习基础&#xff1a; 二、核心技术学习阶段Transformer模型&#xf…

[Linux#41][线程] 线程的特性 | 分离线程 | 并发的问题

1.线程的特性 进程和线程的关系如下图: 关于进程线程的问题 • 如何看待之前学习的单进程&#xff1f;具有一个线程执行流的进程 线程 ID 及进程地址空间布局 pthread_ create 函数会产生一个线程 ID&#xff0c;存放在第一个参数指向的地址中。 该线程 ID 和前面说的线程 ID …

动手实现基于Reactor模型的高并发Web服务器(一):epoll+多线程版本

系统流程概览 main函数 对于一个服务器程序来说&#xff0c;因为要为外部的客户端程序提供网络服务&#xff0c;也就是进行数据的读写&#xff0c;这就必然需要一个 socket 文件描述符&#xff0c;只有拥有了文件描述符 C/S 两端才能通过 socket 套接字进行网络通信&#xff0…

4.Redis单线程和多线程

1.Redis的单线程 Redis的单线程主要是指Redis的网络IO和键值对读写是由一个线程完成的&#xff0c;Redis在处理客户端的请求时包括获取&#xff08;Socket读&#xff09;、解析、执行、内容返回&#xff08;Socket写&#xff09;等都由一个顺序串行的主线程处理&#xff0c;这…

ProxySQL 读写分离配置

ProxySQL 是一个高性能、高可用的 MySQL 代理软件&#xff0c;旨在提升 MySQL 数据库的可扩展性和性能。它可以在应用程序和 MySQL 服务器之间充当中间层&#xff0c;提供强大的路由、负载均衡和查询优化功能。 ProxySQL 的主要功能&#xff1a; 查询路由&#xff1a; ProxySQ…

MySQL DDL详细讲解和常见问题案例示范

MySQL 删除操作和连接类型详细讲解和案例示范 DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;是用于创建和修改数据库结构的语句&#xff0c;包括创建表、索引、视图&#xff0c;以及修改这些结构。本文将详细介绍MySQL DDL语句的常见用法&…

stm32hal库can使用记录

一、单片机最小系统板使用can 资料&#xff1a;https://blog.csdn.net/yoie01/article/details/136921034 https://blog.csdn.net/qq_36561846/article/details/117431769 这里面有一个问题&#xff0c;最小系统板没有can收发器&#xff0c;所以没法直接用&#xff0c;只能测…

市盈率的概念

写篇有关市盈率的【不务正业】的内容。 重要公式 市盈率 官方的定义 平均市盈率&#xff1d;∑(收盘价发行数量)/∑(每股收益发行数量)&#xff0c;统计时剔除亏损及暂停上市的上市公司。 静态市盈率 滚动市盈率&#xff08;TTM&#xff09; 股票市盈率的意义 如果某股票有较…

培训第三十四天(初步了解Docker与套接字的应用)

上午 回顾 1、主从复制&#xff08;高可用&#xff09; 2、传统的主从复制 3、gtids事务型的主从复制 4、注意 1&#xff09;server_id唯一 2&#xff09;8.X版本需要get_ssl_pub_key 3&#xff09;5.X不需要 4&#xff09;change master to 5&#xff09;stop | sta…

项目服务器登录部分

从连接池中获取上下文&#xff0c;接受连接。 async_accept 这个函数本质上是监听和接受客户端连接的结合操作。 void CServer::StartAccept() {auto& io_context AsioIOServicePool::GetInstance()->GetIOService();std::shared_ptr<CSession> new_session mak…

JS中encodeURIComponent和encodeURI函数的区别

1、encodeURIComponent函数用于对完整的URL组件进行编码&#xff0c;包括查询参数、路径片段等。 它会对所有非字母数字字符进行编码&#xff0c;并将其替换为相应的URL编码形式。这包括对特殊字符&#xff08;如冒号、斜杠、问号、等号、加号等&#xff09;的编码。encodeURI…