目录

Mybatis获取参数值的两种方式

mybatis获取参数值的情况

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

mapper.xml文件

mapper接口文件

测试代码

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

Mapper接口

Mapper.xml

测试代码

错误收集

解决方法

1)使用arg1,arg0,或者param1,param2

3.修改mapper接口参数为map

mapper接口文件

mapper.xml文件

map测试代码

测试结果

4.通过对象获取参数值

mapper接口

mapper.xml文件

测试代码

测试结果

5.通过@param注解获取

mapper接口

mapper.xml文件

测试代码

测试结果

附加

1)完整的UserMapper接口

2)完整的UserMapper.xml

3)完整的测试代码

4)User实体

5)所用sql文件


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云盘

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