mybatis获取参数的5种情况

news2024/12/24 2:22:13

Mybatis获取参数值的两种方式

mybatis获取参数值的方式有两种: ${}  和  #{}

  1. ${}  这个的本质就是字符串拼接
    1. 这个无法避免sql注入攻击  
  2. #{}  这个的本质就是占位符(尽量使用 #{} 的方式)
    1. 可以避免sql注入

mybatis获取参数值的情况

1.mapper接口方法的参数为单个字面量类型

        通过${}  和  #{} 以任意名称获取参数值, 但是${} 需要注意单引号的问题

mapper.xml文件
<!---->
<select id="queryUserById" resultType="org.xiji.enty.User">
    <!--通过 #{}-->
    <!-- select * from user where id=#{id} -->

    <!--单个的名字可以随意 -->
    <!-- select * from user where id=#{sdasd}  -->

    <!--使用${id} 也是可以的但是要注意 ${}中的单引号拼接问题-->
    select * from user where id=${id}


</select>
mapper接口文件
/**
 * 通过用户id查询数据
 */
User queryUserById(int id);

测试代码
/**
 *    单一类型变量取值
 *          #{}
 *          ${} 这个需要注意 单引号问题
 */
@Test
public void test2(){
    User user1 = userMapper.queryUserById(1);

    System.out.println(user1.toString());


}

2.mapper接口方法的参数为多个时

当mapper接口的参数为多个时,名字随意写,或者与接口名对应会爆错

        org.apache.ibatis.binding.BindingException: Parameter

Mapper接口
/**
 * 通过用户名和密码查询数据
 */
User queryUserInfoBYUsernameAndPassword(String username,String password);
Mapper.xml
<!--通过用户名和密码查询数据-->
<select id="queryUserInfoBYUsernameAndPassword" resultType="org.xiji.enty.User">
    select * from user where username=#{username} and password=#{password}
</select>
测试代码
/**
 *  多个参数变量取值
 */
@Test
public void test3(){

    User xiji = userMapper.queryUserInfoBYUsernameAndPassword("xiji", "123456");
    System.out.println(xiji.toString());
}

错误收集

org.mybatis.spring.MyBatisSystemException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
###

    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:99)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347)
    at jdk.proxy2/jdk.proxy2.$Proxy20.selectOne(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)
    at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
    at jdk.proxy2/jdk.proxy2.$Proxy21.queryUserInfoBYUsernameAndPassword(Unknown Source)
    at MyBatisTest.test3(MyBatisTest.java:42)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
    at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:210)
    at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:46)
    at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:115)
    at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:225)
    at org.apache.ibatis.executor.CachingExecutor.createCacheKey(CachingExecutor.java:149)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333)
    ... 10 more

解决方法
1)使用arg1,arg0,或者param1,param2

        #{} ${} 以键取值 

Cause: org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]

<!--通过用户名和密码查询数据-->
<select id="queryUserInfoBYUsernameAndPassword" resultType="org.xiji.enty.User">
    select * from user where username=#{arg0} and password=#{arg1}
</select>

3.修改mapper接口参数为map

        通过mapper集合传入的值,我们可以自定义键,通过键取值

注:这个方式需要你知道mapper.xml文件中自定定义的键值

mapper接口文件
/**
 * 通过map集合传入值
 */
User queryUserInfoByMap(Map<String,Object> map);

mapper.xml文件
<!--通过map集合传值,虽然可以自定义键,但是需要知道xml的键名-->
<select id="queryUserInfoByMap" resultType="org.xiji.enty.User">
    select * from user where username=#{username} and password=#{password}
</select>

map测试代码

/**
     * 以map集合为例
     */
    @Test
    public void testByMap(){
        HashMap<String, Object> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("username","zs");
        objectObjectHashMap.put("password","456789");
        User xiji = userMapper.queryUserInfoByMap(objectObjectHashMap);
        System.out.println(xiji.toString());

    }

测试结果

4.通过对象获取参数值

mapper接口
/**
 *  通过对象获取值
 */
User queryUserInfoByUser(User user);
mapper.xml文件
<!--通过对象获取值-->
<select id="queryUserInfoByUser" resultType="org.xiji.enty.User">
    select * from user where username=#{username} and password=#{password}
</select>
测试代码
/**
 * 通过对象获取值
 */
@Test
public void testByUser(){
    User user = new User();
    user.setUsername("xiji");
    user.setPassword("123456");
    User xiji = userMapper.queryUserInfoByUser(user);
    System.out.println(xiji.toString());
}

