摘要:通用是為了解決使用中的基本操作,使用它可以很方便的進行開發(fā),可以節(jié)省開發(fā)人員大量的時間。當該參數(shù)設(shè)置為時,時會查詢第一頁,超過總數(shù)時,會查詢最后一頁。
SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建、運行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個 WEB 工程
在一起來學(xué)SpringBoot | 第七篇:整合Mybatis一文中,我們介紹了Mybatis這款優(yōu)秀的框架,順便提及了民間大神開發(fā)的兩款插件(通用Mapper、PageHelper),從此告別簡單CURD代碼的編寫....
插件介紹以下兩款插件作者均是同一個人,如果你想深入了解Mybatis以及插件開發(fā)可以購買作者的書籍
京東: https://item.jd.com/12103309.html
當當: http://product.dangdang.com/25098208.html
分頁插件
GIT地址: https://github.com/pagehelper/Mybatis-PageHelper
在沒有分頁插件之前,寫一個分頁需要兩條SQL語句,一條查詢一條統(tǒng)計,然后才能計算出頁碼,這樣的代碼冗余而又枯燥,更重要的一點是數(shù)據(jù)庫遷移,眾所周知不同的數(shù)據(jù)庫分頁寫法是不同的,而Mybatis不同于Hibernate的是它只提供動態(tài)SQL和結(jié)果集映射。值得慶幸的是,它雖然沒有為分頁提供良好的解決方案,但卻提供了Interceptor以供開發(fā)者自己擴展,這也是這款分頁插件的由來....
通用Mapper
GIT地址: https://gitee.com/free/Mapper
通用 Mapper 是一個可以實現(xiàn)任意 MyBatis 通用方法的框架,項目提供了常規(guī)的增刪改查操作以及 Example 相關(guān)的單表操作。通用 Mapper 是為了解決 MyBatis 使用中 90% 的基本操作,使用它可以很方便的進行開發(fā),可以節(jié)省開發(fā)人員大量的時間。
導(dǎo)入依賴在 pom.xml 中添加通用Mapper與分頁插件的依賴包
屬性配置tk.mybatis mapper-spring-boot-starter 2.0.2 com.github.pagehelper pagehelper-spring-boot-starter 1.2.5 mysql mysql-connector-java org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test
在 application.properties 文件中分別添加上數(shù)據(jù)庫、Mybatis、通用Mapper、PageHelper的屬性配置,這里只提供了常見場景的配置,更全的配置可以參考上文所述的文文檔(#^.^#)
spring.datasource.url=jdbc:mysql://localhost:3306/chapter7?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false spring.datasource.password=root spring.datasource.username=root # 如果想看到mybatis日志需要做如下配置 logging.level.com.battcn=DEBUG ########## Mybatis 自身配置 ########## mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml mybatis.type-aliases-package=com.battcn.entity # 駝峰命名規(guī)范 如:數(shù)據(jù)庫字段是 order_id 那么 實體字段就要寫成 orderId mybatis.configuration.map-underscore-to-camel-case=true ########## 通用Mapper ########## # 主鍵自增回寫方法,默認值MYSQL,詳細說明請看文檔 mapper.identity=MYSQL mapper.mappers=tk.mybatis.mapper.common.BaseMapper # 設(shè)置 insert 和 update 中,是否判斷字符串類型!="" mapper.not-empty=true # 枚舉按簡單類型處理 mapper.enum-as-simple-type=true ########## 分頁插件 ########## pagehelper.helper-dialect=mysql pagehelper.params=count=countSql pagehelper.reasonable=false pagehelper.support-methods-arguments=true
通用Mapper
mapper.enum-as-simple-type: 枚舉按簡單類型處理,如果有枚舉字段則需要加上該配置才會做映射
mapper.not-empty: 設(shè)置以后,會去判斷 insert 和 update 中符串類型!=""
分頁插件
pagehelper.reasonable: 分頁合理化參數(shù),默認值為false。當該參數(shù)設(shè)置為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數(shù)時),會查詢最后一頁。默認false 時,直接根據(jù)參數(shù)進行查詢。
support-methods-arguments: 支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù),默認值false,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。
注意事項
由于 mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml配置的在java package中,而Spring Boot默認只打入java package -> *.java,所以我們需要給pom.xml文件添加如下內(nèi)容
具體編碼src/main/resources src/main/java **/*.xml true org.springframework.boot spring-boot-maven-plugin
完成基本配置后,接下來進行具體的編碼操作。
表結(jié)構(gòu)創(chuàng)建一張 t_user 的表
CREATE TABLE `t_user` ( `id` int(8) NOT NULL AUTO_INCREMENT COMMENT "主鍵自增", `username` varchar(50) NOT NULL COMMENT "用戶名", `password` varchar(50) NOT NULL COMMENT "密碼", PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="用戶表";實體類
通用Mapper采用了JPA規(guī)范包中的注解,這種的設(shè)計避免了重復(fù)造輪子,更是讓Spring Data Jpa的應(yīng)用可以輕松切換到Mybatis
package com.battcn.entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; /** * @author Levin * @since 2018/5/10 0007 */ @Table(name = "t_user") public class User implements Serializable { private static final long serialVersionUID = 8655851615465363473L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // TODO 省略get set }持久層
為了更好的讓熟悉它,此處模擬了一個自定義的SQL,可以發(fā)現(xiàn)使用 通用Mapper 后并不會破壞原有代碼結(jié)構(gòu)
UserMapper
繼承 BaseMapper
package com.battcn.mapper; import com.battcn.entity.User; import org.apache.ibatis.annotations.Mapper; import tk.mybatis.mapper.common.BaseMapper; /** * t_user 操作,繼承 BaseMapper就可以了,是不是有點類似 JpaRepository * * @author Levin * @since 2018/5/10 0007 */ @Mapper public interface UserMapper extends BaseMapper { /** * 根據(jù)用戶名統(tǒng)計(TODO 假設(shè)它是一個很復(fù)雜的SQL) * * @param username 用戶名 * @return 統(tǒng)計結(jié)果 */ int countByUsername(String username); }
UserMapper 映射文件
測試
完成數(shù)據(jù)訪問層接口后,編寫一個junit測試類來檢驗代碼的正確性。
package com.battcn; import com.battcn.entity.User; import com.battcn.mapper.UserMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; /** * @author Levin */ @RunWith(SpringRunner.class) @SpringBootTest public class Chapter7ApplicationTests { private static final Logger log = LoggerFactory.getLogger(Chapter7ApplicationTests.class); @Autowired private UserMapper userMapper; @Test public void test1() throws Exception { final User user1 = new User("u1", "p1"); final User user2 = new User("u1", "p2"); final User user3 = new User("u3", "p3"); userMapper.insertSelective(user1); log.info("[user1回寫主鍵] - [{}]", user1.getId()); userMapper.insertSelective(user2); log.info("[user2回寫主鍵] - [{}]", user2.getId()); userMapper.insertSelective(user3); log.info("[user3回寫主鍵] - [{}]", user3.getId()); final int count = userMapper.countByUsername("u1"); log.info("[調(diào)用自己寫的SQL] - [{}]", count); // TODO 模擬分頁 userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); userMapper.insertSelective(new User("u1", "p1")); // TODO 分頁 + 排序 this.userMapper.selectAll() 這一句就是我們需要寫的查詢,有了這兩款插件無縫切換各種數(shù)據(jù)庫 final PageInfo總結(jié)
Mybatis官方文檔: http://www.mybatis.org/mybatis-3/zh/index.html
通用Mapper文檔: https://gitee.com/free/Mapper/wikis/1.1-java?parent=1.integration
分頁插件文檔: https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
目前很多大佬都寫過關(guān)于 SpringBoot 的教程了,如有雷同,請多多包涵,本教程基于最新的 spring-boot-starter-parent:2.0.1.RELEASE編寫,包括新版本的特性都會一起介紹...
說點什么個人QQ:1837307557
battcn開源群(適合新手):391619659
微信公眾號(歡迎調(diào)戲):battcn
個人博客:http://blog.battcn.com/
全文代碼:https://github.com/battcn/spring-boot2-learning/tree/master/chapter7
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71361.html
摘要:當禁用時,所有關(guān)聯(lián)對象都會即時加載。不同的驅(qū)動在這方便表現(xiàn)不同。參考驅(qū)動文檔或充分測試兩種方法來決定所使用的驅(qū)動。需要適合的驅(qū)動。系統(tǒng)默認值是設(shè)置字段和類是否支持駝峰命名的屬性。 ??上篇文章我們介紹了SpringBoot和MyBatis的整合,可以說非常簡單快捷的就搭建了一個web項目,但是在一個真正的企業(yè)級項目中,可能我們還需要更多的更加完善的框架才能開始真正的開發(fā),比如連接池、分...
摘要:但是鑒于國內(nèi)市場環(huán)境而言,掌握無異于是佳的選擇,低學(xué)習成本和動態(tài)解耦的特點使得更容易被人們所接受。 SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建、運行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個 WEB 工程 MyBatis 是一款優(yōu)秀的持久層框架,它支持...
摘要:讀取控制臺內(nèi)容請輸入請輸入正確的代碼生成器全局配置實體屬性注解數(shù)據(jù)源配置包配置這里有個模塊名的配置,可以注釋掉不用。 最近在研究mybatis,然后就去找簡化mybatis開發(fā)的工具,發(fā)現(xiàn)就有通用Mapper和mybatis-plus兩個比較好的可是使用,可是經(jīng)過對比發(fā)現(xiàn)還是mybatis-plus比較好,個人覺得,勿噴。。。 集成還是非常簡單的,然后就在研究怎么分頁,開始研究通用ma...
摘要:整合想著每次搭建新項目時框架都要從新搭建,基本常用的也就哪幾種,現(xiàn)在就來搭建一種常用的后臺框架,以后新開小項目可以直接拿來使用項目整體結(jié)構(gòu)圖新建空白項目,選中依賴略,也可以完全根據(jù)本人代碼操作文件依賴項展示 springboot整合tkMapper 想著每次搭建新項目時框架都要從新搭建,基本常用的也就哪幾種,現(xiàn)在就來搭建一種常用的springboot后臺框架,以后新開小項目可以直接拿來...
閱讀 3138·2021-11-24 10:24
閱讀 2930·2021-11-11 16:54
閱讀 3066·2021-09-22 15:55
閱讀 2027·2019-08-30 15:44
閱讀 1901·2019-08-29 18:41
閱讀 2761·2019-08-29 13:43
閱讀 3053·2019-08-29 12:51
閱讀 1171·2019-08-26 12:19