Ⅰ 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一項!