假设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=哈哈)