zoukankan      html  css  js  c++  java
  • Mybatis之Mapper动态代理

    一、什么是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查询测试


    模糊查询测试



    插入数据测试




  • 相关阅读:
    springboot+thymeleaf+pageHelper带条件分页查询
    用JavaScript写一个简单的计算器
    运用java反射机制获取实体方法报错,java.lang.NoSuchMethodException: int.<init>(java.lang.String)
    前端页面优化
    MySQL常用dos命令
    python 学习笔记(四) 统计序列中元素出现的频度(即次数)
    python 学习笔记(二):为元组的每个元素命名,提高程序的可读性
    python 学习笔记(一):在列表、字典、集合中根据条件筛选数据
    Python 字符串前面加u,r,b,f的含义
    python3中文件操作及编码
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653218.html
Copyright © 2011-2022 走看看