Mybatis之Mapper动态代理实例解析
2019-08-21 09:11
531 查看
一、什么是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。
package com.kang.mapper; import java.util.List; import com.kang.pojo.User; public interface UserMapper { //根据用户id查询用户信息 public User findUserById(int id) throws Exception; //查询用户列表 public List<User> findUserByUsername(String username) throws Exception; //添加用户信息 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必须对应着map接口的全类名--> <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接口中的方法名是一一对应的。
3、在SqlMapConfig.xml中加入映射文件
<!-- 加载 映射文件 --> <mappers> <mapper resource="map/UserMapper.xml" /> </mappers>
4、测试代码
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 { // 会话工厂 private SqlSessionFactory sqlSessionFactory; @Before public void createSqlSessionFactory() throws IOException { // 配置文件SqlMapConfig.xml在类路径下 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { //获取session SqlSession session = sqlSessionFactory.openSession(); //获取mapper接口的代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); //调用代理对象方法 User user = userMapper.findUserById(27); System.out.println(user); //关闭session session.close(); System.out.println("---------执行完毕-----------"); } @Test public void testFindByUsername() throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获取mapper接口的代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); //调用代理对象方法 List<User> list=userMapper.findUserByUsername("张"); for (User user : list) { System.out.println(user); } //关闭session session.close(); System.out.println("---------执行完毕-----------"); } @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(); //关闭session session.close(); System.out.println("---------执行完毕-----------"); } }
5、单元测试
id查询测试
模糊查询测试
插入数据测试
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- Mybatis之SqlSessionFactoryBean源码初步解析(三)mapper的动态代理
- Mybatis mapper动态代理的原理解析
- Mybatis中Mapper动态代理的实现原理
- Spring Boot整合mybatis并自动生成mapper和实体实例解析
- mybatis3整合spring4-采用mapper动态代理的方式开发Dao
- MyBatis(一)入门使用步骤; 基础方式Statement的增删改查CRUD; mapper动态代理方式的crud (MyBatis接口开发)
- Mybatis学习笔记(4)--MyBatis的Mapper动态代理方式
- Mybatis之Mapper动态代理方式
- mybatis04--Mapper动态代理实现
- Mybatis实现Mapper动态代理方式
- 动态代理-实例解析
- SprignMVC+myBatis整合+mybatis源码分析+动态代理实现流程+如何根据mapper接口生成其实现类
- Mybatis源码分析(一)--Mapper的动态代理
- 原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)
- Java反射学习总结四(动态代理使用实例和内部原理解析)
- mybatis之旅第二篇-Mapper动态代理方式
- Mybatis3源码分析(21)-Mapper实现-动态代理
- Mybatis 源码解析二、Mapper接口的代理实现过程 MapperScannerConfigurer 解析
- 模仿与学习MyBatis - 1.5 Mapper与动态代理
- MyBatis开发Dao层的两种方式(Mapper动态代理方式)