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

2024-08-24 01:04

本文主要是介绍框架——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写在方法上

这篇关于框架——MyBatis查询(单表查询,多表联查)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101001

相关文章

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

mybatis中resultMap的association及collectio的使用详解

《mybatis中resultMap的association及collectio的使用详解》MyBatis的resultMap定义数据库结果到Java对象的映射规则,包含id、type等属性,子元素需... 目录1.reusltmap的说明2.association的使用3.collection的使用4.总

mybatis-plus QueryWrapper中or,and的使用及说明

《mybatis-plusQueryWrapper中or,and的使用及说明》使用MyBatisPlusQueryWrapper时,因同时添加角色权限固定条件和多字段模糊查询导致数据异常展示,排查发... 目录QueryWrapper中or,and使用列表中还要同时模糊查询多个字段经过排查这就导致只要whe

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor