Mybatis之Mapper动态代理实例解析

 更新时间:2019年08月21日 09:11:40   作者:想作会飞的鱼  
这篇文章主要介绍了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查询测试

模糊查询测试

插入数据测试

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 关于Java中使用jdbc连接数据库中文出现乱码的问题

    关于Java中使用jdbc连接数据库中文出现乱码的问题

    这篇文章主要介绍了关于Java中使用jdbc连接数据库中文出现乱码的问题,默认的编码和数据库表中的数据使用的编码是不一致的,如果是中文,那么在数据库中执行时已经是乱码了,需要的朋友可以参考下
    2023-04-04
  • Java Date时间类型的操作实现

    Java Date时间类型的操作实现

    本文主要介绍Java Date 日期类型,以及Calendar的怎么获取时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • JAVA ArrayList详细介绍(示例)

    JAVA ArrayList详细介绍(示例)

    本文对JAVA ArrayList做了详细介绍,文中学到了ArrayList源码解析、ArrayList遍历方式、toArray()异常,最后给出了ArrayList示例。
    2013-11-11
  • SpringBoot+Prometheus+Grafana实现应用监控和报警的详细步骤

    SpringBoot+Prometheus+Grafana实现应用监控和报警的详细步骤

    这篇文章主要介绍了SpringBoot+Prometheus+Grafana实现应用监控和报警的详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • SpringBoot项目加入冲突动态监测算法的实现

    SpringBoot项目加入冲突动态监测算法的实现

    冲突动态监测算法是一种网络通信中的冲突检测方法,适用于无线网络或其他共享传输介质的环境,本文主要介绍了SpringBoot项目加入冲突动态监测算法的实现,感兴趣的可以了解一下
    2023-09-09
  • 使用通过ARP类似P2P终结者实现数据封包

    使用通过ARP类似P2P终结者实现数据封包

    目前网络上类似P2P终结者这类软件,主要都是基于ARP欺骗实现的,网络上到处都有关于ARP的介绍,不过为了本文读者不需要再去查找,我就在这里大概讲解一下
    2012-12-12
  • spring boot集成loback日志配置的示例代码

    spring boot集成loback日志配置的示例代码

    这篇文章主要介绍了spring boot集成loback日志配置的示例代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Intellij IDEA 添加jar包的三种方式(小结)

    Intellij IDEA 添加jar包的三种方式(小结)

    这篇文章主要介绍了Intellij IDEA 添加jar包的三种方式(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • SpringBoot在idea中的 .idea和 .iml文件的作用

    SpringBoot在idea中的 .idea和 .iml文件的作用

    本文主要介绍了SpringBoot在idea中的 .idea和 .iml文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Springcloud seata分布式事务实现代码解析

    Springcloud seata分布式事务实现代码解析

    这篇文章主要介绍了Springcloud seata分布式事务实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12

最新评论