Mapper动态代理模式Demo

案例源码见此处

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的类型相同

1、Mapper.xml文件定义

定义mapper映射文件UserMapper.xml(内容同Users.xml),需要修改namespace的值为 UserMapper接口路径。如下:

<?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="edu.zju.cst.mapper.UserMapper">
	<!-- 根据id获取用户信息 -->
	<select id="findUserById" parameterType="int"
		resultType="edu.zju.cst.pojo.User">
		select * from user where id = #{id}
	</select>
	<!-- 自定义条件查询用户列表 -->
	<select id="findUserByUsername" parameterType="java.lang.String"
		resultType="edu.zju.cst.pojo.User">
		select * from user where username like '%${value}%'
	</select>
	<!-- 添加用户 -->
	<insert id="insertUser"
		parameterType="edu.zju.cst.pojo.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>

说明:

占位符KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}不同,通过{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值, pojoparameterType{}括号中只能是value。

2、定义mapper接口

接口定义有如下特点:

1、Mapper接口方法名和Mapper.xml中定义的statement的id相同

2、Mapper接口方法的输入参数类型和Mapper.xml中定义的statement的parameterType的类型相同

3、Mapper接口方法的输出参数类型和Mapper.xml中定义的statement的resultType的类型相同

/**  
 * @Title: UserMapper.java
 * @Package edu.zju.cst.mapper
 * @author Zhao Qian
 */
package edu.zju.cst.mapper;

import java.util.List;

import edu.zju.cst.pojo.User;

/**
 * @author Zhao Qian
 * @date 2018年12月22日
 * @version 1.0
 */
public interface UserMapper {
	/**
	 * 根据用户id查询用户信息
	 * @param id
	 * @return
	 * @throws Exception  
	 * @throws
	 * @author Zhao Qian
	 * @date 2018年12月22日
	 */
	User findUserById(int id) throws Exception;
	/**
	 * 查询用户列表
	 * @param username
	 * @return
	 * @throws Exception  
	 * @throws
	 * @author Zhao Qian
	 * @date 2018年12月22日
	 */
	List<User> findUserByUsername(String username) throws Exception;
	/**
	 * 添加用户信息
	 * @param user
	 * @throws Exception  
	 * @throws
	 * @author Zhao Qian
	 * @date 2018年12月22日
	 */
	void insertUser(User user)throws Exception;

}

3、加载mapper接口配置文件

在核心配置文件SqlMapConfig.xml文件中导入代理配置文件

<mappers>
    <mapper resource="sqlmap/UserMapper.xml" />
</mappers>
4、测试

步骤:

1、获取session

2、获取接口代理对象

3、调用接口方法

@Test
public void testInsertUser() {
    //获取session
    SqlSession session = sqlSessionFactory.openSession();
    //获取mapper接口的代理对象
    UserMapper userMapper = session.getMapper(UserMapper.class);
    //要添加的数据
    User user = new User();
    user.setUsername("张小明");
    user.setBirthday(new Date());
    user.setSex("1");
    user.setAddress("杭州市");
    //通过mapper接口添加用户
    try {
        userMapper.insertUser(user);
    } catch (Exception e) {
        e.printStackTrace();
    }
    //提交
    session.commit();
    //关闭session
    session.close();
}
5、总结
  • selectOne和selectList

动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

  • namespace

mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

上述几篇主要提供一个案例demo。
下一篇将具体总结整理关于配置文件的一些细节问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值