給“小白”漫畫+圖示講解MyBatis原理,就問香不香!

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/cb/cbc1b08f8d1a2cfc496dfcbe233d5fd3.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"MyBatis一款後起之秀的持久層框架ORM,支持自定義SQL、存儲過程和高級映射,相對於Hibernate算是半自動化的框架,在國內行業內非常流行。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/d4/d4aaff018182af74259257f0bed01548.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/bd/bdb1781347e6b1bc8061e326a3bafee8.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"常規的JDBC操作,配置相應的數據庫連接的信息,比如賬戶密碼等,應用加載數據庫驅動並手動創建數據庫連接,編寫業務sql並設置其入參生成Statement對象用於執行,獲取結果數據集,及時釋放持有資源,再對結果集進行數據處理。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/1c/1cafbfb7b0bd372f74a75d0c60ea9d83.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"加載驅動、創建連接、返回結果、釋放資源等等都是重複的體力活,爲了不把自己忙碌成代碼的搬運工,這些都可以封裝由框架去做,而自己關注最核心的業務層,也就是sql相關的邏輯。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/6a/6aec10c36da11b719dc9d51046b384a0.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/20/20bffd818b5b279be2d13de44b1cbfdf.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"把業務相關的sql邏輯配置在mapper.xml文件中,包括入參和返回的結果集,這其中會涉及到數據庫中的字段和Java對象的字段之間的映射,一般如果字段名和類型相同可以通過MyBatis的自動映射即可,如果差別較大,則需要手動映射,甚至自定義類型處理typeHandlers。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個MyBatis的應用都會以一個SqlSessionFacotry的實例爲核心的,SqlSessionFacotryBuilder通過build加載核心配置文件mybatis-config.xml,從而創建SqlSessionFacotry,再由SqlSessionFacotry創建SqlSession。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"核心配置文件mybatis-config.xml包含mapper.xml文件,在SqlSessionFacotryBuilder加載核心配置文件時一同加載進來,形成Configuration實例,其中mapper.xml的每個select/update/insert/delete節點都會最終生成MappedStatement對象,簡單理解就是對應的完整sql語句,類似JDBC的Statement角色。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"實際上核心配置文件除了包含mapper.xml,還包含數據庫連接、事務、類型別名、類型處理器、插件、環境配置等等。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/99/999abb41ac6e67946921b9e598d671ec.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/da/da0a56a85b28f923ad43897886431517.jpeg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"1. 準備工作:創建數據庫和項目"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"創建數據庫腳本"}]},{"type":"codeblock","attrs":{"lang":"sql"},"content":[{"type":"text","text":"CREATE DATABASE `mybatisdemo`;\nUSE mybatisdemo;\nCREATE TABLE `user` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`name` varchar(20) DEFAULT NULL,\nPRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"創建maven項目,並在pom中添加mybatis和mysql驅動依賴包"}]},{"type":"codeblock","attrs":{"lang":"html"},"content":[{"type":"text","text":"\n org.mybatis\n mybatis\n 3.5.5\n\n\n MySQL\n mysql-connector-java\n 5.1.40\n"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"2.添加核心配置文件mybatis-config.xml"}]},{"type":"codeblock","attrs":{"lang":"html"},"content":[{"type":"text","text":"\nn PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"3. UserMapper.xml的配置 "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"包含了插入數據的insert和查詢數據的select,其中插入式通過設置useGeneratedKeys爲true,返回自增id。"}]},{"type":"codeblock","attrs":{"lang":"html"},"content":[{"type":"text","text":"\nn PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n\n \n \n insert into user(name) values(#{name})\n \n \n \n \n \n \n \n \n"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"4. UserMapper.xml相對應Dao"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"UserMapper.java的代碼如下,包含了相應插入和查詢接口"}]},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"package com.zhaiqianfeng.user;\n\npublic interface UserMapper {\n User getUserById(int id);\n int insertUser(User user);\n}"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"5. 創建SqlSession並驗證"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一切都準備好之後,開始創建SqlSession並執行"}]},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"public static void main( String[] args ) throws IOException {\n String config= \"mybatis-config.xml\";\n InputStream inputStream= Resources.getResourceAsStream(config);\n //SqlSessionFactoryBuilder加載核心(+mapper)配置文件並創建SqlSessionFactory\n SqlSessionFactory sqlSessionFactory= \n new SqlSessionFactoryBuilder().build(inputStream);\n\n //創建SqlSession\n try(SqlSession sqlSession=sqlSessionFactory.openSession()) {\n //獲取mapper\n UserMapper mapper = sqlSession.getMapper(UserMapper.class);\n\n User user = new User();\n user.setName(\"chris\");\n\n //執行操作\n mapper.insertUser(user);\n sqlSession.commit(); //flush\n System.out.println(\"獲取自增id:\" + user.getId());\n\n user = mapper.getUserById(user.getId());\n System.out.println(\"剛剛入庫的user對象\" + user);\n }\n}"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此時的項目結構是這樣的"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/59/598fff757f68f67e0769824b1a68e101.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"運行main之後打印"}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"獲取自增id:1 "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"剛剛入庫的user對象User(id=1, name=chris)"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"查看數據庫"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/07/07953203a0fcd83aadabb986dda3a91f.jpeg","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"優化"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於本例中的數據庫表字段和Java對象的字段名一致,所以在UserMapper.xml中的resultMap可以省略,直接用resultType,mybatis會悄悄自動映射生成resultMap,省略後如"}]},{"type":"codeblock","attrs":{"lang":"html"},"content":[{"type":"text","text":"\nn PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n\n \n insert into user(name) values(#{name})\n \n \n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"還可以再簡化,比如使用別名替換權限定名(com.zhaiqianfeng.user.User)等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"PS:本篇文章主要是通過漫畫和圖並結合對比常規JDBC來講解MyBatis的原理和設計目標,比較適合新手閱讀,感謝閱讀。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":9}}],"text":"源碼地址:https://github.com/zhaiqianfeng/codeceo-demo/tree/master/mybatis/mybatis-demo-1"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(完)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最新、更多漫畫請關注微信公衆號:"},{"type":"text","marks":[{"type":"strong"}],"text":"碼農神說"},{"type":"text","text":"。轉載開白可聯繫助手,微信號:codeceo-01"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"相關閱讀"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/81029df24c99eb5911edf3bbb","title":""},"content":[{"type":"text","text":"闢謠:程序員不配談戀愛?你錯的可以!真相來了"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/41846b3fa362bbef382c6babf","title":null},"content":[{"type":"text","text":"面試官:CAP 都搞不清楚,別跟我說你懂微服務!"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/b7195f780e45dd68a827dffb1","title":null},"content":[{"type":"text","text":"看看吧!28歲退休的程序員和P8都幹了啥"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/56c1c92104e7b4e0ae67ddfca","title":null},"content":[{"type":"text","text":"千萬不能讓程序員給娃娃取名字"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/8dfe1ea299db76c33e37a4056","title":null},"content":[{"type":"text","text":"漫畫 | 啊哈,給我一碗孟婆湯"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/c2c7ecc71c17ec054e9c62fd3","title":null},"content":[{"type":"text","text":"漫畫 | 人工智能之機械基"}]}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章