MyBatis 原始dao與mapper代理

00潤物無聲00發表於2016-09-23

一.原始Dao開發 

 原始Dao開發,我們需要些dao介面和dao的實現類,向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory建立SqlSession。

public class UserDaoImpl implements UserDao {

	// 需要向dao實現類中注入SqlSessionFactory
	// 這裡通過構造方法注入
	private SqlSessionFactory sqlSessionFactory;

	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}

	@Override
	public User findUserById(int id) throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();

		User user = sqlSession.selectOne("test.findUserById", id);

		// 釋放資源
		sqlSession.close();

		return user;

	}
上述程式碼中的

User user = sqlSession.selectOne("test.findUserById", id);

1.sqlSession方法,將statement的id硬編碼

2.sqlSession方法id應該是int,但是當傳入String型別的時候,因為該方法使用泛型,編譯階段不會出錯,不利於開發


二.mapper代理開發

我們編寫mapper.xml對映檔案,mybatis可以自動生成mapper介面實現類代理物件。但是mapper代理的實現,需要遵循以下4個開發規則

1、在mapper.xml中namespace等於mapper介面地址

<!-- namespace名稱空間,作用就是對sql進行分類化管理,理解sql隔離 
注意:使用mapper程式碼方法開發,namespace要等於mapper介面地址 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

2、mapper.java介面中的方法名和mapper.xml中statement的id一致

mapper.java介面方法

	//根據id查詢使用者
	public User findUserById(int id) throws Exception;
mapper.xml中statement的id

	<select id="findUserById" parameterType="int"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where id = #{id}
	</select>

3、mapper.java介面中的方法輸入引數型別和mapper.xml中statement的parameterType指定的型別一致。

  在規則2的程式碼中可以看出


4、mapper.java介面中的方法返回值型別和mapper.xml中statement的resultType指定的型別一致。

 同規則2的程式碼


完整程式碼

  Usermapper介面

package cn.itcast.mybatis.mapper;
import java.util.List;

import cn.itcast.mybatis.po.User;

/**
 * UserMapper 2016年9月21日18:00:30
 * mapper介面,相當於dao介面
 * @author fxq
 *
 */
public interface UserMapper {
	//根據id查詢使用者
	public User findUserById(int id) throws Exception;
	//查詢多條記錄
	public List<User> findUserByName(String name) throws Exception;
	//新增使用者資訊
	public void insertUser(User user) throws Exception;
	//刪除使用者資訊
	public void deleteUser(int id) throws Exception;
}

  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">

<!-- namespace名稱空間,作用就是對sql進行分類化管理,理解sql隔離 
注意:使用mapper程式碼方法開發,namespace有特殊重要的作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
	<!-- 在對映檔案中配置很多sql語句 -->
	<!-- 需求:通過id查詢使用者表的記錄 -->
	<!-- 通過select執行資料庫的查詢 -->
	<!-- id:標識對映檔案中的sql -->
	<!-- 將sql語句封裝到mappedStatement物件中,所以將id成為statement 的id -->

	<select id="findUserById" parameterType="int"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where id = #{id}
	</select>
	<!-- 自定義條件查詢使用者列表 -->
	<!-- resultType:指定就是單條記錄所對映的java物件型別 -->
	<select id="findUserByName" parameterType="java.lang.String"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where username like '%${value}%'
	</select>

	<!-- 新增使用者 parameterType:指定輸入引數型別是pojo(包括:使用者資訊) #{}中指定pojo的屬性名,接收到pojo物件的屬性值,mybatis通過OGNL獲取物件的屬性值; -->
	<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 (id,username,birthday,sex,address)
		values(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>

	<!-- 刪除 -->
	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from USER WHERE id
		= #{id}
	</delete>
	<!-- 更新 -->
	<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
		update USER set username =
		#{username},birthday=#{birthday},sex=#{sex},address=#{address} where
		id = #{id}
	</update>
</mapper>

  測試類

package cn.itcast.mybatis.mapper;

import java.io.InputStream;
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.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void setUp() throws Exception{
		//建立sqlSessionFactory
		String resource= "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void testFindUserById() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//建立UserMapper物件,mybatis自動生成mapper代理物件;
		<strong>UserMapper userMapper=sqlSession.getMapper(UserMapper.class);</strong>
		User user = userMapper.findUserById(1);		
		System.out.println(user);
	}

}

三.總結

  mapper代理開發遵循一定的開發規範,減少了錯誤的概率,提高了開發效率。同時對於資料型別的控制,從原始Dao的執行階段到了mapper代理的編譯階段,更利於開發。

相關文章