`
sxk4429
  • 浏览: 40533 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mybatis Dao 接口 没有实现类的源码实现

阅读更多
注意:TestTable 为POJO,TestTableMapper为DAO接口,mappingXml 为sql 配置文档,专业点叫sql mapper

Mybatis 有一个调用dao的方式 ,如下:
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
SqlSession session= sqlMapper.openSession();
TestTableMapper t= session.getMapper(TestTableMapper.class);
TestTable tt=(TestTable)t.selectByPrimaryKey("wwww");

TestTableMapper是一个inteface,不是一个class,并且我查看了用mybatis genetator产生的code,没有该接口的实现的..冷,我当时以为我用generator产生的code有问题,可是,用上面一段code跑一下,竟然有从DB query到值. 恩,有玄机,哥哥于是准备吃点亏,翻源码来瞧瞧.

玄机就在session.getMapper()
session.getMapper()使用了代理,当调用一次此方法,都会产生一个代理class的instance,看看这个代理class的实现.
public class MapperProxy implements InvocationHandler {
...
public static <T> T newMapperProxy(Class<T> mapperInterface, SqlSession sqlSession) {
    ClassLoader classLoader = mapperInterface.getClassLoader();
    Class<?>[] interfaces = new Class[]{mapperInterface};
    MapperProxy proxy = new MapperProxy(sqlSession);
    return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
  }

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if (!OBJECT_METHODS.contains(method.getName())) {
      final Class<?> declaringInterface = findDeclaringInterface(proxy, method);
      final MapperMethod mapperMethod = new MapperMethod(declaringInterface, method, sqlSession);
      final Object result = mapperMethod.execute(args);
      if (result == null && method.getReturnType().isPrimitive()) {
        throw new BindingException("Mapper method '" + method.getName() + "' (" + method.getDeclaringClass() + ") attempted to return null from a method with a primitive return type (" +    method.getReturnType() + ").");
      }
      return result;
    }
    return null;
  }
这里是用到了JDK的代理Proxy。
newMapperProxy()可以取得实现interfaces 的class的代理类的实例,当执行interfaces中的方法的时候,会自动执行invoke()方法,其中public Object invoke(Object proxy, Method method, Object[] args)中 method参数就代表你要执行的方法.

MapperMethod类会使用method方法的methodName 和declaringInterface去取 sqlMapxml 取得对应的sql,也就是拿declaringInterface的类全名加上 sqlid..
贴一点sqlMap xml 看看..
<mapper namespace="com.whisper.dao.TestTableMapper">
   <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">

嘿嘿,总结一下,其实就是用了 jdk的代理类而已....
分享到:
评论
3 楼 yh4s 2015-11-11  
2 楼 hanson08 2015-03-20  
厉害,非常理解了。不知道有对mybatis参数映射与结果映射底层的相关讲解?
1 楼 陈颜宇 2015-01-04  
哥哥很强大

相关推荐

    Mybatis通用DAO设计封装(mybatis)

    在设计一个通用的DAO(Data Access Object)时,我们的目标是创建一套可复用的接口和实现,以减少重复的代码并提高代码的可维护性。以下是一些关键的设计原则和实现方式: 1. **接口定义**: 创建一个基类`...

    mybatis-3-mybatis-3.5.8.zip源码

    10. **XML配置文件和注解映射**: MyBatis支持XML方式和注解方式来定义SQL语句和映射关系,通过`@Select`, `@Insert`, `@Update`, `@Delete`等注解可以直接在DAO接口的方法上编写SQL。 11. **插件机制**: MyBatis...

    《spring+mybatis 企业应用实战》源码、类库全资料

    3. **DAO层**:MyBatis的Mapper接口和Mapper XML文件,Mapper XML文件中编写SQL语句,Mapper接口对应地定义了方法。 4. **实体类**:表示数据库中的表,通常包含对应的getter和setter方法。 5. **Controller层**:...

    mybatis3.4.1jar包及框架源码

    通过Spring的`SqlSessionFactoryBean`和`SqlSessionTemplate`,可以轻松地将MyBatis集成到Spring应用中,实现DAO的自动装配和事务管理。 在实际项目中,下载MyBatis 3.4.1的jar包和源码有助于理解和学习MyBatis的...

    SpringBoot+Mybatis整合完整源码

    - **Service 与 Dao 层**:在 Service 层中注入 Dao 层的 Mapper 接口,通过接口方法进行数据库操作。 4. **实战示例** 例如,创建一个用户管理模块,包括 User 实体类、UserMapper 接口、UserMapper.xml 文件、...

    阿里巴巴P7架构师纯手工打造MyBatis源码——1小时解密底层源码.txt

    本篇文章将基于阿里巴巴P7架构师纯手工打造的MyBatis源码解析资料,深入探讨MyBatis的核心原理及其内部实现机制。本文旨在帮助读者理解MyBatis的工作原理,并为日后进行更深层次的技术研究提供一定的理论基础。 ###...

    mybatis-3.2.3 jar包和源码

    - 包含MyBatis框架的核心类和接口,如SqlSession、Executor、Mapper等。 - 提供了MyBatis运行时需要的组件和服务,如日志、配置解析等。 - 包含了MyBatis运行时依赖的一些第三方库,如SLF4J日志库。 4. **...

    SpringMVC+MyBatis开发从入门到实践源码

    处理器可以是Controller接口的实现类,或者使用@Controller注解的类。SpringMVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等,用于呈现数据。Model-View-Controller模式的分离使得代码结构清晰,易于维护。 ...

    SpringBoot+JSP+Mybatis用户管理员工项目源码

    MyBatis的相关配置如Mapper XML文件通常放在`resources`目录下的`mapper`子目录,实体类(Entity)和Service接口及实现类则在`java`目录下相应包中。 5. **Spring Data JPA与MyBatis的集成**:尽管Spring Boot默认...

    mybatis逆向工程(附源码)

    MyBatis逆向工程是一种强大的工具,它可以帮助开发者自动生成数据访问对象(DAO)和JavaBean类,从而简化了数据库模型层的编码工作。在Java Web开发中,MyBatis作为一个优秀的持久层框架,提供了灵活的SQL映射机制,...

    mybatis-generator 代码生成 , 源码132

    默认提供了一系列模板,覆盖了常见的需求,如Entity类、Mapper接口、Mapper XML文件、DAO实现类等。 3. **配置文件**:通过一个XML配置文件,用户可以指定数据库连接信息、需要生成的表、生成代码的目标位置等。...

    mybatis-plus源码

    - **核心类和接口**:深入研究BaseMapper、BaseService、QueryWrapper等关键类的实现。 - **SQL生成逻辑**:探究条件构造器如何根据传入参数动态生成SQL语句。 - **事务管理**:学习SqlSessionTemplate如何处理事务...

    《深入浅出 MyBatis 技术原理与实战》源码

    通过这些源码,我们可以学习到如何创建和配置 MyBatis 环境,编写 Mapper 映射文件,设计和实现 Mapper 接口,处理结果映射,以及如何在 Service 和 Dao 层进行交互。此外,还能了解到 MyBatis 的事务控制、缓存机制...

    基于springboot+mybatis+mysql的电脑商城源码.zip

    这是一个基于Spring Boot、MyBatis和MySQL数据库技术构建的电子商务平台源码,名为"电脑商城"。这个项目展示了如何在实际开发中运用这些技术来创建一个功能完善的在线购物系统。 **Spring Boot** Spring Boot是...

    SpringBoot+mybatis+增删改查完整源码

    - **Mapper接口**:Mybatis允许我们定义Mapper接口,每个方法对应一个SQL查询,通过`@Mapper`注解标记接口,Mybatis会自动生成实现类。 - **XML配置**或**注解**:Mybatis支持在XML文件中编写SQL语句,也可以使用...

    Maven+SpringBoot+MyBatis+MySQL实现增删改查源码

    在业务逻辑层(Service),你可以定义服务接口和实现类,以调用DAO层进行数据操作。 实现CURD操作时,首先需要创建一个数据库表,对应于一个实体类。然后,在MyBatis的Mapper接口中定义对应的CRUD方法,并在XML文件...

    非常重要的一张图-分析编写dao实现类Mybatis的执行过程.png

    非常重要的一张图-分析编写dao实现类Mybatis的执行过程,非常详细的介绍了mybatis非代理实现Dao过程,讲解了Mybatis中使用DaoImpl实现持久层Dao的方法。讲解了为什么可以使用Sqlsession.update()方法,删除数据。

    MyBatis入门实例源码

    4. **注解方式**:除了XML配置,MyBatis也支持注解方式进行映射,可以直接在DAO接口的方法上使用@Select、@Insert、@Update、@Delete等注解来写SQL。 5. **实体类(POJO)**:在项目中,我们通常会为每张数据库表...

    springmvc+mybatis简单实现源码

    5. **编写 Service**:在 Service 层调用 Mapper 接口执行数据库操作,通常会注入由 Spring 管理的 Dao 层组件。 6. **配置 DispatcherServlet**:设置 Spring MVC 的拦截器、视图解析器等。 7. **编写 Controller**...

    mybatis-generator-1.3.2源码

    MyBatis Generator(MBG)是一个实用工具,它可以在Java项目中自动生成MyBatis的SQL映射文件、DAO接口和实现类,以及实体类。版本1.3.2是MBG的一个稳定版本,经过了测试,确保了其在生成代码时的可靠性和兼容性。 ...

Global site tag (gtag.js) - Google Analytics