Mybatis通过接口实现数据操作的自我理解

通常mybatis的操作步骤:

1.SqlSession sqlSession = DBUtil.getSessionFactory().openSession();

System.out.println(sqlSession.getClass().getName());//org.apache.ibatis.session.defaults.DefaultSqlSession

2.UserDao userDao = sqlSession.getMapper(UserDao.class);

3.User u = userDao.selectUserById(1);

那么UserDao userDao = sqlSession.getMapper(UserDao.class)是怎么得到的?以及如何和xml定义的查询方法关联起来的?

具体主要流程步骤:

首先加载配置文件mybatis-config.xml => UserMapper.xml

当加载到UserMapper.xml文件时,通过namespace="mybatis.demo.dao.UserDao" 创建UserDao对象,并且UserDao对象以key的方式放到MapperRegistry(mapper注册器)中(见名知意),

那么既然有key,value传入的是什么呢?通过查看源码,value是一个UserDao的代理对象,且实现了UserDao接口;

源码:

final MapperProxyFactory mapperProxyFactory = (MapperProxyFactory)knownMappers.get(type);

if (mapperProxyFactory == null)

     throw new BindingException("Type " + type + " is not known to the MapperRegistry.");

try {

    return mapperProxyFactory.newInstance(sqlSession);

} catch (Exception e) {

    throw new BindingException("Error getting mapper instance. Cause: " + e, e);

}

mapperProxyFactory:mapper代理工厂,生成的对象就是代理对象;

至于MapperRegistry对象里面的value为什么是代理对象且实现了UserDao接口?

UserDao userDao = sqlSession.getMapper(UserDao.class);

userDao该对象通过debug可得知为:org.apache.ibatis.binding.MapperProxy@5c5eefef类型,既然能用UserDao接收,所以应该实现了UserDao接口;

UserMapper.xml的作用:

通过该文件可以生成一个实现了UserDao接口的代理对象;并把UserDao对象当做key,代理对象当做value放到MapperRegistry中;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、...
    七寸知架构阅读 6,740评论 6 56
  • 1 缓存介绍# MyBatis支持声明式数据缓存(declarative data caching)。当一条SQL...
    七寸知架构阅读 2,173评论 2 51
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,680评论 0 4
  • 单独使用mybatis是有很多限制的(比如无法实现跨越多个session的事务),而且很多业务系统本来就是使用sp...
    七寸知架构阅读 3,496评论 0 53
  • 1 引言# 本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybait...
    七寸知架构阅读 76,636评论 36 979