测试结果

5.通过@param注解获取

@Param 注解 相当于自定义键  ===》 可以通过键名取去取值

mapper接口
/**
 * 
 * 通过param注解访问
 */

User queryUserInfoByParam(@Param("username") String name,@Param("password") String password);
mapper.xml文件
<!--通过param注解 获取值-->
<select id="queryUserInfoByParam" resultType="org.xiji.enty.User">
    select * from user where username=#{username} and password=#{password}
</select>
测试代码
/**
 * 通过param注解获取参数
 */
@Test
public void testByParam(){
    User xiji = userMapper.queryUserInfoByParam("xiji","123456");
    System.out.println(xiji.toString());
}
测试结果

附加

1)完整的UserMapper接口

package org.xiji.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xiji.enty.User;

import java.util.Map;

/**
 * userMapper
 */
@Mapper
public interface UserMapper {
    /**
     * 增加用户
     */
    int addUser(@Param("user") User user);

    /**
     * 通过用户id查询数据
     */
    User queryUserById(int id);

    /**
     * 通过用户名和密码查询数据
     */
    User queryUserInfoBYUsernameAndPassword(String username,String password);
    /**
     * 通过map集合传入值
     */
    User queryUserInfoByMap(Map<String,Object> map);

    /**
     *  通过对象获取值
     */
    User queryUserInfoByUser(User user);

    /**
     *
     * 通过param注解访问
     */

    User queryUserInfoByParam(@Param("username") String name,@Param("password") String password);
}

2)完整的UserMapper.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="org.xiji.mapper.UserMapper">


    <insert id="addUser">

        insert into user(username,password,userInfo) values(#{user.username},#{user.password},#{user.userInfo})
    </insert>

    <!---->
    <select id="queryUserById" resultType="org.xiji.enty.User">
        <!--通过 #{}-->
        <!-- select * from user where id=#{id} -->

        <!--单个的名字可以随意 -->
        <!-- select * from user where id=#{sdasd}  -->

        <!--使用${id} 也是可以的但是要注意 ${}中的单引号拼接问题-->
        select * from user where id=${id}


    </select>
    <!--通过用户名和密码查询数据-->
    <select id="queryUserInfoBYUsernameAndPassword" resultType="org.xiji.enty.User">
        select * from user where username=#{arg0} and password=#{arg1}
    </select>

    <!--通过map集合传值,虽然可以自定义键,但是需要知道xml的键名-->
    <select id="queryUserInfoByMap" resultType="org.xiji.enty.User">
        select * from user where username=#{username} and password=#{password}
    </select>
    <!--通过对象获取值-->
    <select id="queryUserInfoByUser" resultType="org.xiji.enty.User">
        select * from user where username=#{username} and password=#{password}
    </select>
    <!--通过param注解 获取值-->
    <select id="queryUserInfoByParam" resultType="org.xiji.enty.User">
        select * from user where username=#{username} and password=#{password}
    </select>
</mapper>

3)完整的测试代码

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.xiji.enty.User;
import org.xiji.mapper.UserMapper;

import java.util.HashMap;
import java.util.Map;

@SpringJUnitConfig(locations = {"classpath:springConfig.xml"})
public class MyBatisTest {

    @Autowired
    UserMapper userMapper;

    @Test
    public void test(){
        User user = new User();
        user.setUsername("xiji");
        user.setPassword("123456");
        user.setUserInfo("hello world");
        userMapper.addUser(user);
    }

    /**
     *    单一类型变量取值
     *          #{}
     *          ${} 这个需要注意 单引号问题
     */
    @Test
    public void test2(){
        User user1 = userMapper.queryUserById(1);

        System.out.println(user1.toString());


    }

    /**
     *  多个参数变量取值
     */
    @Test
    public void test3(){

        User xiji = userMapper.queryUserInfoBYUsernameAndPassword("xiji", "123456");
        System.out.println(xiji.toString());
    }
    /**
     * 以map集合为例
     */
    @Test
    public void testByMap(){
        HashMap<String, Object> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("username","zs");
        objectObjectHashMap.put("password","456789");
        User xiji = userMapper.queryUserInfoByMap(objectObjectHashMap);
        System.out.println(xiji.toString());

    }

    /**
     * 通过对象获取值
     */
    @Test
    public void testByUser(){
        User user = new User();
        user.setUsername("xiji");
        user.setPassword("123456");
        User xiji = userMapper.queryUserInfoByUser(user);
        System.out.println(xiji.toString());
    }

