注意: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的代理类而已....
分享到:
相关推荐
非常重要的一张图-分析编写dao实现类Mybatis的执行过程,非常详细的介绍了mybatis非代理实现Dao过程,讲解了Mybatis中使用DaoImpl实现持久层Dao的方法。讲解了为什么可以使用Sqlsession.update()方法,删除数据。
1、增加Dao配套的Service接口和实现类。 2、去掉Example相关的类,只保留基础的增删改查方法个代码,减少代码量更清爽。 3、常用配置项外置到config.properties中,修改更加方便。 4、原XML格式为两个个空格缩进,现...
mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis ...
业务逻辑层(Service层):该层由若干Service接口和实现类组成。逻辑层主要用于实现系统的业务逻辑。 Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。 总结: 云借阅图书管理系统主要实现了两大功能...
修改了mybatis-generator的源码,实现生成中文注释,打成的jar包,
源码部分包含了完整的项目结构,包括前端页面、后端控制器、实体类、DAO层接口、Service层接口及实现类、Mapper文件等。部署说明部分详细描述了如何将项目部署到Tomcat服务器上,以便进行测试和运行。演示视频展示了...
数据访问层(DAO层):该层由若干的DAO接口和Mybatis映射文件组成,接口和映射文件名必须一致 业务逻辑层(Service层):该层由若干Service接口和实现类组成。在本系统中,业务逻辑的接口统一使用Service结尾,其实现...
还是没得,恩,我加了jdbc的包,还是没有,我以为是没有源码,下载了,还是没有提示,棒 没有提示,我追了下源码,找set方法,我知道有4个,所以找得到,除此之外,还有一些其他属性可以设置 编写jdbc_mysql....
对于另外10%的个性场景,你可以通过扩展dao接口,增加新的方法实现。使用说明 1. 下载源码,编译、打包,得到 mybatis-daoj.tar.gz 。 2. 解压 mybatis-daoj.tar.gz, 打开 conf/mybatis-daoj.xml,配置数据库连接...
业务逻辑层(Service层):该层由若干Service接口和实现类组成。逻辑层主要用于实现系统的业务逻辑。 Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。 基于SSM框架的云借阅图书管理系统(源码+...
- dao(所有的数据库操作,基于Mybatis实现) - entity(所有的实体类信息,POJO) - service(所有的系统服务都,主要有Spring就行事务的管理) - util(工具包) - web(主要是作为前端控制器,由struts实现...
源码部分包含了项目的核心代码,包括数据库表结构设计、实体类、DAO层接口、Service层接口及实现类、Controller层接口及实现类等。通过阅读源码,开发者可以了解到项目的架构设计、技术选型以及各个模块之间的交互...
分析mybatis源码,抽离出最核心的函数,简化mybatis的功能,并且重新设计和复写。以此更加深刻理解mybatis源码。 源码分析 先看测试类: package uestc.zhangkx; import org.apache.ibatis.io.Resources; import org...
Dao层首先设计的是接口,然后再Spring的配置文件中定义接口的实现类。 然后可以在模块中进行接口的调用来进行数据业务的处理。(不在关心接口的实现类是哪个类) 数据源的配置以及有关数据库连接的参数都在Spring的...
Dao层首先设计的是接口,然后再Spring的配置文件中定义接口的实现类。 然后可以在模块中进行接口的调用来进行数据业务的处理。(不在关心接口的实现类是哪个类) 数据源的配置以及有关数据库连接的参数都在Spring的...
源码结构:源码按照模块划分,主要包括以下部分:core:核心模块,包括实体类、DAO接口、Service接口及实现类、Controller类等;service:业务逻辑处理模块,包括各个子模块的Service实现;web:Web层处理模块,包括...
源码:论文中的源码部分包含了项目的主要代码文件,包括实体类、DAO层接口、Service层接口及实现类、Controller层接口及实现类等。这些代码文件遵循了SSM框架的设计规范,实现了项目的基本功能。部署说明:部署说明...
在本系统中,业务逻辑层的接口统一使用Service结尾,其实现类名称统一在接口名后加Impl。该层主要用于实现系统的业务逻辑。 Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。Controller类主要负责...
源码部分包含了项目的核心代码,包括实体类、DAO层接口、Service层接口及实现类、Controller层及前端页面等。通过阅读源码,开发者可以深入了解系统的架构设计和业务逻辑,为后续开发和维护工作提供参考。部署说明...
4.service的实现类中,新增和更新操作已实现字符串解析功能.此类尤其建议使用超类(basic包下)自适应获取数据库的分页方法. 5.controller: 包含add,update,delete,info,list方法,包含try-catch与返回值. 注:超类使用...