Mybatis之Mapper動(dòng)態(tài)代理實(shí)例解析
一、什么是Mapper的動(dòng)態(tài)代理
采用Mapper動(dòng)態(tài)代理方法只需要編寫(xiě)相應(yīng)的Mapper接口(相當(dāng)于Dao接口),那么Mybatis框架根據(jù)接口定義創(chuàng)建接口的動(dòng)態(tài)代理對(duì)象,代理對(duì)象的方法體同Dao接口實(shí)現(xiàn)類(lèi)方法。
Mapper接口開(kāi)發(fā)需要遵循以下規(guī)范:
1、Mapper.xml文件中的namespace與mapper接口的全類(lèi)名相同。
2、Mapper接口方法名和Mapper.xml中定義的每個(gè)statement的id相同。
3、Mapper接口方法的輸入?yún)?shù)類(lèi)型和mapper.xml中定義的每個(gè)sql 的parameterType的類(lèi)型相同。
4、Mapper接口方法的輸出參數(shù)類(lèi)型和mapper.xml中定義的每個(gè)sql的resultType的類(lèi)型相同。
二、實(shí)例演示
這里只演示了利用代理進(jìn)行查詢(xún)和插入的操作,其他操作與之情況類(lèi)似。只需要在接口中定義相關(guān)方法,然后在xml中進(jìn)行相關(guān)配置即可。
這個(gè)演示是建立在前一個(gè)增刪改查的項(xiàng)目基礎(chǔ)上。項(xiàng)目整體目錄大致相同?;緦傩晕募畔⒁蚕嗤_@里不作詳述。
1、新建一個(gè)com.kang.mapper的包,定義map接口,接口名任意,這里是UserMapper。
package com.kang.mapper;
import java.util.List;
import com.kang.pojo.User;
public interface UserMapper {
//根據(jù)用戶(hù)id查詢(xún)用戶(hù)信息
public User findUserById(int id) throws Exception;
//查詢(xún)用戶(hù)列表
public List<User> findUserByUsername(String username) throws Exception;
//添加用戶(hù)信息
public void insertUser(User user)throws Exception;
}
2、配置xml文件
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.kang.mapper.UserMapper">
<!-- 注意這里的 namespace必須對(duì)應(yīng)著map接口的全類(lèi)名-->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="user">
select * from user where username like '%${value}%'
</select>
<insert id="insertUser" parameterType="user">
<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>
</mapper>
注意到配置文件中的id屬性值和map接口中的方法名是一一對(duì)應(yīng)的。
3、在SqlMapConfig.xml中加入映射文件
<!-- 加載 映射文件 -->
<mappers>
<mapper resource="map/UserMapper.xml" />
</mappers>
4、測(cè)試代碼
package com.kang.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.Before;
import org.junit.Test;
import com.kang.mapper.UserMapper;
import com.kang.pojo.User;
public class UserTest {
// 會(huì)話工廠
private SqlSessionFactory sqlSessionFactory;
@Before
public void createSqlSessionFactory() throws IOException {
// 配置文件SqlMapConfig.xml在類(lèi)路徑下
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 創(chuàng)建會(huì)話工廠,傳入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
//獲取session
SqlSession session = sqlSessionFactory.openSession();
//獲取mapper接口的代理對(duì)象
UserMapper userMapper = session.getMapper(UserMapper.class);
//調(diào)用代理對(duì)象方法
User user = userMapper.findUserById(27);
System.out.println(user);
//關(guān)閉session
session.close();
System.out.println("---------執(zhí)行完畢-----------");
}
@Test
public void testFindByUsername() throws Exception{
//獲取session
SqlSession session = sqlSessionFactory.openSession();
//獲取mapper接口的代理對(duì)象
UserMapper userMapper = session.getMapper(UserMapper.class);
//調(diào)用代理對(duì)象方法
List<User> list=userMapper.findUserByUsername("張");
for (User user : list) {
System.out.println(user);
}
//關(guān)閉session
session.close();
System.out.println("---------執(zhí)行完畢-----------");
}
@Test
public void testInsert() throws Exception{
User user=new User();
user.setUsername("cxk");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("四川成都");
SqlSession session=sqlSessionFactory.openSession();
UserMapper userMapper=session.getMapper(UserMapper.class);
userMapper.insertUser(user);
session.commit();
//關(guān)閉session
session.close();
System.out.println("---------執(zhí)行完畢-----------");
}
}
5、單元測(cè)試
id查詢(xún)測(cè)試

模糊查詢(xún)測(cè)試

插入數(shù)據(jù)測(cè)試


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- MyBatis加載映射文件和動(dòng)態(tài)代理的實(shí)現(xiàn)
- Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制詳解
- Java之MyBatis的Dao方式以及Dao動(dòng)態(tài)代理詳解
- 解析Mybatis Porxy動(dòng)態(tài)代理和sql解析替換問(wèn)題
- 超全MyBatis動(dòng)態(tài)代理詳解(絕對(duì)干貨)
- Mybatis mapper接口動(dòng)態(tài)代理開(kāi)發(fā)步驟解析
- Mybatis mapper動(dòng)態(tài)代理的原理解析
- 詳解MyBatis開(kāi)發(fā)Dao層的兩種方式(Mapper動(dòng)態(tài)代理方式)
- Mybatis實(shí)現(xiàn)Mapper動(dòng)態(tài)代理方式詳解
- 詳解MyBatis動(dòng)態(tài)代理機(jī)制
相關(guān)文章
java 從int數(shù)組中獲取最大數(shù)的方法
這篇文章主要介紹了java 從int數(shù)組中獲取最大數(shù)的方法,需要的朋友可以參考下2017-02-02
一文簡(jiǎn)單了解C#?中的DataSet類(lèi)
這篇文章主要介紹了一文簡(jiǎn)單了解C#?中的DataSet類(lèi),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
關(guān)于maven本地倉(cāng)庫(kù)的配置方式
這篇文章主要介紹了關(guān)于maven本地倉(cāng)庫(kù)的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
基于SpringBoot實(shí)現(xiàn)HTTP請(qǐng)求簽名驗(yàn)證機(jī)制
在分布式系統(tǒng)交互中,API接口的安全性至關(guān)重要,本文將深入解析基于Spring Boot實(shí)現(xiàn)的HTTP請(qǐng)求簽名驗(yàn)證機(jī)制,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
java實(shí)現(xiàn)簡(jiǎn)單年齡計(jì)算器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單年齡計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
DecimalFormat數(shù)字格式化 0和# 的區(qū)別及說(shuō)明
這篇文章主要介紹了DecimalFormat數(shù)字格式化 0和# 的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
聊一聊new對(duì)象與Spring對(duì)bean的初始化的差別
這篇文章主要介紹了聊一聊new對(duì)象與Spring對(duì)bean的初始化的差別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java兩種方式實(shí)現(xiàn)動(dòng)態(tài)代理
Java 在 java.lang.reflect 包中有自己的代理支持,該類(lèi)(Proxy.java)用于動(dòng)態(tài)生成代理類(lèi),只需傳入目標(biāo)接口、目標(biāo)接口的類(lèi)加載器以及 InvocationHandler 便可為目標(biāo)接口生成代理類(lèi)及代理對(duì)象。我們稱(chēng)這個(gè)Java技術(shù)為:動(dòng)態(tài)代理2020-10-10

