1. 程式人生 > >mybatis學習教程——@Param註解使用

mybatis學習教程——@Param註解使用

當介面引數比較多的時候,可以使用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這個介面方法就能正常被呼叫


但是這種寫法程式碼可讀性很差,不利於維護,這時可以使用@Param註解
將介面方法給為

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


總結:
     給引數加上@Param註解後,mybatis會自動將引數封裝成map型別,@Param註解的值@Param("loginName")作為map的key,在xml中就可以使用註解的值來使用引數。當時當只有一個引數時,我們並沒有使用註解,code也能執行,這是因為在只有一個引數時,mybatis不關心這個引數叫什麼名字就會直接把這個唯一的引數值拿來使用。