Mybatis参数(parameterType)

news2024/10/6 22:31:46

在此之前,我们已经介绍了Mybatis的一些基本用法,包括了Mybatis查询数据、结果映射(resultMap)等。本篇我们主要介绍Mybatis在查询数据时如何传递参数。

一、准备工作

这里我们直接使用脚本初始化数据库中的数据

-- 如果数据库不存在则创建数据库
CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
-- 切换数据库
USE demo;
-- 创建用户表
CREATE TABLE IF NOT EXISTS T_USER(
  ID INT PRIMARY KEY,
  USERNAME VARCHAR(32) NOT NULL,
  AGE INT NOT NULL 
);
-- 插入用户数据
INSERT INTO T_USER(ID, USERNAME, AGE)
VALUES(1, '张三', 20),(2, '李四', 22),(3, '王五', 24);

创建了一个名称为demo的数据库;并在库里创建了名称为T_USER的用户表并向表中插入了数据

二、创建用户实体类

在cn.horse.demo包下创建UserInfo实体类,为了方便打印用户的信息这里重写了ToString()方法

package cn.horse.demo;

public class UserInfo {

    private Integer id;
    private String name;
    private Integer age;

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append('{');
        stringBuilder.append("id: " + this.id);
        stringBuilder.append(", ");
        stringBuilder.append("name: " + this.name);
        stringBuilder.append(", ");
        stringBuilder.append("age: " + this.age);
        stringBuilder.append('}');
        return stringBuilder.toString();
    }
}

三、配置XML配置文件

这里我在resources下创建了一个demo的目录,并在目录下创建了一个UserInfoMapper.xml的配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.horse.demo.UserInfoMapper">

    <select id="findByAge" resultType="cn.horse.demo.UserInfo">
        SELECT
            ID,
            USERNAME name,
            AGE
        FROM T_USER
        WHERE AGE > #{age}
    </select>

    <select id="findByObject" resultType="cn.horse.demo.UserInfo">
        SELECT
        ID,
        USERNAME name,
        AGE
        FROM T_USER
        WHERE AGE BETWEEN #{startAge} AND #{endAge}
    </select>
</mapper>

findByAge查询标签用于查询年龄大于age的用户列表

findByObject查询标签用于查询年龄从startAge到endAge之间的用户列表

#{age }、#{startAge}、#{endAge} 这些是查询的参数,在预处理阶段会使用?进行替换掉,在执行阶段会把参数的值传入进行查询操作。

另外,需要在mybatis-config.xml文件中配置UserInfoMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.gjt.mm.mysql.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="horse"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="demo/UserInfoMapper.xml" />
    </mappers>
</configuration>

四、查询数据列表工具类

在cn.horse.demo下创建StatementUtils类,在类中编写find静态方法用于查询数据列表,方法接收两个参数:语句和参数。

package cn.horse.demo;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;
import java.util.Objects;

public abstract class StatementUtils {

    public static void find(String statement, Object parameter) {
        // 读取mybatis配置文件
        InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
        // 根据配置创建SqlSession工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);

        SqlSession sqlSession = null;
        try {
            // 创建SqlSession
            sqlSession = sqlSessionFactory.openSession();
            // 查询用户列表
            List<UserInfo> userInfoList = sqlSession.selectList(statement, parameter);
            for (UserInfo userInfo: userInfoList) {
                System.out.println(userInfo);
            }
        } finally {
            // 关闭会话
            if(Objects.nonNull(sqlSession)) {
                sqlSession.close();
            }
        }
    }
}

五、基本类型作为参数

测试:

这里我们查询年龄大于21岁的所有用户

StatementUtils.find("cn.horse.demo.UserInfoMapper.findByAge", 21);

执行的结果如下:

注意:基本类型作为参数时,SQL语句中使用的参数名不限制

六、对象作为参数

这里我们新建用户查询类

UserInfoQuery类:

package cn.horse.demo;

public class UserInfoQuery {

    private Integer startAge;
    private Integer endAge;

    public void setStartAge(Integer startAge) {
        this.startAge = startAge;
    }

    public void setEndAge(Integer endAge) {
        this.endAge = endAge;
    }
}

其中startAge, endAge代表开始和结束年龄

测试:

这里我们查询年龄段从20岁到22岁之间的所有用户

