1. 程式人生 > >Mybatis實現Mapper動態代理方式

Mybatis實現Mapper動態代理方式

一、實現原理

        Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),由Mybatis框架根據介面定義建立介面的動態代理物件,代理物件的方法體同上邊Dao介面實現類方法。


        Mapper介面開發需要遵循以下規範:
                1、Mapper.xml檔案中的namespace與mapper介面的類路徑相同。
                2、  Mapper介面方法名和Mapper.xml中定義的每個statement的id相同 
                3、Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql 的parameterType的型別相同
                4、Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同

二、Mapper.xml對映檔案

         定義mapper對映檔案UserMapper.xml(內容同Users.xml),需要修改namespace的值為 UserMapper介面路徑。將UserMapper.xml放在classpath 下mapper目錄 下。

<?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="cn.itcast.mybatis.mapper.UserMapper">
<!-- 根據id獲取使用者資訊 -->
	<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
		select * from user where id = #{id}
	</select>
<!-- 自定義條件查詢使用者列表 -->
	<select id="findUserByUsername" parameterType="java.lang.String" 
			resultType="cn.itcast.mybatis.po.User">
	   select * from user where username like '%${value}%' 
	</select>
<!-- 新增使用者 -->
	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
	<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
		select LAST_INSERT_ID() 
	</selectKey>
	  insert into user(username,birthday,sex,address) 
	  values(#{username},#{birthday},#{sex},#{address})
	</insert>

</mapper>

三、Mapper.java(介面檔案)

/**
 * 使用者管理mapper
 */
Public interface UserMapper {
	//根據使用者id查詢使用者資訊
	public User findUserById(int id) throws Exception;
	//查詢使用者列表
	public List<User> findUserByUsername(String username) throws Exception;
	//新增使用者資訊
	public void insertUser(User user)throws Exception; 
}

         介面定義有如下特點:
                  1、Mapper介面方法名和Mapper.xml中定義的statement的id相同
                  2、Mapper介面方法的輸入引數型別和mapper.xml中定義的statement的parameterType的型別相同
                  3、Mapper介面方法的輸出引數型別和mapper.xml中定義的statement的resultType的型別相同

四、載入UserMapper.xml檔案

         修改sqlMapConfig.xml檔案:

 <!-- 載入對映檔案 -->
  <mappers>
    <mapper resource="mapper/UserMapper.xml"/>
  </mappers>

五、測試

Public class UserMapperTest extends TestCase {

	private SqlSessionFactory sqlSessionFactory;
	
	protected void setUp() throws Exception {
		//mybatis配置檔案
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//使用SqlSessionFactoryBuilder建立sessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	
	Public void testFindUserById() throws Exception {
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲取mapper介面的代理物件
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//呼叫代理物件方法
		User user = userMapper.findUserById(1);
		System.out.println(user);
		//關閉session
		session.close();
		
	}
	@Test
	public void testFindUserByUsername() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		List<User> list = userMapper.findUserByUsername("張");
		System.out.println(list.size());

	}
Public void testInsertUser() throws Exception {
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲取mapper介面的代理物件
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//要新增的資料
		User user = new User();
		user.setUsername("張三");
		user.setBirthday(new Date());
		user.setSex("1");
		user.setAddress("北京市");
		//通過mapper介面新增使用者
		userMapper.insertUser(user);
		//提交
		session.commit();
		//關閉session
		session.close();
	}
	

}

六、總結

         selectOne和selectList
         動態代理物件呼叫sqlSession.selectOne()和sqlSession.selectList()是根據mapper介面方法的返回值決定,如果返回list則呼叫selectList方法,如果返回單個物件則呼叫selectOne方法。


         namespace
         mybatis官方推薦使用mapper代理方法開發mapper介面,程式設計師不用編寫mapper介面實現類,使用mapper代理方法時,輸入引數可以使用pojo包裝物件或map物件,保證dao的通用性。