Mybatis之Mapper动态代理

本文介绍MyBatis中Mapper接口动态代理的使用方法及注意事项,并通过实例演示查询与插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是Mapper的动态代理
采用Mapper动态代理方法只需要编写相应的Mapper接口(相当于Dao接口),那么Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
1、Mapper.xml文件中的namespace与mapper接口的全类名相同。
2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。


二、实例演示
这里只演示了利用代理进行查询和插入的操作,其他操作与之情况类似。只需要在接口中定义相关方法,然后在xml中进行相关配置即可。
这个演示是建立在前一个增删改查的项目基础上。项目整体目录大致相同。基本属性文件信息也相同。这里不作详述。

1、新建一个com.kang.mapper的包,定义map接口,接口名任意,这里是UserMapper。
[java]  view plain  copy
  1. package com.kang.mapper;  
  2.   
  3.   
  4. import java.util.List;  
  5. import com.kang.pojo.User;  
  6. public interface UserMapper {  
  7.     //根据用户id查询用户信息  
  8.     public User findUserById(int id) throws Exception;  
  9.     //查询用户列表  
  10.     public List<User> findUserByUsername(String username) throws Exception;  
  11.     //添加用户信息  
  12.     public void insertUser(User user)throws Exception;   
  13. }  


2、配置xml文件
UserMapper.xml
[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="com.kang.mapper.UserMapper">  
  6. <!-- 注意这里的 namespace必须对应着map接口的全类名-->  
  7.     <select id="findUserById" parameterType="int" resultType="user">  
  8.         select * from user where id = #{id}  
  9.     </select>  
  10.       
  11.     <select id="findUserByUsername" parameterType="java.lang.String"  
  12.         resultType="user">  
  13.         select * from user where username like '%${value}%'  
  14.     </select>  
  15.       
  16.     <insert id="insertUser" parameterType="user">  
  17.         <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">  
  18.             select LAST_INSERT_ID()  
  19.         </selectKey>  
  20.         insert into user(username,birthday,sex,address)  
  21.         values(#{username},#{birthday},#{sex},#{address})  
  22.     </insert>  
  23. </mapper>  

注意到配置文件中的id属性值和map接口中的方法名是一一对应的。


3、在SqlMapConfig.xml中加入映射文件
[html]  view plain  copy
  1. <!-- 加载 映射文件 -->  
  2.     <mappers>  
  3.         <mapper resource="map/UserMapper.xml" />  
  4.         </mappers>  

4、测试代码
[java]  view plain  copy
  1. package com.kang.test;  
  2.   
  3.   
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.util.Date;  
  7. import java.util.List;  
  8.   
  9.   
  10. import org.apache.ibatis.io.Resources;  
  11. import org.apache.ibatis.session.SqlSession;  
  12. import org.apache.ibatis.session.SqlSessionFactory;  
  13. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  14. import org.junit.Before;  
  15. import org.junit.Test;  
  16.   
  17.   
  18. import com.kang.mapper.UserMapper;  
  19. import com.kang.pojo.User;  
  20.   
  21.   
  22. public class UserTest {  
  23.     // 会话工厂  
  24.     private SqlSessionFactory sqlSessionFactory;  
  25.   
  26.   
  27.     @Before  
  28.     public void createSqlSessionFactory() throws IOException {  
  29.         // 配置文件SqlMapConfig.xml在类路径下  
  30.         String resource = "SqlMapConfig.xml";  
  31.         // 得到配置文件流  
  32.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  33.         // 创建会话工厂,传入mybatis的配置文件信息  
  34.         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  35.   
  36.   
  37.     }  
  38.   
  39.   
  40.     @Test  
  41.     public void testFindUserById() throws Exception {  
  42.         //获取session  
  43.         SqlSession session = sqlSessionFactory.openSession();  
  44.         //获取mapper接口的代理对象  
  45.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  46.         //调用代理对象方法  
  47.         User user = userMapper.findUserById(27);  
  48.         System.out.println(user);  
  49.         //关闭session  
  50.         session.close();  
  51.         System.out.println("---------执行完毕-----------");  
  52.           
  53.     }  
  54.       
  55.     @Test  
  56.     public void testFindByUsername() throws Exception{  
  57.         //获取session  
  58.         SqlSession session = sqlSessionFactory.openSession();  
  59.         //获取mapper接口的代理对象  
  60.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  61.         //调用代理对象方法  
  62.         List<User> list=userMapper.findUserByUsername("张");  
  63.         for (User user : list) {  
  64.             System.out.println(user);  
  65.         }  
  66.         //关闭session  
  67.         session.close();  
  68.         System.out.println("---------执行完毕-----------");  
  69.     }  
  70.       
  71.       
  72.     @Test  
  73.     public void testInsert() throws Exception{  
  74.         User user=new User();  
  75.         user.setUsername("cxk");  
  76.         user.setSex("1");  
  77.         user.setBirthday(new Date());  
  78.         user.setAddress("四川成都");  
  79.           
  80.         SqlSession session=sqlSessionFactory.openSession();  
  81.         UserMapper userMapper=session.getMapper(UserMapper.class);  
  82.         userMapper.insertUser(user);  
  83.         session.commit();  
  84.         //关闭session  
  85.         session.close();  
  86.         System.out.println("---------执行完毕-----------");  
  87.       
  88.     }  
  89.       
  90.   
  91.   
  92. }  


5、单元测试

id查询测试


模糊查询测试



插入数据测试


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值