Mybatis實(shí)現(xiàn)Mapper動(dòng)態(tài)代理方式詳解
一、實(shí)現(xiàn)原理
Mapper接口開發(fā)方法只需要程序員編寫Mapper接口(相當(dāng)于Dao接口),由Mybatis框架根據(jù)接口定義創(chuàng)建接口的動(dòng)態(tài)代理對(duì)象,代理對(duì)象的方法體同上邊Dao接口實(shí)現(xiàn)類方法。
Mapper接口開發(fā)需要遵循以下規(guī)范:
1、Mapper.xml文件中的namespace與mapper接口的類路徑相同。
2、 Mapper接口方法名和Mapper.xml中定義的每個(gè)statement的id相同
3、Mapper接口方法的輸入?yún)?shù)類型和mapper.xml中定義的每個(gè)sql 的parameterType的類型相同
4、Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個(gè)sql的resultType的類型相同
二、Mapper.xml映射文件
定義mapper映射文件UserMapper.xml(內(nèi)容同Users.xml),需要修改namespace的值為 UserMapper接口路徑。將UserMapper.xml放在classpath 下mapper目錄下。
<?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="cn.itcast.mybatis.mapper.UserMapper">
<!-- 根據(jù)id獲取用戶信息 -->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
select * from user where id = #{id}
</select>
<!-- 自定義條件查詢用戶列表 -->
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="cn.itcast.mybatis.po.User">
select * from user where username like '%${value}%'
</select>
<!-- 添加用戶 -->
<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(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
三、Mapper.java(接口文件)
/**
* 用戶管理mapper
*/
Public interface UserMapper {
//根據(jù)用戶id查詢用戶信息
public User findUserById(int id) throws Exception;
//查詢用戶列表
public List<User> findUserByUsername(String username) throws Exception;
//添加用戶信息
public void insertUser(User user)throws Exception;
}
接口定義有如下特點(diǎn):
1、Mapper接口方法名和Mapper.xml中定義的statement的id相同
2、Mapper接口方法的輸入?yún)?shù)類型和mapper.xml中定義的statement的parameterType的類型相同
3、Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的statement的resultType的類型相同
四、加載UserMapper.xml文件
修改sqlMapConfig.xml文件:
<!-- 加載映射文件 --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers>
五、測試
Public class UserMapperTest extends TestCase {
private SqlSessionFactory sqlSessionFactory;
protected void setUp() throws Exception {
//mybatis配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder創(chuàng)建sessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
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(1);
System.out.println(user);
//關(guān)閉session
session.close();
}
@Test
public void testFindUserByUsername() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.findUserByUsername("張");
System.out.println(list.size());
}
Public void testInsertUser() throws Exception {
//獲取session
SqlSession session = sqlSessionFactory.openSession();
//獲取mapper接口的代理對(duì)象
UserMapper userMapper = session.getMapper(UserMapper.class);
//要添加的數(shù)據(jù)
User user = new User();
user.setUsername("張三");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("北京市");
//通過mapper接口添加用戶
userMapper.insertUser(user);
//提交
session.commit();
//關(guān)閉session
session.close();
}
}
六、總結(jié)
selectOne和selectList
動(dòng)態(tài)代理對(duì)象調(diào)用sqlSession.selectOne()和sqlSession.selectList()是根據(jù)mapper接口方法的返回值決定,如果返回list則調(diào)用selectList方法,如果返回單個(gè)對(duì)象則調(diào)用selectOne方法。
namespace
mybatis官方推薦使用mapper代理方法開發(fā)mapper接口,程序員不用編寫mapper接口實(shí)現(xiàn)類,使用mapper代理方法時(shí),輸入?yún)?shù)可以使用pojo包裝對(duì)象或map對(duì)象,保證dao的通用性。
以上就是本文的全部內(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解析替換問題
- 超全MyBatis動(dòng)態(tài)代理詳解(絕對(duì)干貨)
- Mybatis mapper接口動(dòng)態(tài)代理開發(fā)步驟解析
- Mybatis之Mapper動(dòng)態(tài)代理實(shí)例解析
- Mybatis mapper動(dòng)態(tài)代理的原理解析
- 詳解MyBatis開發(fā)Dao層的兩種方式(Mapper動(dòng)態(tài)代理方式)
- 詳解MyBatis動(dòng)態(tài)代理機(jī)制
相關(guān)文章
spring聲明式事務(wù)@Transactional開發(fā)常犯的幾個(gè)錯(cuò)誤及最新解決方案
使用聲明式事務(wù)@Transactional進(jìn)行事務(wù)一致性的管理,在開發(fā)過程中,發(fā)現(xiàn)很多開發(fā)同學(xué)都用錯(cuò)了spring聲明式事務(wù)@Transactional或使用不規(guī)范,導(dǎo)致出現(xiàn)各種事務(wù)問題,這篇文章主要介紹了spring聲明式事務(wù)@Transactional開發(fā)常犯的幾個(gè)錯(cuò)誤及解決辦法,需要的朋友可以參考下2024-02-02
MyBatis-Plus中BaseMapper接口的增刪查改操作大全
本文介紹了MyBatis-Plus中BaseMapper接口的常用方法,包括根據(jù)ID查詢、根據(jù)多個(gè)ID查詢、根據(jù)字段名-值對(duì)查詢、使用QueryWrapper進(jìn)行復(fù)雜查詢、分頁查詢、插入、刪除和修改操作,通過這些方法,可以方便地進(jìn)行數(shù)據(jù)庫的增刪查改操作,感興趣的朋友跟隨小編一起看看吧2025-11-11
SpringBoot2.0.3打印默認(rèn)數(shù)據(jù)源為 HikariDataSource (null)問題
這篇文章主要介紹了SpringBoot2.0.3打印默認(rèn)數(shù)據(jù)源為 HikariDataSource (null)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法
這篇文章主要介紹了Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法,本文使用apache-commons-net工具包時(shí)遇到這個(gè)問題,解決方法很簡單,需要的朋友可以參考下2015-05-05

