MyBatis中Mapper代理開發方式

MyBatis中Mapper代理開發方式

一、說在前面

上文(MyBatis原始Dao開發方式)結尾處提到,原始的dao開發方式存在一些問題,爲了解決掉這些問題,現在採用mapper代理方式進行開發。

Mapper接口開發方法只需要程序員編寫Mapper接口(相當於Dao接口),由Mybatis框架根據接口定義創建接口的動態代理對象。
Mapper接口開發需要遵循以下規範:
1、 Mapper.xml文件中的namespace與mapper接口的類路徑相同。
2、 Mapper接口方法名和Mapper.xml中定義的每個statement的id相同 
3、 Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同
4、 Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同

二、實例代碼

數據庫文件以及用戶實體類都和上文(MyBatis原始Dao開發方式)一模一樣,在此不再贅述。
1、 UserMapper.java

package cn.at.mybatis.mapper;

import java.util.List;

import cn.at.mybatis.po.User;
/*
 * mapper接口 , 相當於dao接口,用戶管理
 */
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;
	
	//更加用戶id刪除用戶
	public void deleteUser(int id) throws Exception;
}
2、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.at.mybatis.mapper.UserMapper">
	<!-- 在映射文件中配置很多sql語句 -->
	<!-- 通過id查詢用戶表的記錄 -->
	<!-- 通過select來執行數據庫的查詢
		id:標識映射文件的sql,
		將sql語句封裝到mappedStatement對象中,所以稱之爲statement的id
		#{}表示一個佔位符
		#{id}:其中的id表示接受輸入的參數,參數名稱就是id,如果輸入參數是簡單類型,#{}中的參數名可以任意,可以是value或者其他名稱
		resultType:指定sql輸出結果所映射的java對象類型,SELECT指定resultType表示將單條記錄映射成java對象。
		
	 -->
	<select id="findUserById" parameterType="int" resultType="cn.at.mybatis.po.User">
		SELECT * FROM user WHERE id=#{id}
	</select>
	
	<!-- 根據用戶名稱模糊查詢用戶信息 , 可能返回多條
		resultType: 指的就是單條記錄所映射的java對象類型
		${}:表示拼接sql串,將接受到的參數的內容不加任何修飾的拼接到sql中
		使用${}拼接sql,會引起sql注入
		${value}:接受輸入參數的內容,如果傳入的類型是簡單類型,${}中只能是用value
	-->
	<select id="findUserByName" parameterType="String" resultType="cn.at.mybatis.po.User">
		SELECT * FROM user WHERE username LIKE '%${value}%'
	</select>
	
	<!-- 添加用戶 -->
	<insert id="insertUser" parameterType="cn.at.mybatis.po.User">
		<!-- 將插入數據的主鍵返回,返回到user對象中
			keyProperty:將查詢到的主鍵設置到parameterType指定對象的屬性中
			order:指的是SELECT LAST_INSERT_ID()的執行順序,相對於insert來說。
			resultType:指定SELECT LAST_INSERT_ID()的結果類型
		 -->
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			SELECT LAST_INSERT_ID()
		</selectKey>
		INSERT INTO user (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<!-- 刪除用戶 
		根據用戶的id刪除,需要輸入用戶的id
	-->
	<delete id="deleteUser" parameterType="int">
		DELETE FROM user WHERE id=#{id}
	</delete>
	
	<!-- 更新用戶信息
		parameterType指定user對象,包括id和更新的信息,id必須存在
	 -->
	<update id="updateUser" parameterType="cn.at.mybatis.po.User">
		UPDATE user SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id}
	</update>
</mapper>
3、SqlMapConfig.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>
	<!-- 和spring整合後 environments配置將廢除-->
	<environments default="development">
		<environment id="development">
		<!-- 使用jdbc事務管理-->
			<transactionManager type="JDBC" />
		<!-- 數據庫連接池-->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="111111" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 加載映射文件 -->
	<mappers>
		<mapper resource="sqlmap/User.xml"/>
		
		<!-- 在這裏別忘記加載映射文件了 -->
		<mapper resource="mapper/UserMapper.xml"/>
		
	</mappers>
	
</configuration>
4、UserMapperTest.java測試類

package cn.at.mybatis.mapper;

import static org.junit.Assert.*;

import java.io.InputStream;
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.Before;
import org.junit.Test;

import cn.at.mybatis.po.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;
	
	//此方法是在執行testFindUserById之前執行
	@Before
	public void setUp() throws Exception {
		//創建sqlSessionFactory
		
		//讀取配置文件
		String resource = "SqlMapConfig.xml";
		
		//得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//創建會話工廠
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	//Mapper代理方式通過id進行查詢
	@Test
	public void testFindUserById() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//創建UserMapper對象,mybatis自動生成代理對象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//調用UserMapper的方法
		User user = userMapper.findUserById(29);
		System.out.println("Mapper代理方式通過id進行查詢====》"+user);
	}
	
	//Mapper代理方式通過用戶名稱進行查詢
	@Test
	public void testFindUserByName() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//創建UserMapper對象,mybatis自動生成代理對象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//調用UserMapper的方法
		List<User> list = userMapper.findUserByName("小明");
		System.out.println("Mapper代理方式通過用戶名稱進行查詢====》"+list);
	}

}
5、測試結果

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 161733249.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@9a3da81]
DEBUG [main] - ==>  Preparing: SELECT * FROM user WHERE username LIKE '%luoyepiaoxue%' 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 2
Mapper代理方式通過用戶名稱進行查詢====》[User [id=26, username=luoyepiaoxue2014, sex=null, birthday=Fri Sep 01 00:00:00 CST 2017, address=安徽], User [id=29, username=luoyepiaoxue, sex=男, birthday=Sun Sep 17 00:00:00 CST 2017, address=北京市]]

By luoyepiaoxue2014
微博地址:  http://weibo.com/luoyepiaoxue2014  點擊打開鏈接



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章