Java企业级开发学习笔记(2.4)利用MyBatis实现条件查询

news2024/11/16 7:35:49

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/AZM1g】

文章目录

  • 一、创建学生映射器配置文件
  • 二、配置学生映射文件
  • 三、创建学生映射器接口
  • 四、测试学生映射器接口
    • 任务1. 查询女生记录
    • 任务2. 查询19岁的女生
    • 任务3. 查询姓吴的19岁女生
    • 任务4. 查找姓张的19岁女生


一、创建学生映射器配置文件

  • resources/mapper目录里创建学生映射器配置文件 - StudentMapper.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="cn.kox.mybatis.mapper.StudentMapper">
    <!--按编号查询班级-->
    <select id="getClazz" resultType="Clazz">
        SELECT c_id id, c_name name FROM t_class WHERE c_id = #{id}
    </select>

    <!--定义学生结果映射-->
    <resultMap id="studentMap" type="Student">
        <result column="s_id" property="id"/>
        <result column="s_name" property="name"/>
        <result column="s_gender" property="gender"/>
        <result column="s_age" property="age"/>
        <!--通过子查询getClazz关联到班级实体-->
        <association column="class_id" property="clazz" javaType="Clazz" select="getClazz"/>
    </resultMap>

    <!--按条件查询学生记录,涉及姓名、性别与年龄的联合查询-->
    <select id="findByCondition" parameterType="java.util.Map" resultMap="studentMap">
        SELECT * FROM t_student
        <trim prefix="WHERE" prefixOverrides="AND|OR"> <!--删除条件中多余的AND或OR-->
            <!--关于姓名的条件,模糊查询-->
            <if test="name != null">
                s_name LIKE CONCAT(#{name}, '%')
            </if>
            <!--关于性别的条件-->
            <if test="gender != null">
                AND s_gender = #{gender}  <!--注意AND不能少-->
            </if>
            <!--关于年龄的条件-->
            <if test="age != null">
                AND s_age = #{age} <!--注意AND不能少-->
            </if>
        </trim>
    </select>
</mapper>

二、配置学生映射文件

  • 在MyBatis配置文件的<mappers>元素里添加子元素<mapper resource="mapper/StudentMapper.xml"/>
    在这里插入图片描述

三、创建学生映射器接口

  • cn.kox.mybatis.mapper包里创建学生映射器接口 - StudentMapper
    在这里插入图片描述
package cn.kox.mybatis.mapper;

import cn.kox.mybatis.bean.Student;

import java.util.List;
import java.util.Map;

/*
 * 学生映射器接口
 * */

public interface StudentMapper {
    List<Student> findByCondition(Map<String, Object> condition); // 按条件查询学生记录
}

四、测试学生映射器接口

  • test/javacn.kox.mybatis.mapper包里创建TestStudentMapper
    在这里插入图片描述
package cn.kox.mybatis.mapper;

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 java.io.IOException;
import java.io.Reader;

/**
 * @ClassName: TestStudentMapper
 * @Author: Kox
 * @Data: 2023/4/19
 * @Sketch:
 */
public class TestStudentMapper {
    private SqlSession sqlSession; // SQL会话
    private StudentMapper studentMapper; // 学生映射器

    @Before
    public void init() {
        try {
            // 读取MyBatis配置文件
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            // 基于MyBatis配置文件构建SQL会话工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
            // 利用SQL会话工厂获取SQL会话
            sqlSession = factory.openSession();
            // 利用SQL会话获取学生映射器对象
            studentMapper = sqlSession.getMapper(StudentMapper.class);
            // 提示用户SQL会话创建成功
            System.out.println("SQL会话创建成功~");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @After
    public void destroy() {
        // 关闭SQL会话
        sqlSession.close();
        // 提示用户SQL会话关闭
        System.out.println("SQL会话已经关闭~");
    }
}

任务1. 查询女生记录

  • 添加测试方法testFindByCondition()
    @Test // 测试按条件查询学生记录                                                  
    public void testFindByCondition() {
        // 创建条件对象
        Map<String, Object> condition = new HashMap<>();
        // 设置性别条件(女)
        condition.put("gender", "女");
        // 按条件查询学生记录
        List<Student> students = studentMapper.findByCondition(condition);
        // 判断是否查询到满足条件的记录
        if (students.size() > 0) {
            // 使用列表的遍历算子输出全部记录
            students.forEach(student -> System.out.println(student));
        } else {
            // 提示用户没有找到满足条件的记录
            System.out.println("遗憾,没找到满足条件的记录~");
        }
    }
  • 运行测试方法testFindByCondition(),查看结果
    在这里插入图片描述

任务2. 查询19岁的女生

  • 修改测试方法里的查询条件
    在这里插入图片描述
  • 运行测试方法testFindByCondition(),查看结果
    在这里插入图片描述

任务3. 查询姓吴的19岁女生

  • 修改测试方法里的查询条件
    在这里插入图片描述
  • 运行测试方法testFindByCondition(),查看结果
    在这里插入图片描述

任务4. 查找姓张的19岁女生

  • 修改测试方法里的查询条件
    在这里插入图片描述
  • 运行测试方法testFindByCondition(),查看结果
    在这里插入图片描述

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

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

相关文章

css预处理器:less

1.css常见单位 绝对单位 只需要掌握px,国外in用得更多 相对单位 em em相对于自身的font-size,如果自身未定义,则相对于继承的父元素font-size rem rem可以做移动端的适配,依然很重要,如淘宝m站在使用;但是趋势是rem转vw rem是相对于html的font-size,html默认字体大小为1…

ROS学习第二十五节——rqt工具箱

1.安装 一般只要你安装的是desktop-full版本就会自带工具箱 如果需要安装可以以如下方式安装 $ sudo apt-get install ros-noetic-rqt $ sudo apt-get install ros-noetic-rqt-common-plugins2.启动 rqt的启动方式有两种: 方式1:rqt 方式2:rosrun rqt_gui rqt_gui 3.基本使…

知识图谱实战应用5-基于知识图谱的创建语义搜索功能

大家好&#xff0c;我是微学AI&#xff0c;今天给大家讲一下知识图谱实战应用5-基于知识图谱的创建语义搜索功能。基于知识图谱的语义搜索功能是一种能够理解用户意图、并根据语义关系在知识图谱中进行查询的搜索方式。相比于传统的文本搜索&#xff0c;它可以更准确地回答用户…

Ubuntu 23.04 正式发布

Ubuntu 23.04 “Lunar Lobster” 是 Ubuntu 操作系统的最新短期支持版本&#xff0c;该版本将获得 9 个月的支持&#xff0c;直到 2024 年 1 月。如果你需要长期支持&#xff0c;建议使用 Ubuntu 22.04 LTS 代替。 Linux 内核 Ubuntu 23.04 采用了新的 Linux 6.2 内核。 值得注…

PySide6/PyQT多线程的使用

前言 上一篇文章介绍了在PySide6中使用多线程去解决PySide6/PyQT的界面卡死问题&#xff0c;这次来具体介绍下多线程在使用上的一些细节。 本文尝试对以下两个问题进行解决&#xff1a; 对 PySide6/PyQT 多线程的使用不熟悉&#xff1b;在 PySide6/PyQT 的应用程序里有耗时任…

prompt的演变

随着功能的增加&#xff0c;提示工程的复杂性将不可避免地增加。在这里&#xff0c;我解释了如何将复杂性引入到提示工程的过程中。 静态prompt 如今&#xff0c;试验prompt和提示工程已司空见惯。通过创建和运行提示的过程&#xff0c;用户可以体验 LLM 的生成能力。 文本生…

STM32 学习笔记_4 GPIO:LED,蜂鸣器,按键,传感器的使用

GPIO 通用 IO General Purpose Input Output. 可配置为8种输入输出模式。通常0~3.3V&#xff0c;部分引脚允许 5V。 上面的虚线方框是输入模块&#xff0c;下面的是输出模块。 推挽输出是1输出高电平&#xff0c;0输出低电平。开漏输出正好相反&#xff0c;因此没有高电平驱…

10分钟了解人工智能(最通俗的语言)

最通俗的语言&#xff1a;15分钟了解人工智能&#xff1b;唯一优点&#xff0c;受众完全听懂 无人驾驶、智能家居、远程医疗……如今&#xff0c;人工智能(AI)技术已被广泛应用于金融、交通、医疗、安防、教育等领域&#xff0c;成为经济增长新动能 一 什么是人工智能 人工智能…

动态规划之-不同路径 II-滚动数组_20230421

DP动态规划之-滚动数组 前言 在学习 不同路径II 的动态规划过程中&#xff0c;从介绍资料中了解到 滚动数组可以进一步降低动态规划解空间的复杂度&#xff0c;更高效利用计算机的储存空间。动态规划中的滚动数组究竟能发挥哪些作用&#xff0c;在常规的动态规划中&#xff0…

REDIS02_RDB概述及作用、自动触发、手动触发、优势劣势、触发场景、配置项详解

文章目录 ①. RDB概述及作用②. RDB - 自动触发③. 手动触发 - save、bgsave④. RDB - 优势体现⑤. RDB - 劣势体现⑥. 哪些情况会触发RDB快照⑦. RDB优化配置项详解 ①. RDB概述及作用 ①. RDB概述:在指定的时间间隔,执行数据集的时间点快照 实现类似照片记录效果的方式,就是…

MapReduce高级篇——全局计数器

MapReduce Counter 计数器 概念 在执行MapReduce程序的时候&#xff0c;控制台输出日志中通常下面片段&#xff0c;可以发现输出信息中的核心词是counter,中文叫做计数器 在执行MapReduce城西过程中&#xff0c;许多时候&#xff0c;用户希望了解程序的运行情况&#xff0c;H…

白话文讲计算机视觉-第十讲-灰度阈值分割

灰度阈值是啥意思呢&#xff1f;我们慢慢说。 1.灰度图 我们现在有一张彩色图&#xff0c;我们给它用黑白的方式变现&#xff0c;就形成灰度图&#xff0c;如图所示。 图1 那究竟怎么转换的呢&#xff1f;很简单&#xff0c;我们根据如下公式&#xff0c;把BGR三个通道换成一个…

【算法题解】26. 求串联子串的位置

这是一道 困难 题 来自&#xff1a; https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的…

REXROTH液压方向阀安装须知

安装规程 阀安装到系统之前&#xff0c;应该对照订货型号比较其型号说明。 确认阀的连接表面和底板无水分&#xff0c;没有油。 &#xff0d; 清洁&#xff1a; ‧ 安装元件时&#xff0c;确认工业阀和周围干净 ‧ 油箱须密闭&#xff0c;以防止外部污染 ‧ 安装之前&…

【youcans的深度学习 D02】PyTorch例程:创建 LeNet 模型进行图像分类

欢迎关注『youcans的深度学习』系列 【youcans的深度学习 D02】PyTorch例程&#xff1a;创建 LeNet 模型进行图像分类 1. PyTorch 深度学习建模的基本步骤2. 加载 CIFAR-10 数据集3. 定义 LeNet-5 模型类3.1 LeNet 网络3.2 LeNet-5 网络3.3 定义 LeNet-5 网络模型类3.4 构建网络…

AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?

GPT等AI大模型震撼来袭&#xff0c;基于RPA的超级自动化仍是最佳落地载体 对话弘玑CPO贾岿&#xff0c;深入了解国产RPA厂商对AI大模型的探索与实践 文/王吉伟 关于RPA已死的说法&#xff0c;在中国RPA元年&#xff08;2019年&#xff09;投资机构疯狂抢项目之时就已经有了。…

算法训练Day39:62.不同路径 63. 不同路径 II 动态规划

文章目录 不同路径题解(动态规划)数论方法 [不同路径 II](https://leetcode.cn/problems/unique-paths-ii/description/)题解 不同路径 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (67.70%)17460--0 Tags Companies 一个机器人位于一个 …

Linux基础—网络设置

Linux基础—网络设置 一、查看网络配置1.查看网络接口信息 ifconfig2.查看主机名称 hostname3.查看路由表条目 route4.查看网络连接情况 netstat5.获取socket统计信息 ss 二、测试网络连接1.测试网络连接 ping2.跟踪数据包 traceroute3.域名解析 nslookup 三、使用网络配置命令…

拷贝构造与深浅拷贝

文章目录 一、拷贝构造函数二、拷贝初始化三、深浅拷贝 一、拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用&#xff0c;而且任何额外参数都有默认值&#xff0c;则此构造函数是拷贝构造函数。 class person { public: person(); //默认构造函数 pe…

54家备案法人信用评级机构名单

2023年4月20日&#xff0c;中国人民银行官网公示备案法人信用评级机构名单&#xff0c;共有54家机构获得了信用评级备案&#xff0c;并进行如下提示&#xff1a; 1.2019年11月26日&#xff0c;人民银行、发展改革委、财政部、证监会联合发布《信用评级业管理暂行办法》&#xf…