zoukankan      html  css  js  c++  java
  • mybatis会对多参数方法进行特殊处理

    例如:查询id=1,name=tom的一条数据

    查询接口:

    User getUserByIdAndName(Integer id,String name);

    //
    <?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">
    <!--
    namespace:命名空间,指定为接口的全类名
    selectUserById:唯一标识
    resultType:返回值类型
    -->
    <mapper namespace="com.yunqing.mybatis.dao.UserMapper">
    //这种写法是错误的,mybatis会根据多个参数值封装一个map,在map的key中根据param1....paramN取值或者根据参数索引取值arg0....arg(N-1)
    <!--
       <select id="getUserByIdAndName" resultType="com.yunqing.mybatis.bean.User"> select * from t_user where id = #{id} and name = #{name} </select>
    -->

    //正确写法 1.根据参数索引
       <select id="getUserByIdAndName" resultType="com.yunqing.mybatis.bean.User">
            select * from t_user where id = #{arg0} and name = #{arg1}
        </select>
    //正确写法 2.根据参数param
      
       <select id="getUserByIdAndName" resultType="com.yunqing.mybatis.bean.User">
            select * from t_user where id = #{param1} and name = #{param2}
        </select>
    </mapper>

    建议使用的方法是

    <select id="getUserByIdAndName" resultType="com.yunqing.mybatis.bean.User">
            select * from t_user where id = #{id} and name = #{name}
        </select>
    这种方法虽然是错误的,但是只要在dao层使用命名参数指定参数名,就是最正确,最明确,最建议的写法:
    User getUserByIdAndName(@Param("id")Integer id, @Param("name")String name);

    也可以直接传一个pojo对象,或者一个Map,或者自定义To数据传输对象

     

    1.map参数

    xml中sql

    <select id="getUserByMap" resultType="com.yunqing.mybatis.bean.User">
            select * from t_user where id = #{id} and name = #{name}
        </select>

    dao

    User getUserByMap(Map<String,Object> map);

    test.java

    @Test
        public void getUserByMap() throws IOException {
            //从xml中获取sqlSessionFactory
            String resource = "conf/mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            //获取sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            Map<String,Object> map = new HashMap<>();
            map.put("id",1);
            map.put("name","tom");
            User user = userMapper.getUserByMap(map);
            System.out.println(user);
            sqlSession.close();
        }

  • 相关阅读:
    洛谷1894 [USACO4.2]完美的牛栏The Perfect Stall
    洛谷2417 课程
    洛谷2860 [USACO06JAN]冗余路径Redundant Paths
    洛谷1983 车站分级
    BZOJ1178或洛谷3626 [APIO2009]会议中心
    BZOJ1179或洛谷3672 [APIO2009]抢掠计划
    CF Round #516 (Div. 2, by Moscow Team Olympiad)
    洛谷1262 间谍网络
    NOI导刊 2018河南郑州游记
    BZOJ1001或洛谷4001 [BJOI2006]狼抓兔子
  • 原文地址:https://www.cnblogs.com/yunqing/p/8084880.html
Copyright © 2011-2022 走看看