
一、簡介什么是 MyBatisMyBatis 是一款優(yōu)秀的持久層框架它支持自定義 SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJOPlain Old Java Objects普通老式 Java 對(duì)象為數(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)建項(xiàng)目則需將下面的依賴代碼置于 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# 指定實(shí)體類所在的包方便在 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 映射文件適合復(fù)雜 SQL創(chuàng)建一個(gè)與 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ū)?yīng)的 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 會(huì)提供代理實(shí)現(xiàn)publicUsergetUser(Longid){returnuserMapper.findById(id);}}四、參數(shù)說明1、SELECT查詢語句是 MyBatis 中最常用的元素之一——光能把數(shù)據(jù)存到數(shù)據(jù)庫中價(jià)值并不大還要能重新取出來才有用多數(shù)應(yīng)用也都是查詢比修改要頻繁。 MyBatis 的基本原則之一是在每個(gè)插入、更新或刪除操作之間通常會(huì)執(zhí)行多個(gè)查詢操作。因此MyBatis 在查詢和結(jié)果映射做了相當(dāng)多的改進(jìn)。一個(gè)簡單查詢的 select 元素是非常簡單的。比如selectidselectPersonparameterTypeintresultTypehashmapSELECT * FROM PERSON WHERE ID #{id}/selectselect 元素允許你配置很多屬性來配置每條語句的行為細(xì)節(jié)。selectidselectPersonparameterTypeintparameterMapdeprecatedresultTypehashmapresultMappersonResultMapflushCachefalseuseCachetruetimeout10fetchSize256statementTypePREPAREDresultSetTypeFORWARD_ONLYSelect 元素的屬性屬性描述id在命名空間中唯一的標(biāo)識(shí)符可以被用來引用這條語句。parameterType將會(huì)傳入這條語句的參數(shù)的類全限定名或別名。這個(gè)屬性是可選的因?yàn)?MyBatis 可以通過類型處理器TypeHandler推斷出具體傳入語句的參數(shù)默認(rèn)值為未設(shè)置unset。parameterMap用于引用外部 parameterMap 的屬性目前已被廢棄。請(qǐng)使用行內(nèi)參數(shù)映射和 parameterType 屬性。resultType期望從這條語句中返回結(jié)果的類全限定名或別名。 注意如果返回的是集合那應(yīng)該設(shè)置為集合包含的類型而不是集合本身的類型。 resultType 和 resultMap 之間只能同時(shí)使用一個(gè)。resultMap對(duì)外部 resultMap 的命名引用。結(jié)果映射是 MyBatis 最強(qiáng)大的特性如果你對(duì)其理解透徹許多復(fù)雜的映射問題都能迎刃而解。 resultType 和 resultMap 之間只能同時(shí)使用一個(gè)。flushCache將其設(shè)置為 true 后將會(huì)導(dǎo)致本條語句的結(jié)果被二級(jí)緩存緩存起來默認(rèn)值對(duì) select 元素為 true。useCache將其設(shè)置為 true 后將會(huì)導(dǎo)致本條語句的結(jié)果被二級(jí)緩存緩存起來默認(rèn)值對(duì) select 元素為 true。timeout這個(gè)設(shè)置是在拋出異常之前驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果的秒數(shù)。默認(rèn)值為未設(shè)置unset依賴數(shù)據(jù)庫驅(qū)動(dòng)。fetchSize這是一個(gè)給驅(qū)動(dòng)的建議值嘗試讓驅(qū)動(dòng)程序每次批量返回的結(jié)果行數(shù)等于這個(gè)設(shè)置值。 默認(rèn)值為未設(shè)置unset依賴驅(qū)動(dòng)。statementType可選 STATEMENTPREPARED 或 CALLABLE。這會(huì)讓 MyBatis 分別使用 StatementPreparedStatement 或 CallableStatement默認(rèn)值PREPARED。resultSetTypeFORWARD_ONLYSCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT等價(jià)于 unset 中的一個(gè)默認(rèn)值為 unset 依賴數(shù)據(jù)庫驅(qū)動(dòng)databaseId如果配置了數(shù)據(jù)庫廠商標(biāo)識(shí)databaseIdProviderMyBatis 會(huì)加載所有不帶 databaseId 或匹配當(dāng)前 databaseId 的語句如果帶和不帶的語句都有則不帶的會(huì)被忽略。resultOrdered這個(gè)設(shè)置僅針對(duì)嵌套結(jié)果 select 語句如果為 true則假設(shè)結(jié)果集以正確順序排序后執(zhí)行映射當(dāng)返回新的主結(jié)果行時(shí)將不再發(fā)生對(duì)以前結(jié)果行的引用。 這樣可以減少內(nèi)存消耗。默認(rèn)值false。resultSets這個(gè)設(shè)置僅適用于多結(jié)果集的情況。它將列出語句執(zhí)行后返回的結(jié)果集并賦予每個(gè)結(jié)果集一個(gè)名稱多個(gè)名稱之間以逗號(hào)分隔。2、INSERT, UPDATE 和 DELETE數(shù)據(jù)變更語句 insertupdate 和 delete 的實(shí)現(xiàn)非常接近insertidinsertAuthorparameterTypedomain.blog.AuthorflushCachetruestatementTypePREPAREDkeyPropertykeyColumnuseGeneratedKeystimeout20updateidupdateAuthorparameterTypedomain.blog.AuthorflushCachetruestatementTypePREPAREDtimeout20deleteiddeleteAuthorparameterTypedomain.blog.AuthorflushCachetruestatementTypePREPAREDtimeout20Insert, Update, Delete 元素的屬性屬性描述id在命名空間中唯一的標(biāo)識(shí)符可以被用來引用這條語句。parameterType將會(huì)傳入這條語句的參數(shù)的類全限定名或別名。這個(gè)屬性是可選的因?yàn)?MyBatis 可以通過類型處理器TypeHandler推斷出具體傳入語句的參數(shù)默認(rèn)值為未設(shè)置unset。parameterMap用于引用外部 parameterMap 的屬性目前已被廢棄。請(qǐng)使用行內(nèi)參數(shù)映射和 parameterType 屬性。flushCache將其設(shè)置為 true 后只要語句被調(diào)用都會(huì)導(dǎo)致本地緩存和二級(jí)緩存被清空默認(rèn)值對(duì) insert、update 和 delete 語句true。timeout這個(gè)設(shè)置是在拋出異常之前驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果的秒數(shù)。默認(rèn)值為未設(shè)置unset依賴數(shù)據(jù)庫驅(qū)動(dòng)。statementType可選 STATEMENTPREPARED 或 CALLABLE。這會(huì)讓 MyBatis 分別使用 StatementPreparedStatement 或 CallableStatement默認(rèn)值PREPARED。useGeneratedKeys僅適用于 insert 和 update這會(huì)令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵比如像 MySQL 和 SQL Server 這樣的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的自動(dòng)遞增字段默認(rèn)值false。keyProperty僅適用于 insert 和 update指定能夠唯一識(shí)別對(duì)象的屬性MyBatis 會(huì)使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設(shè)置它的值默認(rèn)值未設(shè)置unset。如果生成列不止一個(gè)可以用逗號(hào)分隔多個(gè)屬性名稱。keyColumn僅適用于 insert 和 update設(shè)置生成鍵值在表中的列名在某些數(shù)據(jù)庫像 PostgreSQL中當(dāng)主鍵列不是表中的第一列的時(shí)候是必須設(shè)置的。如果生成列不止一個(gè)可以用逗號(hào)分隔多個(gè)屬性名稱。databaseId如果配置了數(shù)據(jù)庫廠商標(biāo)識(shí)databaseIdProviderMyBatis 會(huì)加載所有不帶 databaseId 或匹配當(dāng)前 databaseId 的語句如果帶和不帶的語句都有則不帶的會(huì)被忽略。下面是 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