MyBatis传递多参数进行查询的四种方法

假设t_user_test表数据结构及数据如下,我们需要对此表按user_name和sex进行查询,有如下几种方式:

 

方式一:顺序传递参数法

1. Mapper映射文件写法参考如下代码

    <select id="selectUserByUsernameAndSex"
        resultType="TUser">
        select * from t_user_test where user_name = #{arg0} and sex = #{arg1}
    </select>

不同版本,传递的参数名称不同,低版本用 #{0}。如果把上面的{arg0}更改为{userName},则程序报错,内容如下:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'useName' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'useName' not found. Available parameters are [arg1, arg0, param1, param2]

说明:本例已经在MyBatis配置文件中,用了别名映射,下同。

    <typeAliases> 
       <typeAlias alias="TUser" type="com.clzhang.mybatis.entity.TUser"/> 
    </typeAliases> 

2. 接口文件写法参考如下代码

    List<TUser> selectUserByUsernameAndSex(String userName, Integer sex);

3. 调用者按如下方式调用

        List<TUser> users = mapper.selectUserByUsernameAndSex("张三", 0);
        for (TUser tUser : users) {
            System.out.println(tUser);
        }

4. 结果输出

TUser(id=4, userName=张三, realName=假张三, sex=0, mobile=13900009999, email=false@163.com, note=哈哈)

此种方式的缺点是参数不够直观,小型项目或许可以使用。

二、@Param注解传递参数法

1. Mapper映射文件写法参考如下代码

    <select id="selectUserByUsernameAndSex"
        resultType="TUser">
        select * from t_user_test where user_name = #{userName} and sex = #{sex}
    </select>

2. 接口文件写法参考如下代码

import org.apache.ibatis.annotations.Param;
    List<TUser> selectUserByUsernameAndSex(@Param("userName") String userName, @Param("sex") Integer sex);

调用者其它不变。此种方式优点是参数名称比较直观,推荐使用。

三、Map方式传递参数法

1. Mapper映射文件写法参考如下代码

    <select id="selectUserByUsernameAndSex" parameterType="java.util.Map"
        resultType="TUser">
        select * from t_user_test where user_name = #{userName} and sex = #{sex}
    </select>

2. 接口文件写法参考如下代码 

    List<TUser> selectUserByUsernameAndSex(Map<String, Object> params);

3. 调用者按如下方式调用

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("userName", "张三");
        params.put("sex", 0);
        List<TUser> users = mapper.selectUserByUsernameAndSex(params);
        for (TUser tUser : users) {
            System.out.println(tUser);
        }

4. 结果输出

TUser(id=4, userName=张三, realName=假张三, sex=0, mobile=13900009999, email=false@163.com, note=哈哈)

四、Java对象传递参数法

1. Mapper映射文件写法参考如下代码

    <select id="selectUserByUsernameAndSex" parameterType="TUser"
        resultType="TUser">
        select * from t_user_test where user_name = #{userName} and sex = #{sex}
    </select>

2. 接口文件写法参考如下代码 

    List<TUser> selectUserByUsernameAndSex(TUser user);

3. 调用者按如下方式调用

        TUser queryUser = new TUser();
        queryUser.setUserName("张三");
        queryUser.setSex((byte)0);
        List<TUser> users = mapper.selectUserByUsernameAndSex(queryUser);
        for (TUser tUser : users) {
            System.out.println(tUser);
        }

4. 结果输出

TUser(id=4, userName=张三, realName=假张三, sex=0, mobile=13900009999, email=false@163.com, note=哈哈)

 

posted @ 2021-08-20 15:26  那些年的事儿  阅读(1847)  评论(0编辑  收藏  举报