mapper代理开发方法

此案例沿用mybatis开发原始dao的结果

分析

mapper代理方法要生成一个代理对象,代理对象内部执行的方法内容类似原始dao开发的dao实现类。
mapper代理类方法主要是对调用sqlsession的方法进行封装,如下:

sqlSession.selectOne("test.findUserById", id)
sqlSession.selectList("test.findUserByName", "张")
sqlSession.insert("test.insertUser", user);

对以上代码进行哪些封装?
什么时候调用sqlSession 的selectOne方法、什么时候调用sqlSession 的selecList方法,什么时候 调用insert……

解决方法:可以根据映射文件中标签类型一决定是执行select方法还是执行insert方法等。

硬编码的statement的id如何封装?
解决方法:要解决映射文件中statement和mapper接口的方法的对应关系,在生成的代理对象方法中就知道该 代理对象的方法对应去调用哪个映射文件中statement。

开发规范(四个)

mybatis要解决映射文件中statement和mapper接口的方法对应起来。
可以遵循一个开发规范让statement和mapper接口的方法对应起来:
1、映射文件和mapper接口类的对应
映射文件中namespace等于mapper接口类路径
第一步:在src下创建一个mapper包并创建接口类
这里写图片描述
第二步:在config下创建一个mapper文件夹,并创建与接口类同名的映射文件
这里写图片描述
这里写图片描述
2、statement和mapper接口的方法对应
将映射文件中statement的id和mapper中方法名一致
这里写图片描述
这里写图片描述
3、让mapper的接口方法的输入参数类型和statement的parameterType指定的参数类型保持一致
这里写图片描述
这里写图片描述
4、让mapper的接口方法返回值类型和statement的resultType指定的类型保持一致
这里写图片描述
这里写图片描述

代码实现

  • 映射文件
<?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映射文件,里面是以sql语句为单位进行配置,最终将sql语句封装到MappedStatement对象中
    namespace:命名空间的作用是更好的对sql语句进行隔离,方便管理sql
    注意:mybatis的mapper代理开发方式时namespace的特殊作用如下:
    namespace等于mapper接口类路径,这样通过映射文件找到对应的mapper接口类
 -->
<mapper namespace = "com.bsw.mybatis.mapper.UserMapper">
    <!-- 
        根据用户id查询用户信息 
        select:主要用于查询,配置sql语句、输入参数的类型,输出结果的类型
            最终该select标签中所配置的内容会封装到MapperedStatement对象中,可以讲该select称之为statement
        id:是唯一标识namespace下的sql语句,也是statement的id

        parameterType:指定输入参数的类型(简单类型\POJO类型)
        #{}:表示一个占位符
        #{value}:value表示接收一个输入参数的值,如果要接收的输入参数是简单类型,#{}里面可以写value或其他名称
        resultType:将sql查询的结果集映射成java对象
            *号会查询回很多个列的信息,所以需要将结果集封装到一个POJO类中,这个POJO中的属性名称必须与数据表的列名相等
            指定单条记录所映射的java对象
    -->
    <select id="findUserById" parameterType="int" resultType="com.bsw.domain.User">
        SELECT * FROM USER WHERE id = #{id}
    </select>
</mapper>
  • 接口类
public interface UserMapper {
    // 根据用户id查询用户信息
    public User findUserById(int id);
}
  • 将映射文件添加到SqlMapConfig.xml中,由SqlMapConfig.xml全局配置文件加载Mapper.xml文件

测试

package com.bsw.daoTest;

import static org.junit.Assert.*;

import java.io.InputStream;

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.bsw.domain.User;
import com.bsw.mybatis.mapper.UserMapper;

public class UserMapperTest {

    // 创建成员变量会话工厂
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws Exception {
        // 配置全局配置文件
        String resource = "SqlMapConfig.xml";

        // 创建mybatis的全局配置文件的流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建会话工厂
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void testFindUserById() {

        // 创建会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 生成代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        // 调用mapper
        User user = mapper.findUserById(1);
        System.out.println(user);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值