    /**
     * 通过param注解获取参数
     */
    @Test
    public void testByParam(){
        User xiji = userMapper.queryUserInfoByParam("xiji","123456");
        System.out.println(xiji.toString());
    }
}

4)User实体

package org.xiji.enty;

public class User {
    private  int id;
    private String username;
    private String password;
    private String userInfo;

    public User() {
    }

    public User(int id, String username, String password, String userInfo) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.userInfo = userInfo;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(String userInfo) {
        this.userInfo = userInfo;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", userInfo='" + userInfo + '\'' +
                '}';
    }
}

5)所用sql文件

/*
 Navicat Premium Data Transfer

 Source Server         : mybatis
 Source Server Type    : MySQL
 Source Server Version : 80025
 Source Host           : localhost:3306
 Source Schema         : mybatis

 Target Server Type    : MySQL
 Target Server Version : 80025
 File Encoding         : 65001

 Date: 13/09/2024 22:45:23
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户名字',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户密码',
  `userInfo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户信息',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

user.sql官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘

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

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

相关文章

solidity-20-sendeth

发送ETH 这章的标题让我觉得奇怪&#xff0c;因为先前我也发送ETH&#xff0c;如上一篇提到的recieve和fallback函数。 重现了教程中的代码 // SPDX-License-Identifier: MIT pragma solidity ^0.8.21;contract sendeth{// 这个事件是为了打log,记录收到的eth和剩余的gas fee…

echarts中tooptips提示框超出了怎么解决

我们在制作echarts表格时&#xff0c;有时候会遇到提示框内容较多&#xff0c;会让提示框超出&#xff0c;展示不全数据&#xff0c;如下&#xff1a; 这种情况下需要在tooltips下增加一些属性&#xff1a; 1.confine: true&#xff1a;这个配置的作用是让提示框&#xff08;t…

Docker笔记-容器数据卷

Docker笔记-容器数据卷 docker的理念将运行的环境打包形成容器运行&#xff0c;运行可以伴随容器&#xff0c;但是我们对数据的要求是希望持久化&#xff0c;容器 之间可以共享数据&#xff0c;Docker容器产生的数据&#xff0c;如果不通过docker commit生成新的镜像&#xf…

大数据新视界 --大数据大厂之数据挖掘入门:用 R 语言开启数据宝藏的探索之旅

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

类型转换等 面试真题

题目1 请问哪个结果为NaN A. 123null B. 123‘1’ C. 123/0 D. 123undefined 在这四个表达式中&#xff0c;只有D. 123 undefined 的结果是 NaN&#xff0c;原因如下&#xff1a; A. 123 null 结果是&#xff1a;123原因&#xff1a;null 在数值运算中会被自动转换为 0&a…

mac上什么压缩软件没有广告,苹果电脑解压软件BetterZip有广告吗

mac上有很多压缩软件&#xff0c;可以帮助用户压缩或解压各种格式的文件&#xff0c;如zip、rar、7z等。但是&#xff0c;有些压缩软件会在使用过程中弹出广告&#xff0c;影响用户的体验和效率。那么&#xff0c;mac上什么压缩软件没有广告呢&#xff1f;苹果电脑解压软件Bett…

一步步教你利用大模型开发个性化AI应用,告别‘人工智障’!

为了回答这个问题&#xff0c;我用说人话的方式拿gpts创建了一个“我”&#xff0c;然后让她来回答这个问题。&#xff08;确认过眼神&#xff0c;我是懂套娃的&#xff09; 接下来我会先展示下整个定制过程&#xff1b;然后我们一起看一下她能把题答到什么程度&#xff1b;最后…

UnrealEngine 打包Android平台应用

虚幻引擎 支持将项目发布到 安卓&#xff08;Android&#xff09; 移动设备上&#xff0c;并且提供了若干功能帮你将项目发布到 谷歌游戏商店。本节包含了如何设置Android开发环境、如何使用Android功能和服务、以及如何为发布游戏做准备相关的指南。 当前SDK要求 当前UE版本…

JavaSE篇之内部类和图书系统

1.内部类(类中类) 在Java中&#xff0c;将一个类定义在另一个类内部&#xff0c;前者称为内部类&#xff0c;后者称为外部类。 注意事项&#xff1a; 1. 1.静态内部类&#xff08;被static修饰的内部类&#xff09; 1.在静态内部类的方法中不能直接引用外部类的成员变量&…

中国农业银行——轻量式云原生应用平台(轻云平台)

2021年10月&#xff0c;中国人民银行等联合发布了《关于规范金融业开源技术应用与发展的意见》&#xff08;银办发〔2021〕146 号&#xff09;&#xff0c;规范金融机构合理应用开源技术&#xff0c;提高应用水平和自主可控能力&#xff0c;促进开源技术健康可持续发展。前期&a…

幻灯片放映过程中如何调出激光笔

1、第一步先打开制作好的幻灯片 2、进行幻灯片放映 3、看到上图最下面一行&#xff0c;减号左方的小杯进入幻灯片播放 4、幻灯片下方有个放映&#x1f58a;&#xff0c;点击一下 5、选择激光笔就好啦

基于Java的建筑节能监测系统+公共建筑能耗监测系统+建筑能耗监测系统+节能监测系统+能源管理系统

建筑节能监测系统公共建筑能耗监测系统建筑能耗监测系统节能监测系统能耗监测建筑能耗监测能耗分析能耗管理能耗预测能耗监控能耗监测平台建筑能耗 介绍 建筑节能监测系统是基于计算机网络、物联网、大数据和数据可视化等多种技术融合形成的一套节能监测系统。 系统实现了对建…

el-table表格的展开行,初始化的时候展开哪一行+设置点击行可展开功能

效果&#xff1a; 表格展开行官网使用&#xff1a; 通过设置 type"expand" 和 Scoped slot 可以开启展开行功能&#xff0c;el-table-column 的模板会被渲染成为展开行的内容&#xff0c;展开行可访问的属性与使用自定义列模板时的 Scoped slot 相同。 但是这种方法…

开源 TTS 模型「Fish Speech」1.4 发布;GameGen-O :生成开放世界游戏视频模型丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

计算机网络:概述 - 性能指标

目录 一. 速率 二. 带宽 三. 吞吐量 四. 时延 五. 时延带宽积 六. 往返时间RTT 七. 利用率 八. 丢包率 此博客介绍计算机网络中的性能指标&#xff0c;性能指标从不同的角度来度量计算机网络的性能。下面介绍几个常用的性能指标&#xff1a; 一. 速率…

【TabBar嵌套Navigation案例-cell重用 Objective-C语言】

一、我们来说这个cell重用(重复使用)的问题啊 1.我们这个比分直播推送页面, 这个里边呢,现在这个cell,涉及到两个样式,上面呢,是Default的,下面呢,是Value1的,然后,我们在这个里边啊,我们每一组就一个cell啊,然后呢,我把这个组,多给它复制几份儿,现在是三个组…

OpenSSH后门从入门到应急响应与加固

目录 1. Openssh与后门介绍 1.1 Openssh介绍 1.2 Openssh后门介绍 2. 实战演练 2.1 查看版本,注意V是大写的 2.2 下载SSH配置文件 2.3 安装 2.4、修改后⻔密码和⽂件记录 2.5、修改版本号为原本的版本号(伪装openssh) 2.6、修改/etc/ssh中的key 2.7、安装所需环境与…

【黑神话】无脑过大头怪(幽魂)教程,手残也能打过关!

在《黑神话悟空》这款扣人心弦的动作角色扮演游戏中&#xff0c;玩家将面对众多考验操作与策略的Boss战。其中&#xff0c;大头幽魂作为玩家早期就会遇到的挑战之一&#xff0c;其独特的战斗机制和技能组合&#xff0c;对新手玩家而言无疑是一次不小的考验。今天&#xff0c;就…

AI 场景下如何构建运维的标准化能力?SOMA 智能运维计划发布 | 2024 龙蜥大会

8 月 30 日&#xff0c;2024 龙蜥操作系统大会&#xff08;OpenAnolis Conference&#xff09;在北京盛大召开。 与此同时&#xff0c;由龙蜥社区运营委员会副主席、龙腾计划生态负责人金美琴&#xff0c;阿里云智能集团高级技术专家毛文安&#xff0c;云杉网络 VP 向阳联合出品…

Java--常见的接口--Comparable

String类型的compareTo方法&#xff1a; 在String引用中&#xff0c;有一个方法可以比较两个字符串的大小&#xff1a; 和C语言中是一样的&#xff0c;两个字符串一个字符一个去比较。 那么这个方法是怎么实现的呢&#xff1f; 其实就是一个接口&#xff1a;Comparable接口里…