UserInfoQuery userInfoQuery = new UserInfoQuery();
userInfoQuery.setStartAge(20);
userInfoQuery.setEndAge(22);
StatementUtils.find("cn.horse.demo.UserInfoMapper.findByObject", userInfoQuery);

执行的结果如下:

注意:对象作为参数时,SQL语句中使用的参数名需要与对象中的字段一致。

七、Map集合作为参数

测试:

这里我们查询年龄段从20岁到22岁之间的所有用户

Map<String, Object> parameter = new HashMap<>();
parameter.put("startAge", 20);
parameter.put("endAge", 22);
StatementUtils.find("cn.horse.demo.UserInfoMapper.findByObject", parameter);

执行的结果如下:

注意:Map作为参数时,SQL语句中使用的参数名需要能根据参数名在Map集合中取到参数值。

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

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

相关文章

Spring boot使用Kafka Java反序列化漏洞 CVE-2023-34040

文章目录 0.前言漏洞spring-kafka 介绍 1.参考文档2.基础介绍3.解决方案3.1. 升级版本3.2. 替代方案 4.Spring kafka 使用教程代码示例 0.前言 背景&#xff1a;公司项目扫描到 Spring-Kafka上使用通配符模式匹配进行的安全绕过漏洞 CVE-2023-20873 漏洞 中等风险 | 2023年8月…

android 输入法demo

背景&#xff1a; 一个简单的android输入法demo&#xff0c;支持输入png、gif&#xff0c;jpeg、webp等格式。 此示例演示如何编写一个应用程序&#xff0c;该应用程序接受使用 Commit Content API 从键盘发送的丰富内容&#xff08;例如图像&#xff09;。 用户通常希望通过表…

thingsboard 双向rpc,tb服务端下发指令,设备端接收指令并回复指令

背景 最近有朋友问,在使用thingsboard的rpc组件时,第一次进来总是报错,如下图,request timeout 这是因为当你打开这个页面时,该组件会发送一个getvalue的rpc来获取设备的当前数值,如果设备端没有收到,或者没有回应就会报这个错误。 所以为了有来有回,就必须实现设备端…

机器人制作开源方案 | 桌面级机械臂--运动控制

1. 调整总线舵机的模式 实现思路&#xff1a; 机械臂包括转台、大臂、小臂三部分&#xff0c;先设置好总线舵机每个ID的工作模式。下图是计划给舵机的各部分设置的ID号&#xff1a; 接下来为各部分设置相应的舵机模式&#xff08;见下表&#xff09;&#xff0c;并在程序里进行…

动态规划-路径问题

不同路径&#xff08;medium&#xff09; 题目链接: 62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

博流RISC-V芯片Eclipse环境搭建

文章目录 1、下载 Eclipse2、导入 bouffalo_sdk3、编译4、烧录5、使用ninja编译 之前编译是通过 VSCode 编译&#xff0c;通过手工输入 make 命令编译&#xff0c;我们也可以通过 Eclipse 可视化 IDE 来编译、烧录。 1、下载 Eclipse 至 Eclipse 官网 https://www.eclipse.org…

【JavaSE专栏91】Java如何主动发起Http、Https请求?

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN学院、蓝桥云课认证讲师。 主打方向&#xff1a;Vue、SpringBoot、微信小程序 本文讲解了如何使用…

VMware标准虚拟交换机和分布式交换机

一、虚拟交换机 初期的网络虚拟化&#xff0c;是非常狭义的概念&#xff0c;主要指的是因为计算资源虚拟化&#xff0c;每台物理宿主机上安装了虚拟化软件&#xff0c;同时会部署了虚拟交换机&#xff0c;负责物理机上面承载的VM&#xff08;虚拟机&#xff09;之间与对外的通…

【Rust日报】2023-08-28 WASM 微运行时与 Rust

WASM 微运行时与 Rust 传统上&#xff0c;微控制器只能运行 C 代码。固件开发人员通常会使用 Eclipse 基于 IDE 以及定制的编译器工具链来编译代码。但是&#xff0c;MicroPython 最近变得流行起来。RaspberryPi Pico、ExpressIf 的 ESP32 是一些对 MicroPython 支持相当不错的…

直流电源开关TMI6240I/6250I——解决分立MOS开关易失效,安全更可靠

