
一、簡介什么是 MyBatisMyBatis 是一款優(yōu)秀的持久層框架它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJOPlain Old Java Objects普通老式 Java 對象為數(shù)據(jù)庫中的記錄。Mybatis網(wǎng)址https://mybatis.org/mybatis-3/zh_CN/index.html二、引入1、安裝要使用 MyBatis 只需將mybatis-x.x.x.jar 文件置于類路徑classpath中即可。如果使用 Maven 來構(gòu)建項目則需將下面的依賴代碼置于 pom.xml 文件中dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversionx.x.x/version/dependency2、配置在 application.properties 或 application.yml 中配置數(shù)據(jù)庫連接和 MyBatis 的基礎(chǔ)路徑# application.properties# 數(shù)據(jù)庫連接配置spring.datasource.urljdbc:mysql://localhost:3306/your_databasespring.datasource.usernamerootspring.datasource.passwordyour_password spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver# MyBatis 配置# 指定 Mapper XML 文件的位置如果使用 XML 方式mybatis.mapper-locationsclasspath:mapper/*.xml# 指定實體類所在的包方便在 XML 中直接使用類名mybatis.type-aliases-packagecom.example.domain三、使用1、使用注解寫 SQL使用注解寫 SQL適合簡單查詢直接在方法上使用 Select、Insert 等注解編寫 SQL非常簡潔。packagecom.example.mapper;importcom.example.domain.User;importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Select;MapperpublicinterfaceUserMapper{Select(SELECT * FROM users WHERE id #{id})UserfindById(Longid);}2、使用 XML 映射文件使用 XML 映射文件適合復雜 SQL創(chuàng)建一個與 Mapper 接口全限定名相同的 XML 文件Mapper 接口packagecom.example.mapper;importcom.example.domain.User;importorg.apache.ibatis.annotations.Mapper;MapperpublicinterfaceUserMapper{UserfindById(Longid);}XML 映射文件 (src/main/resources/mapper/UserMapper.xml)namespace 必須指向?qū)?Mapper 接口id 必須與方法名一致。?xml version1.0 encodingUTF-8 ?!DOCTYPEmapperPUBLIC-//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmappernamespacecom.example.mapper.UserMapperselectidfindByIdresultTypecom.example.domain.UserSELECT * FROM users WHERE id #{id}/select/mapper在 Service 或 Controller 中直接使用完成以上步驟后你就可以像使用普通的 Spring Bean 一樣通過 Autowired 注入 Mapper 并調(diào)用其方法了。ServicepublicclassUserService{AutowiredprivateUserMapperuserMapper;// 直接注入接口Spring 會提供代理實現(xiàn)publicUsergetUser(Longid){returnuserMapper.findById(id);}}四、參數(shù)說明1、SELECT查詢語句是 MyBatis 中最常用的元素之一——光能把數(shù)據(jù)存到數(shù)據(jù)庫中價值并不大還要能重新取出來才有用多數(shù)應用也都是查詢比修改要頻繁。 MyBatis 的基本原則之一是在每個插入、更新或刪除操作之間通常會執(zhí)行多個查詢操作。因此MyBatis 在查詢和結(jié)果映射做了相當多的改進。一個簡單查詢的 select 元素是非常簡單的。比如selectidselectPersonparameterTypeintresultTypehashmapSELECT * FROM PERSON WHERE ID #{id}/selectselect 元素允許你配置很多屬性來配置每條語句的行為細節(jié)。selectidselectPersonparameterTypeintparameterMapdeprecatedresultTypehashmapresultMappersonResultMapflushCachefalseuseCachetruetimeout10fetchSize256statementTypePREPAREDresultSetTypeFORWARD_ONLYSelect 元素的屬性屬性描述id在命名空間中唯一的標識符可以被用來引用這條語句。parameterType將會傳入這條語句的參數(shù)的類全限定名或別名。這個屬性是可選的因為 MyBatis 可以通過類型處理器TypeHandler推斷出具體傳入語句的參數(shù)默認值為未設置unset。parameterMap用于引用外部 parameterMap 的屬性目前已被廢棄。請使用行內(nèi)參數(shù)映射和 parameterType 屬性。resultType期望從這條語句中返回結(jié)果的類全限定名或別名。 注意如果返回的是集合那應該設置為集合包含的類型而不是集合本身的類型。 resultType 和 resultMap 之間只能同時使用一個。resultMap對外部 resultMap 的命名引用。結(jié)果映射是 MyBatis 最強大的特性如果你對其理解透徹許多復雜的映射問題都能迎刃而解。 resultType 和 resultMap 之間只能同時使用一個。flushCache將其設置為 true 后將會導致本條語句的結(jié)果被二級緩存緩存起來默認值對 select 元素為 true。useCache將其設置為 true 后將會導致本條語句的結(jié)果被二級緩存緩存起來默認值對 select 元素為 true。timeout這個設置是在拋出異常之前驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認值為未設置unset依賴數(shù)據(jù)庫驅(qū)動。fetchSize這是一個給驅(qū)動的建議值嘗試讓驅(qū)動程序每次批量返回的結(jié)果行數(shù)等于這個設置值。 默認值為未設置unset依賴驅(qū)動。statementType可選 STATEMENTPREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 StatementPreparedStatement 或 CallableStatement默認值PREPARED。resultSetTypeFORWARD_ONLYSCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT等價于 unset 中的一個默認值為 unset 依賴數(shù)據(jù)庫驅(qū)動databaseId如果配置了數(shù)據(jù)庫廠商標識databaseIdProviderMyBatis 會加載所有不帶 databaseId 或匹配當前 databaseId 的語句如果帶和不帶的語句都有則不帶的會被忽略。resultOrdered這個設置僅針對嵌套結(jié)果 select 語句如果為 true則假設結(jié)果集以正確順序排序后執(zhí)行映射當返回新的主結(jié)果行時將不再發(fā)生對以前結(jié)果行的引用。 這樣可以減少內(nèi)存消耗。默認值false。resultSets這個設置僅適用于多結(jié)果集的情況。它將列出語句執(zhí)行后返回的結(jié)果集并賦予每個結(jié)果集一個名稱多個名稱之間以逗號分隔。2、INSERT, UPDATE 和 DELETE數(shù)據(jù)變更語句 insertupdate 和 delete 的實現(xiàn)非常接近insertidinsertAuthorparameterTypedomain.blog.AuthorflushCachetruestatementTypePREPAREDkeyPropertykeyColumnuseGeneratedKeystimeout20updateidupdateAuthorparameterTypedomain.blog.AuthorflushCachetruestatementTypePREPAREDtimeout20deleteiddeleteAuthorparameterTypedomain.blog.AuthorflushCachetruestatementTypePREPAREDtimeout20Insert, Update, Delete 元素的屬性屬性描述id在命名空間中唯一的標識符可以被用來引用這條語句。parameterType將會傳入這條語句的參數(shù)的類全限定名或別名。這個屬性是可選的因為 MyBatis 可以通過類型處理器TypeHandler推斷出具體傳入語句的參數(shù)默認值為未設置unset。parameterMap用于引用外部 parameterMap 的屬性目前已被廢棄。請使用行內(nèi)參數(shù)映射和 parameterType 屬性。flushCache將其設置為 true 后只要語句被調(diào)用都會導致本地緩存和二級緩存被清空默認值對 insert、update 和 delete 語句true。timeout這個設置是在拋出異常之前驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認值為未設置unset依賴數(shù)據(jù)庫驅(qū)動。statementType可選 STATEMENTPREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 StatementPreparedStatement 或 CallableStatement默認值PREPARED。useGeneratedKeys僅適用于 insert 和 update這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵比如像 MySQL 和 SQL Server 這樣的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的自動遞增字段默認值false。keyProperty僅適用于 insert 和 update指定能夠唯一識別對象的屬性MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設置它的值默認值未設置unset。如果生成列不止一個可以用逗號分隔多個屬性名稱。keyColumn僅適用于 insert 和 update設置生成鍵值在表中的列名在某些數(shù)據(jù)庫像 PostgreSQL中當主鍵列不是表中的第一列的時候是必須設置的。如果生成列不止一個可以用逗號分隔多個屬性名稱。databaseId如果配置了數(shù)據(jù)庫廠商標識databaseIdProviderMyBatis 會加載所有不帶 databaseId 或匹配當前 databaseId 的語句如果帶和不帶的語句都有則不帶的會被忽略。下面是 insertupdate 和 delete 語句的示例insertidinsertAuthorinsert into Author (id,username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio})/insertupdateidupdateAuthorupdate Author set username #{username}, password #{password}, email #{email}, bio #{bio} where id #{id}/updatedeleteiddeleteAuthordelete from Author where id #{id}/delete