1. 程式人生 > >mybatis使用mapper代理的方式操作資料庫

mybatis使用mapper代理的方式操作資料庫

利用mapper 代理的方式操作資料庫和上一篇利用傳統的方式相比,不需要程式設計師自己建立 dao 的介面實現類(即:不需要建立userDaoImpl),而是通過 mybatis 代理的方式建立。

但是要注意的開發規範: 

1、usermapper.xml 檔案中 mapper 的 namespace 的值要等於 dao 的介面類的地址

2、userDao 方法名和 usermapper.xml 中的 select 的 id 一樣

3、userDao 介面中的方法的返回值和 usermapper.xml中 select 的 resultType 的型別一樣

4、userDao 介面中方法的輸入引數型別和 usermapper.xml 中 select 的 

parameterType 的值一樣

這是和傳統的方式(隨便起個名字)不同的地方

sqlMapperConfig.xml

<?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>
<environments default="development">  
        <environment id="development">  
            <!-- 配置JDBC事務控制,由mybatis進行管理 -->  
            <transactionManager type="JDBC"></transactionManager>  
            <!-- 配置資料來源,採用mybatis連線池 -->  
            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.jdbc.Driver" />  
                <property name="url" value="jdbc:mysql://localhost:3306/spring"/>  
                <property name="username" value="root" />  
                <property name="password" value="5315314sd" />  
            </dataSource>  
         </environment>  
</environments> 
    <mappers>
    	<!-- 載入 usermapper.xml 檔案 -->
    	<mapper resource="usermapper.xml"/>
    </mappers>
</configuration>

usermapper.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper 的 namespace 的值要等於 userdao 介面的地址(包名.介面名) -->
<mapper namespace="testmapper.userdao">
<!-- 查詢使用者
	id 名字要等於 userdao 接口裡面對應的方法名, parameterType 的型別等於對應方法裡面的輸入引數型別, resultType是對應
	方法裡面的返回值型別,例如 userdao 接口裡面的方法:public user findUserById(int id);
 -->
<select id="findUserById" parameterType="int" resultType="test.user">
	select * from user where id =#{id}
</select>
<!-- 新增使用者 -->
<!-- parameterType:指定輸入引數型別是 pojo 
	#{}中指定 pojo 的屬性名,接收到 pojo 的屬性值
 -->
<insert id="insertUser" parameterType="test.user">
	insert into user(name,password) values(#{name},#{password})
</insert>
</mapper>
userdao 介面:
package testmapper;

import test.user;

public interface userdao {

	public user findUserById(int id);
	
	public void inserUser(user user);
}

測試類:
package testmapper;

import java.io.IOException;
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 test.user;



public class test {

	public static SqlSessionFactory sf;
	public void setup() throws IOException{
		String resource = "SqlMapConfig.xml";
		InputStream is = Resources.getResourceAsStream(resource);
		sf = new SqlSessionFactoryBuilder().build(is);
	}
	public static void main(String[]args){
		test t = new test();
		try {
			t.setup();
		} catch (IOException e) {
			e.printStackTrace();
		}
		SqlSession sqlsession = sf.openSession();
		//建立userdao物件,mybatis 自動生成 mapper 代理物件
		userdao userdao = sqlsession.getMapper(userdao.class);
		user user = userdao.findUserById(1);
		System.out.println(user);
	}
}

整個專案框架:


總結:一般專案開發都是面向介面開發,所以我們只需要把 dao 的方法定義在一個接口裡面:UserDao,然後通過 mapper 代理的方式建立 mapper 介面實現類的代理物件,再通過該代理物件可直接對接口裡面的方法進行呼叫

與不用mapper代理方式開發在編碼上的區別與共同點:

1、要遵守mapper代理方式的開發規範,剛開始的4點

2、不用建立dao介面的實現類

3、不論是非mapper 代理的方式還是 mapper 代理的方式,都需要建立回話工廠,回話工廠建立之後

(1)非mapper 代理的方式是通過呼叫 SqlSession 裡面的 select、insert、update、delete 方法操作資料庫

(2)mapper 代理的方式通過建立 dao 介面實現類的代理物件,直接呼叫接口裡面的方法實現相關資料庫操作