Ⅰ Mybatis源码解析(1) 如何获得SQL语句
笔者只能说会使用Mybtis,并没有具体研究过源码,站在一个使用者的角度记录解决的问题。
跳过大部分源码,从一个功能点开始入手。
以 Select 操作为例,研究如何获取经过 Mybatis 中 动态语句 转换后的的 SQL语句 。
我们这里不涉及复杂的过程原理(如:读取配置文件、Mapper代理等( 我也不懂 )),只说明一下具体流程。
发现studentMapper被MapperProxy实现。
好奇的同学肯定会问studentMapper是如何创建MapperProxy实例的呢?
一路跟随瞎点。会发现一个配置类,里面东西很多,目前只看和Mapper有关系。
我们继续下一步
到此关于Mapper的运行过程已经分析完了,下面继续分析SelectOne过程。
selectOne 其实只是 selectList 取第一个元素(这点是没有想到的)。
源码解析,这还是第一次写这类文章,确实这些框架的原理,并没有研究过只是知道一点概念,Mapper动态代理之类的。网上的博客从大方向出发,框架设计、设计模式之类的,对于我这种基础薄弱的人看的云里雾里。我准备从一个一个功能开始初步了解、研究此类框架原理。
参考 https://blog.csdn.net/luanlouis/article/details/40422941
Ⅱ mybatis 自动生成的mapper能修改吗
最近使用到了generator生成代码。主要用来生成DO,DAO,*Mapper.xml。由于仅需要其生成一些基本的公用的sql操作行为(增删改查更一个方法),而且命名也需要自己的规范,所以修改了一些源码记录下来,用于备忘。
使用的版本为1.3.2。主要记录:
1.org/mybatis/generator/api/IntrospectedTable.java类:
calculateJavaClientAttributes方法修改DAO类名;
calculateModelAttributes方法修改DO类名;
calculateXmlAttributes方法修改DAO中方法名和Mapper.xml中的sql标签id。
2.org/mybatis/generator/codegen/mybatis3/javamapper/JavaMapperGenerator.java类:
getCompilationUnits方法修改DAO类中的方法,主要是删除了一个insert方法和一个update方法
3.org/mybatis/generator/codegen/mybatis3/xmlmapper/XMLMapperGenerator.java类:
getSqlMapElement方法修改Mapper.xml中sql,主要是删除了和DAO对应的一个insert和一个update
4.org/mybatis/generator/codegen/mybatis3/xmlmapper/elements/.java类:
addElements方法,修改insert sql的生成格式。mysql中如果表主键是自增加的,则每次插入返回自增ID。
[java] view plain
//get the auto_increment primary key value
sb.append("<selectKey resultType=\"java.lang.Integer\" order=\"AFTER\" keyProperty=\"id\">");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append(" SELECT LAST_INSERT_ID() AS id ");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append("</selectKey>");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append("insert into "); //$NON-NLS-1$
4.的补充。经过验证,4是错误的。其实mybatis的generator提供了该方法的可配置性。
[html] view plain
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
就会自动生成selectKey标签;
其次4的方式返回值只是成功与否的状态,不是自增主键。只不过采用了这种方式之后自增主键会被mybatis赋给DO,这样可以直接使用DO.getId()得到插入后的主键。
与selectKey标签具有相同效果的还有另外一种方式,这个方式的配置:
[html] view plain
<generatedKey column="id" sqlStatement="JDBC" identity="true"/>
5.因为generator生成的mapper.xml文件和DAO的java类放在了同级目录。我会一次性生成多个表的,这样粘贴起来很不舒服。所以改了源码,将所有生成的mapper文件放到新建的mapper目录中。
在org.mybatis.generator.api.MyBatisGenerator类中的generate方法中修改:
[java] view plain
for (GeneratedXmlFile gxf : generatedXmlFiles) {
projects.add(gxf.getTargetProject());
File targetFile;
String source;
try {
File directory = shellCallback.getDirectory(gxf
.getTargetProject(), gxf.getTargetPackage());
//make the xml file location changed
File mapDirec = new File(directory.getAbsolutePath()+"/mapper");
if(!mapDirec.exists()){
mapDirec.mkdir();
}
targetFile = new File(mapDirec, gxf.getFileName());
if (targetFile.exists()) {
if (gxf.isMergeable()) {
source = XmlFileMergerJaxp.getMergedSource(gxf,
targetFile);
} else if (shellCallback.isOverwriteEnabled()) {
source = gxf.getFormattedContent();
warnings.add(getString("Warning.11", //$NON-NLS-1$
targetFile.getAbsolutePath()));
} else {
source = gxf.getFormattedContent();
targetFile = getUniqueFileName(directory, gxf
.getFileName());
warnings.add(getString(
"Warning.2", targetFile.getAbsolutePath())); //$NON-NLS-1$
}
} else {
source = gxf.getFormattedContent();
}
} catch (ShellException e) {
warnings.add(e.getMessage());
continue;
}
callback.checkCancel();
callback.startTask(getString(
"Progress.15", targetFile.getName())); //$NON-NLS-1$
writeFile(targetFile, source, "UTF-8"); //$NON-NLS-1$
}
更改的地方是:
[java] view plain
//make the xml file location changed
File mapDirec = new File(directory.getAbsolutePath()+"/mapper");
if(!mapDirec.exists()){
mapDirec.mkdir();
}
targetFile = new File(mapDirec, gxf.getFileName());
这样即可实现。
Ⅲ 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构(附源码)
前言
zheng项目不仅仅是一个开发架构,而是努力打造一套从 前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位J2EE企业级开发解决方案。
项目介绍
基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构,提供整套公共微服务服务模块:内容管理、支付中心、用户管理(包括第三方)、微信平台、存储系统、配置中心、日志分析、任务和通知等,支持服务治理、监控和追踪,努力为中小型企业打造全方位J2EE企业级开发解决方案。
技术
名称
官网
技术
名称
官网
架构图
模块依赖
Spring+SpringMVC+Mybatis框架集成公共模块,包括公共配置、MybatisGenerator扩展插件、通用BaseService、工具类等。
基于bootstrap实现的响应式Material Design风格的通用后台管理系统,zheng项目所有后台系统都是使用该模块界面作为前端展示。
各个子系统前台thymeleaf模板,前端资源模块,使用nginx代理,实现动静分离。
本系统是基于RBAC授权和基于用户授权的细粒度权限控制通用平台,并提供单点登录、会话管理和日志管理。接入的系统可自由定义组织、角色、权限、资源等。用户权限=所拥有角色权限合集+用户加权限-用户减权限,优先级:用户减权限>用户加权限>角色权限
文件存储系统,提供四种方案:
阿里云OSS
服务网关,对外暴露统一规范的接口和包装响应结果,包括各个子系统的交互接口、对外开放接口、开发加密接口、接口文档等服务,可在该模块支持验签、鉴权、路由、限流、监控、容错、日志等功能。示例图:
API网关
内容管理系统:支持多标签、多类目、强大评论的内容管理,有基本单页展示,菜单管理,系统设置等功能。
统一扫码支付
通用用户管理系统, 实现最常用的用户注册、登录、资料管理、个人中心、第三方登录等基本需求,支持扩展二次开发。
微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理、消息群发等基础功能外,还有二维码推广、营销活动、微网站、会员卡、优惠券等。
微信小程序后台
基于Netty实现SocketIO的实时推送系统。支持命名空间、二进制数据、SSL、ACK等功能。
环境搭建
开发指南
maven编译安装zheng/pom.xml文件即可
启动演示
约定优于配置(convention over configuration),此框架约定了很多编程规范,下面一一列举:
数据库模型
拓扑图
Ⅳ 如何学习hibernate源码
我来分享一下查看源码的方法:
查看源码的首要任务是要有一款上手的工具,这里用的是 IDEA。IDEA 的功能比较强大,包括 查看类结构图,debug。这两个是查看源码的关键功能。
查看源码可以静态查看和动态查看,静态查看的方法是查看类图,还有 ALT + f7 查看方法在哪里被调用或者类在哪里被调用。在看 spring 源码的时候就是用这种方法,不过这种方法对阅读者的要求比较高,包括要了解这个方法的执行,设计模式的理解,以及框架是如何配置这个类的。第二种方法是 debug。debug 方法是后来才发现的一个重要的 查看源码的方法,要点是掌握执行栈,就能掌握整个执行流程。比如这个是在debug hibernate 源码的时候的截图,可以看到这个执行栈非常深,从 spring-data-jpa 到 hibernate 中间经过好几层的代理,主要完成一些适配,事务,拦截器等等操作,然后再到 hibernate 核心代码,最后就是 jdbc 的 statement。方法栈中的每一个方法都是可以查看的,里面的变量有时候是代理了好几层,所以要 F7 进去才能看到真正的执行类。
上面是简单的简述 mybatis 的 cache 机制的源码,真正想让读者明白的是,debug 如何查看源码,查看源码需要抓住一个主题,不然在阅读庞大的框架的时候会找不着北。
所以,阅读源码需要掌握工具使用,debug, 查看类图,查看方法在哪里调用,软知识是要掌握设计模式,对框架的概念有了解。
Ⅳ 如何在idea中使用Mybatis-generator插件快速生成代码
IntelliJ idea 开发工具的相关资料很少,加大了大家入手的难度,今天就以mybatis的插件安装做下示例,可能对于已经会用的人不值一提但是对于我们这些天资一般刚开始使用,我想还是会有些帮助。
安装步骤:
1.下载插件
mybatis 插件
插件下载完毕,存放指定位置,文件名默认应该是:mybatis-plus.jar
2.打开Intellij idea工具,打开菜单 File --> settings 选择 Plugs,点击Install plug from disk,选择刚刚下载的插件jar文件,确认后,会直接显示mybatis插件和其信息,表示安装成功。
3.插件安装后,打开settings,会有Mybatis一项!