mybatis学习教程——@Param注解使用

时间:2023-01-29 22:04:13

当接口参数比较多的时候,可以使用JavaBean来封装参数,当参数比较少的情况,可以使用Map类型或者使用@Param注解

1.userMapper接口类

package com.aruisi.mybatis.mapper;

import com.aruisi.mybatis.dto.UserDTO;

public interface UserMapper {
	public UserDTO selectUserByNameAndSex(String loginName,Integer sex);
}
2.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="com.aruisi.mybatis.mapper.UserMapper">
	<select id="selectUserByNameAndSex" resultType="com.aruisi.mybatis.dto.UserDTO">
		SELECT  id,
				login_name AS loginName,
				sex,
				age,
				create_time AS createTime 
		FROM `user` WHERE login_name=#{loginName} and sex=#{sex}
	</select>
</mapper>
3.测试方法
package com.aruisi.mybatis.test;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.aruisi.mybatis.dto.UserDTO;
import com.aruisi.mybatis.mapper.UserMapper;

public class TestSelectUserByNameAndSex {
	public static void main(String[] args) {
		/**
		 * java 7增强了try语句的功能,圆括号可以声明、初始化一个或多个资源(必须在程序结束时显示关闭的资源)
		 * try语句在该语句结束时会自动关闭这些资源
		 */
		try (
			//读取配置文件信息
			Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
			//参数为true,设置事务是自动提交
			SqlSession sqlSession = new SqlSessionFactoryBuilder().build(reader).openSession(true);
		){
			UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
			UserDTO user = userMapper.selectUserByNameAndSex("王五", 1);
			System.out.println("============="+user.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
测试结果会报如下错误:
Parameter 'loginName' not found. Available parameters are [1, 0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'loginName' not found. Available parameters are [1, 0, param1, param2]
报这个错误的原因是mybatis默认可用的xml参数只用  [1, 0, param1, param2], 这四个参数都是mybatis根据参数位置自定义的名字,这时将xml中的loginName改为#{0}或者#{param1},将sex改为#{1}或者#{param2},selectUserByNameAndSex这个接口方法就能正常被调用
mybatis学习教程——@Param注解使用
但是这种写法代码可读性很差,不利于维护,这时可以使用@Param注解
将接口方法给为

public UserDTO selectUserByNameAndSex(@Param("loginName")String loginName,@Param("sex")Integer sex);

mybatis学习教程——@Param注解使用
总结:
     给参数加上@Param注解后,mybatis会自动将参数封装成map类型,@Param注解的值 @Param("loginName")作为map的key,在xml中就可以使用注解的值来使用参数。当时当只有一个参数时,我们并没有使用注解,code也能运行,这是因为在只有一个参数时,mybatis不关心这个参数叫什么名字就会直接把这个唯一的参数值拿来使用。