当前位置: 首页 > news >正文

MyBatis之参数传递

 在mybatis中进行参数传递时,在最底层的源码中都会创建一个Map类对参数进行参数封装,例如在对多个参数进行传递时,

package com.itheima.pojo;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String gender;
    private String addr;

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

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

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

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}
<select id="select" resultType="com.itheima.pojo.User">
        select *
        from tb_User
        where
            username=#{username}
        and password=#{password}
    </select>

 如上面代码,在我们进行多参数传递时,此时在底层代码运行中会先创造一个map类对其进行封装,传递参数中的,参数一(username)所对应的参数名为arg0或param1,代表着我们此时在sql语句中可以通过arg0或param1知道的我们实际想要的参数(username)

package com.itheima;

import com.itheima.mapper.BrandMapper;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.Brand;
import com.itheima.pojo.User;
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.Test;

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

public class UserMappTest {
    @Test
    public void testSelect() throws IOException {
        String username="zhangsan";
        String password="123";
        //1.加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession=sqlSessionFactory.openSession();
//        //3.执行sqL
//        List<User> users=sqlSession.selectList("test.selectAll");
        //3.1 获取UserMapper接口的代理对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=userMapper.select(username,password);
        System.out.println(user);
        //4.释放资源
        sqlSession.close();
    }
}

 

如我下面对代码如果没有对相应参数进行@param注解,因为传递的参数username在map封装类中的所对应的参数名为arg0或param1,所当我在sql语句username=#{username}中想要通过键名#{username}找到相应的username值是找不到的会有以下报错

现在我对代码进行改编

<select id="select" resultType="com.itheima.pojo.User">
        select *
        from tb_User
        where
            username=#{arg0}
        and password=#{arg1}
    </select>

结果如下

但是在实际中如果,这样的键名使用起来并不是很方便,因此我们进行@param注释

User select(@Param("username") String username, @Param("password") String password);

运行结果如下:

 此时可以知道map封装类中对应于password和username的键名因为@param注释进行了改编,当然此时也要改变sql语句中的键名

运行结果如下

 很nice!!!

这样就可以让代码变得简洁易懂

一下时MyBatis对不同参数进行参数封装的键名

MyBatis 参数封装:

- 单个参数:
1.POJ0类型:直接使用,属性名和参数占位符名称一致

2.Map集合:直接使用,键名和参数占位符名称一致

3.Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名        

        map.put("arg",collection集合);

        map.put("collection",collection集合);

4.List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0"list集合);

map.put("collection",list集合);map.put("list"list集合);

5.Array:封装为Map集合,可以使用Param注解,替换Map集合中默认的arg键名

map.put("arg"数组);

map.put("array",数组);

6.其他类型:直接使用

- 多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("agr1",参数值2)
------@Param("username")
map.put("username",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("agr1",参数值2)

相关文章:

  • 网络故障排查指南:分治法与排除法结合的分层诊断手册
  • Diamond软件的使用--(5)查看原语
  • 【HTTP 传输过程中的 cookie】
  • 基于springboot和vue项目使用docker部署项目到服务器
  • 【DeepSeek 学c++】dynamic_cast 原理
  • Linux驱动学习笔记(六)
  • HAL库中串口中断开启
  • 23种设计模式(扩展)
  • Elasticsearch 倒排索引 和 正排索引
  • 健康养生:拥抱生活,从呵护身心开始
  • [OpenCV】相机标定之棋盘格角点检测与绘制
  • 集成学习(Ensemble Learning)基础知识2
  • 2025-03-21 Unity 网络基础3——TCP网络通信准备知识
  • 对比4款远程控制软件,画质、性能、功能谁全面?
  • Matplotlib
  • [特殊字符] 2025蓝桥杯备赛Day10——B2120 单词的长度
  • 高效字符串匹配:KMP算法
  • vscode连接本地mysql数据库
  • AIGC智能体(Ai星图)
  • vue-cli如何正确关闭prefetchprefetch和preload
  • 玉渊谭天丨卢拉谈美国降低对华关税:中国的行动捍卫了主权
  • 网约车座椅靠背张贴“差评者得癌症”,如祺出行:未收到投诉无法处理
  • “11+2”复式票,宝山购彩者领走大乐透1170万头奖
  • 成都警方通报:8岁男孩落水父母下水施救,父亲遇难
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 欧元区财长会讨论国际形势及应对美国关税政策