互联网时代带动了电子产品行业的发展&#xff0c;人们对电子产品的需求越来越高&#xff0c;TV、显示器、笔记本、智能家居、平板等产品只增不减&#xff0c;为生活提供了极大的便利。与此同时&#xff0c;随着拥有的电子产品增多也带来了不少”烦恼“——产品越多&#xff0c;…

标杆项目,获奖!

近日&#xff0c;第二届“光华杯”千兆光网应用创新大赛东部大区赛决赛在上海举行。天翼物联、南京港华燃气联合申报的“千兆光网融物赋智&#xff0c;赋能大型城市燃气安全及智慧运营”项目荣获三等奖并晋级全国总决赛。 今年以来&#xff0c;中国信息通信研究院联合中国通信标…

基于RabbitMQ的模拟消息队列之二---创建项目及核心类

一、创建项目 创建一个SpringBoot项目&#xff0c;环境&#xff1a;JDK8&#xff0c;添加依赖&#xff1a;Spring Web、MyBatis FrameWork(最主要&#xff09; 二、创建核心类 1.项目分层 2.核心类 在mqserver包中添加一个包&#xff0c;名字为core&#xff0c;表示核心类…

2023最新Python重点知识万字汇总

这是一份来自于 SegmentFault 上的开发者 二十一 总结的 Python 重点。由于总结了太多的东西&#xff0c;所以篇幅有点长&#xff0c;这也是作者"缝缝补补"总结了好久的东西。 **Py2 VS Py3** * print成为了函数&#xff0c;python2是关键字* 不再有unicode对象…

赢得明星代言:邀请明星成为品牌代言人的步骤与注意事项

在品牌推广和营销中&#xff0c;与明星合作做代言人是一种常见的策略&#xff0c;可以有效地提升品牌知名度和形象。然而&#xff0c;找明星做代言人并不是一件轻松的事情&#xff0c;需要慎重考虑和策划。媒介易拥有3000多位一二线明星合作资源&#xff0c;为您提供专业的明星…

基于java+springboot+vue的简历系统

​ 系统介绍&#xff1a; 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;简历系统当然也不能排除在外。简历系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方…

基于Java的基数排序(详述)

基于Java的基数排序&#xff08;详述&#xff09; 原理介绍Java实现文献参考 原理介绍 一、什么是基数排序 &#xff08;1&#xff09;通过键值得各个位的值&#xff0c;将要排序的元素分配至一些桶中&#xff0c;达到排序的作用 &#xff08;2&#xff09;基数排序法是属于稳…

Mybatis1.3 查询详情

1.3 查询详情 1.3.1 编写接口方法1.3.2 编写SQL语句1.3.3 编写测试方法1.3.4 参数占位符1.3.5 parameterType使用1.3.6 SQL语句中特殊字段处理 有些数据的属性比较多&#xff0c;在页面表格中无法全部实现&#xff0c;而只会显示部分&#xff0c;而其他属性数据的查询可以通过 …

常用免费 API 接口推荐与分享,收藏备用

写在最前 各类免费 API 接口整理&#xff0c;主要是 LuckyCola上和其他各类开放平台上的一些&#xff0c;有需要的赶紧收藏备用。 一、LuckyCola免费api系列: 官网地址:LuckyCola 免费图床 | 智能对话机器人AI | 网站监控与免费API费图床是一款提供高质量图片上传与分享的平…

风丘方案助力车企升级 解决“国六”标准新难题

一 背景 尾气排放指标是衡量汽车质量和品质的主要指标之一&#xff0c;且汽车的尾气排放必须达到相应的标准才准许出厂&#xff0c;因此&#xff0c;对汽车排放的尾气进行检测是汽车生产过程的重要环节。汽车尾气检测过程是在排放实验室里进行的&#xff0c;这需要模拟汽车实际…

MySQL8.0.30一主两从复制与配置(一)

MySQL8.0.30一主两从复制与配置(一)_蜗牛杨哥的博客-CSDN博客 MySQL8.xx一主两从复制安装与配置 MySQL8.XX随未生成随机密码解决方案 本文主要对: MySQL8.xx安装与配置 的完善与补充 一: 搭建环境 主机IP 端口 节点备注192.168.1.100 …