1. 程式人生 > >Mybatis學習筆記(五)--mapper動態代理

Mybatis學習筆記(五)--mapper動態代理

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編寫

定義mapper對映檔案UserMapper.xml和UserMapper介面

將UserMapper.xml放在mapper目錄下,效果如下:

UserMapper.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.janson.mapper.UserMapper">
	<!-- 查詢使用者 -->
	<!-- 
		屬性:
			id:宣告的唯一標識
			paramterType:傳入引數型別
			resultType:返回值的型別
	 -->
	<select id="findById" parameterType="Integer" resultType="User">
		select * from user where id=#{v}
	</select>
	
	<!-- 通過名字模糊搜尋使用者 -->
	<select id="findUserByName" parameterType="String" resultType="User">
		select * from user where username like "%"#{v}"%"
	</select>
	
	<!-- 新增使用者 -->
	<insert id="insertUser" parameterType="User">
		<selectKey keyProperty="id" resultType="Integer" order="AFTER">
		<!-- 這裡是查找出最新插入資料庫中的一ID值 -->
			select LAST_INSERT_ID()
		</selectKey>
		insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
	</insert>
	
	<!-- 修改使用者 -->
	<update id="updateUser" parameterType="User">
		update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
	</update>
	
	<!-- 刪除使用者 -->
	<delete id="deleteUser" parameterType="Integer">
		delete from user where id = #{id}
	</delete>

</mapper>

這裡的xml檔案使用了別名,在這裡介紹一下別名的書寫,在SqlMapConfig.xml中配置<typeAliases>屬性,注意這個屬性不能在<properties>屬性之前(<properties>是配置jdbc這類檔案的標籤)

<!-- 配置別名 -->
<typeAliases>
	<package name="com.janson.pojo"/>
</typeAliases>

package中可以配置類的路徑,不過這裡建議使用配用包名,這樣在這個包下面的所有類就自動配上別名了,例如User.java這個類,我們的別可以使用user和User這兩個都可以。

UserMapper.java

package com.janson.mapper;

import java.util.List;

import com.janson.pojo.User;

public interface UserMapper {
	//1.名字與xml中的id相同
	//2.返回值型別與xml中的resultType相同
	//3.傳入的引數型別與xml中的parameterType相同
	//介面的名字要與xml的名字相同
	public User findById(Integer id);
	
	public List<User> findUserByName(String name);
	
	public void insertUser(User user);
	
	public void updateUser(User user);
	
	public void deleteUser(Integer id);
}

測試程式碼

package com.janson.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.janson.mapper.UserMapper;
import com.janson.pojo.User;

public class MybatisMapperTest {

	@Test
	public void findById() throws IOException {
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = 
				Resources.getResourceAsStream(resource);
		//建立sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		
		//建立sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		
		UserMapper userMapper = session.getMapper(UserMapper.class);
		User user = userMapper.findById(1);
		System.out.println(user);
	}
	
	@Test
	public void findByNameTest() throws Exception {
		//載入配置檔案
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//建立sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		List<User> list = mapper.findUserByName("janson");
		for (User user : list) {
			System.out.println(user);
		}
	}
	
	//新增使用者
	@Test
	public void insertUserTest() throws Exception {
		//載入配置檔案
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//建立sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		User user = new User();
		user.setAddress("111");
		user.setUsername("linjanson");
		user.setSex("男");
		user.setBirthday(new Date());
		mapper.insertUser(user);
		session.commit();
		System.out.println(user.getId());
	}
	
	//修改使用者
	@Test
	public void updateUserTest() throws Exception {
		//載入配置檔案
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//建立sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		User user = new User();
		user.setId(29);
		user.setAddress("22222");
		user.setUsername("jansonlin");
		user.setSex("男");
		user.setBirthday(new Date());
		mapper.updateUser(user);
		session.commit();
		System.out.println(user.getId());
	}
	
	//刪除使用者
	@Test
	public void deleteUserTest() throws Exception {
		//載入配置檔案
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//建立sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		mapper.deleteUser(29);
		session.commit();
		
	}
}

mapper動態代理程式設計比原始的Dao程式設計快捷,方便,建議使用mapper動態程式設計。