1. 程式人生 > >myabtis入門級03——mybatis開發dao層的兩種方法

myabtis入門級03——mybatis開發dao層的兩種方法

一、先來談談SqlSession的適用範圍

  1. 通過SqlSessionFactoryBuilder建立會話工廠SqlSessionFactory。
    將SqlSessionFactoryBuilder當成一個工具類使用即可,不需要使用單例管理SqlSessionFactoryBuilder。若要建立SqlSessionFactory時,只需要new一次SqlSessionFactoryBuilder即可。
  2. 通過SqlSessionFactory建立SqlSession,使用單例模式管理sqlSessionFactory(工廠一旦建立,使用一個例項)。將來mybatis與spring整合後,使用單例模式管理SqlSessionFactory。
  3. SqlSession是一個面向使用者(程式設計師)的介面。SqlSession中提供了很多操作資料庫的方法。如:selectOne(返回單個物件)、selectList(返回單個或多個物件)。SqlSession是執行緒不安全的,在sqlSession實現類中除了有介面中的方法(操作資料庫的方法)還有資料域屬性。所以最佳應用場合在方法體內,定義成區域性變數使用。

二 、原始dao開發方法(程式需要編寫dao介面和dao實現類)(掌握)

(一) 思路:

  1. 程式設計師需要些dao介面和實現類。
  2. 需要向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory建立SqlSession。

(二) dao介面

package com.kjgym.dao;
import java.util.List;
import com.kjgym.po.User;

public interface UserDao {
	
	// 根據id查詢使用者資訊
	public User findUserById(int id) throws Exception;
	
	// 根據name模糊查詢使用者列表
	public List<User> findUserByName(String username) throws Exception;
	
	// 新增使用者資訊
	public void insertUser(User user) throws Exception;
	
	// 更新使用者資訊
	public void updateUser(User user) throws Exception;
	
	// 刪除使用者
	public void deleteUser(int id) throws Exception;
}

(三) dao介面實現類

package com.kjgym.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.kjgym.po.User;

public class UserDaoImpl implements UserDao {

	// 需要向dao實現類中注入SqlSessionFactory
	// 這裡通過構造方法注入
	private SqlSessionFactory sessionFactory;
	public UserDaoImpl(SqlSessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	public User findUserById(int id) throws Exception {
		// SqlSession不是執行緒安全的 所以寫在區域性變數
		SqlSession sqlSession = sessionFactory.openSession();
		
		// 執行查詢操作
		User user = sqlSession.selectOne("test.findUserById", id);
		
		// 釋放資源
		sqlSession.close();
		
		return user;
	}

	public List<User> findUserByName(String username) throws Exception {
		return null;
	}

	public void insertUser(User user) throws Exception {
		SqlSession sqlSession = sessionFactory.openSession();
		
		// 執行插入操作
		sqlSession.insert("test.insertUser", user);
		
		// 提交事務
		sqlSession.commit();
		
		// 釋放資源
		sqlSession.close();
	}

	public void updateUser(User user) throws Exception {
	}

	public void deleteUser(int id) throws Exception {
	}

}

(四) 總結原始dao開發問題

  1. dao介面實現方法中存在大量模板方法,試設想將這些模板方法提取處理,大大減輕程式設計師的工作量。
  2. 呼叫sqlSession方法時將statement的id硬編碼了。
  3. 呼叫sqlSession方法傳引數時的變數,由於sqlSession方法使用了泛型,即使變數型別傳入錯誤,在編譯階段也不報錯,不利於程式開發。

三、 Mybatis的mapper介面(相當於dao介面)代理開發方法(掌握)

(一) 思路:

  1. 程式設計師還需要編寫mapper.xml檔案
  2. 程式設計師編寫mapper介面需要遵循一些開發規範,mybatis可以自動生成mapper介面實現類物件。

(二) 開發規範

  1. 在mapper.xml中namespace等於mapper介面地址。
  2. mapper.java介面中的方法名與mapper.xml中statement的id值一致。
  3. mapper.java介面中的輸入引數與mapper.xml中statement的parameterType指定的型別一致。
  4. mapper.java介面中的返回值型別與mapper.xml中statement的resultType指定的型別一致。

(三) mapper.java的開發

package com.kjgym.mapper;

import java.util.List;

import com.kjgym.po.User;

public interface UserMapper {
	
	// 根據id查詢使用者資訊
	public User findUserById(int id) throws Exception;
	
	// 根據name模糊查詢使用者列表
	public List<User> findUserByName(String username) throws Exception;
	
	// 新增使用者資訊
	public void insertUser(User user) throws Exception;
	
	// 更新使用者資訊
	public void updateUser(User user) throws Exception;
	
	// 刪除使用者
	public void deleteUser(int id) throws Exception;
}

(四) mapper.xml的開發以及在SqlMapConfig中載入mapper.xml檔案

  1. 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介面的名稱一致
 -->
<mapper namespace="com.kjgym.mapper.UserMapper">

	<select id="findUserById" parameterType="int" resultType="com.kjgym.po.User">
		SELECT * FROM t_user WHERE id=#{id}
	</select>
	
	<select id="findUserByName" parameterType="java.lang.String" resultType="com.kjgym.po.User">
		SELECT * FROM t_user WHERE username LIKE #{username} 
	</select>
	
	<!-- 新增使用者資訊 -->
	<insert id="insertUser" parameterType="com.kjgym.po.User">
	
		insert into t_user(id, username,birthday,sex,address) value(#{id}, #{username}, #{birthday}, #{sex}, #{address})
		
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			select LAST_INSERT_ID()
		</selectKey>	
	</insert>
	
	<!-- 根據id刪除使用者資訊 -->
	<delete id="deletetUserById" parameterType="int">
		delete from t_user where id = #{id}
	</delete>
	
	<!-- 更新使用者資訊 -->
	<insert id="updateUser" parameterType="com.kjgym.po.User">
		update t_user set username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} where id=#{id}
	</insert>
	
</mapper>
  1. 在SqlMapConfig中載入
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 和spring整合後 environments將被廢除 -->
	<environments default="development">
		<environment id="development">
			<!-- 事務管理 -->
			<transactionManager type="JDBC"/>
			<!-- 資料庫連線池 -->
			<dataSource type="POOLED">  
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/db_mybatis02?characterEncoding=utf-8"/>
				<property name="username" value="root"/>
				<property name="password" value="246626"/>
			</dataSource>
		</environment>
	</environments>
	
	<!-- 載入對映檔案 -->
	<mappers>
		<mapper resource="mapper/UserMapper.xml"/>
	</mappers>
</configuration>

(五) 問題總結

  1. 代理物件內部呼叫selectOne或selectList
    如果mapper方法返回單個pojo物件(非集合物件),代理物件內部通過selectOne查詢資料庫。
    如果mapper方法返回集合物件,代理物件內部通過selectList查詢資料庫。
  2. mapper介面方法引數只能有一個是否影響系統開發。
    系統 框架中,dao層的程式碼是業務層公用的。即使mapper藉口只有一個引數,可以使用包裝型別的pojo滿足不同的業務方法的需求。
    注意: 持久層方法的引數可以包裝型別、map…,service方法中建議不要使用包裝型別。(不利於業務層的可擴充套件)