Mybatis通用Mapper介紹
Mybatis 通用 Mapper
極其方便的使用 Mybatis 單表的增刪改查,支持單表操作,不支持通用的多表聯合查詢
優點:
通用 Mapper 可以極大的方便開發人員。
為了讓您更方便的了解通用 Mapper,下面貼一段代碼來看實際效果。
通用Mapper
通用 Mapper 可以緩存,全部針對單表操作,每個實體類都需要繼承通用 Mapper 接口來獲得通用方法。
實際開發過程中,我們對數據庫單表的操作情況有很多,有了通用mapper插件, 我們實現相對應的接口,整合到spring boot項目中,減少了xml文件的配置,使我們的開發更高效。
如何整合通用Mapper插件
引入依賴
<!--mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<!--pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<!--阿里巴巴數據源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
通過pom.xml文件引入通用Mapper依賴,同時引入了druid數據源和PageHelper分頁的插件,通過 springboot配置文件application.properties進行配置。
# 驅動配置信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
連接池的配置信息
初始化大小,最小,最大
spring.druid.initialSize=5
spring.druid.minIdle=5
spring.druid.maxActive=20配置獲取連接等待超時的時間
spring.druid.maxWait=60000
配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
spring.druid.timeBetweenEvictionRunsMillis=60000
配置一個連接在池中最小生存的時間,單位是毫秒
spring.druid.minEvictableIdleTimeMillis=300000
spring.druid.validationQuery=SELECT 1 FROM DUAL
spring.druid.testWhileIdle=true
spring.druid.testOnBorrow=false
spring.druid.testOnReturn=false
spring.druid.poolPreparedStatements=true
spring.druid.maxPoolPreparedStatementPerConnectionSize=20配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆
spring.druid.filters=stat,wall,log4j
通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
mybatis
掃描entrity包
mybatis.type-aliases-package=cn.jj.model
mybatis.mapper-locations=classpath:mapper/*.xmlmappers 多個接口時逗號隔開
mapper.mappers=tk.mybatis.mapper.common.Mapper
mapper.mappers=cn.jj.common.MyMapper
mapper.not-empty=false
mapper.identity=MYSQLpagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
到這里,我們就做好了相關的配置。接着創建MyMapper接口繼承Mapper。
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
創建實體Bean,使用通用Mapper一定要保證實體類字段和數據庫字段一致。如果不一致可以利用注解進行映射。
@Column(name = "nick")
private String name;
@Table(name = "city")
public class City implements Serializable{
private static final long serialVersionUID = 1L;
@Id
private String id;
private String name;
private String state;
public String getId() {</br> return id;</br> }</br></br> public void setId(String id) {</br> this.id = id;</br> }</br></br> public String getName() {</br> return name;</br> }</br></br> public void setName(String name) {</br> this.name = name;</br> }</br></br> public String getState() {</br> return state;</br> }</br></br> public void setState(String state) {</br> this.state = state;</br> }</br></br>
}
接着,在Mapper接口層繼承剛才的MyMapper接口,到這里,單表的增刪改查已經實現了。
@Mapper public interface CityMapper extends MyMapper<City>{
}
接着,我們通過測試類測試下,數據庫添加好相應數據。
@Autowired
private CityMapper cityDao;
//查詢</br> @Test</br> public void selectAll() {</br> List<City> city = cityDao.selectAll();</br> for (City city2 : city) {</br> System.out.println("id:"+city2.getId()+"\t"+"name:"+city2.getName()+"\t"+"state:"+city2.getState());</br> }</br> }</br>
控制台輸出結果如下:

其他增刪改方法大家大家試着自己嘗試,也都特別簡單。數據庫一共有四條數據,接下來我們加上分頁插件。首先我們通過官網看下分頁插件所支持的數據庫和Mybatis的版本。

可以看出PageHelper支持大部分主流關系型數據庫,引用分頁插件以后,Mybatis分頁會變得特別簡單,需要注意的是,在你需要進行分頁的 MyBatis 查詢方法前調用 PageHelper.startPage 靜態方法即可,緊跟在這個方法后的第一個MyBatis 查詢方法會被進行分頁。詳細的使用方法我們看下官網的例子。
例一:
//獲取第1頁,10條內容,默認查詢總數count
PageHelper.startPage(1, 10);
//緊跟着的第一個select方法會被分頁
List<Country> list = countryMapper.selectIf(1);
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分頁時,實際返回的結果list類型是Page<E>,如果想取出分頁信息,需要強制轉換為Page<E>
assertEquals(182, ((Page) list).getTotal());
例二:
//request: url?pageNum=1&pageSize=10
//支持 ServletRequest,Map,POJO 對象,需要配合 params 參數
PageHelper.startPage(request);
//緊跟着的第一個select方法會被分頁
List<Country> list = countryMapper.selectIf(1);
//后面的不會被分頁,除非再次調用PageHelper.startPage
List<Country> list2 = countryMapper.selectIf(null);
//list1
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分頁時,實際返回的結果list類型是Page<E>,如果想取出分頁信息,需要強制轉換為Page<E>,
//或者使用PageInfo類(下面的例子有介紹)
assertEquals(182, ((Page) list).getTotal());
//list2
assertEquals(1, list2.get(0).getId());
assertEquals(182, list2.size());
例三,使用PageInfo的用法:
//獲取第1頁,10條內容,默認查詢總數count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo對結果進行包裝
PageInfo page = new PageInfo(list);
//測試PageInfo全部屬性
//PageInfo包含了非常全面的分頁屬性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());
下面是我們自己的service層查詢方法,使用PageHelper進行分頁,取出第二頁數據,每頁顯示兩條:
@Override
public List<City> selectAll() {
//分頁插件的使用 第一個參數是當前頁 第二個參數是每頁顯示的條數
PageHelper.startPage(2, 2);
return cityDao.selectAll();
}
再來看一下測試類:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MapperTest {
@Autowired</br> private CityService cityService;</br></br> @Autowired</br> private UserService userService;</br></br> //查詢</br> @Test</br> public void selectAll() {</br> List<City> city = cityService.selectAll();</br> for (City city2 : city) {</br> System.out.println("id:"+city2.getId()+"\t"+"name:"+city2.getName()+"\t"+"state:"+city2.getState());</br> }</br> }</br>
}
接下來我們開始測試,通過查看控制台輸出信息,說明分頁已經生效。數據庫一共是四條數據,我們取出第二頁數據,取出兩條。打印結果如下:

到此,通用Mapper和PageHelper已經和spring boot整合完畢!spring boot 對於開發者來說正變得越來越高效、敏捷!
(完)
參考文章
</div>