1. 程式人生 > >Java框架學習_Mybatis(六)Mybatis的動態代理模式

Java框架學習_Mybatis(六)Mybatis的動態代理模式

之前我們為了實現資料庫操作的封裝和業務的分離,使用Dao模式,現在Mybatis提供了更加簡潔的動態代理模式,只要有介面不需要實現,就能進行資料庫操作


動態代理模式必須遵循的規範:

  1. 與表相對應的mapper配置的namespace必須是介面的全路徑名
  2. 介面的方法名必須與sql語句的id一致
  3. sql的parametertype必須與介面的形參一致
  4. sql的resultype必須與介面的返回值一致

這裡再新建一個UserMapper.xml檔案(要修改的地方就是namesapce,需要是介面的全路徑名):

<?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.nupt.mybatis.mapper.UserMapper"> <!-- 跟新使用者,設定id,設定引數型別(因為有很多的引數,所以就用pojo型別了) --> <update id="updateUser" parameterType="cn.nupt.pojo.User"
>
UPDATE `mybatis`.`user` SET `username` = #{username}, `address` = #{address} WHERE `id` = #{id} ; </update> <!-- 刪除使用者 --> <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete> <select id="getUserById"
parameterType="int" resultType="cn.nupt.pojo.User">
<!-- select * from user where id = #{id2} --> <!-- 或者: --> select * from user where id = ${value} </select> <select id="getUserByName" parameterType="string" resultType="cn.nupt.pojo.User"> <!-- select * from user where name like '%張%' --> <!-- 和下面的一樣都可以,只不過輸入完整的:“%張%” select * from user where username like #{id2} --> select * from user where username like '%${value}%' </select> </mapper>

然後將這個mapper對映檔案放到核心配置檔案裡:

<mappers>
		<mapper resource="mybatis/user.xml"/>
		
		<mapper resource="mybatis/UserMapper.xml"/>
</mappers>

這裡寫一個增刪查改的介面:

package cn.nupt.mybatis.mapper;

import java.util.List;

import cn.nupt.pojo.User;

public interface UserMapper {
	void updateUser(User user);

	void deleteUser(Integer id);

	User getUserById(Integer id);

	List<User> getUserByName(String name);

}

然後直接用動態代理就可以實現了:

package cn.nupt.mybatis.mapper;

import static org.junit.Assert.*;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import cn.nupt.mybatis.utils.SqlSessionFactoryUtils;
import cn.nupt.pojo.User;

public class UserMapperTest {

	@Test
	public void testUpdateUser() {

		SqlSession session = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
		// 獲取介面的代理人實現類
		UserMapper userMapper = session.getMapper(UserMapper.class);

		User user = new User();

		user.setUsername("周杰倫");
		user.setAddress("臺灣");
		user.setId(1);

		userMapper.updateUser(user);

	}

	@Test
	public void testDeleteUser() {
		fail("Not yet implemented");
	}

	@Test
	public void testGetUserById() {

		SqlSession session = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
		// 獲取介面的代理人實現類
		UserMapper userMapper = session.getMapper(UserMapper.class);

		User userById = userMapper.getUserById(24);
		System.out.println(userById);
	}

	@Test
	public void testGetUserByName() {

		SqlSession session = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
		// 獲取介面的代理人實現類
		UserMapper userMapper = session.getMapper(UserMapper.class);

		List<User> list = userMapper.getUserByName("%張%");
		for (User user : list) {
			System.out.println(user);
		}
	}

}