簡介
springboot
設計目的就是為了加速開發,減少xml的配置。如果你不想寫配置文件只需要在配置文件添加相對應的配置就能快速的啟動的程序。
通用mapp
通用mapper只支持對單表的操作,對單表的增刪改查,無需在mapper.xml寫對應的sql語句,只需要我們調用相應的接口即可。
pagehelp
pagehelper主要是在對查詢的數據進行一個分頁查詢。
- 首先在maven項目,在pom.xml中引入mapper和pagehelper的依賴
<!-- pagehelp -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
2 新建一個mymapper.java文件,繼承mapper接口
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T>,ConditionMapper<T> {
//FIXME 特別注意,該接口不能被掃描到,否則會出錯
}
這個java文件不能和其它mapper放在一起,以免被掃描到。獲取單表數據的操作都直接調用這個方法。
3 在配置文件上添加以后屬性字段
#jdbc
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/news
spring.datasource.username=數據庫用戶名
spring.datasource.password=數據庫密碼
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.freemarker.request-context-attribute=request
#mapper
mapper.mappers=com.imooc.springboot.mapper.util.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
#pagehelper
pagehelper.helper-dialect = mysql
pagehelper.reasonable = true
pagehelper.support-methods-arguments = true
pagehelper.params= count= countSql
上面的配置mapper.mappers 是第2步里面文件所在的路徑。
4 添加了controller文件之后,由controller里面的方法去調用server里面的方法。雖然是有通用mapper方法,但是每次添加一個server方法之后都要添加對應的mapper方法,這樣開發的也顯得比較繁瑣,所以我們需要一個通用server類,用這個類去調用第二步的方法就可以了。
public interface BaseService<T> {
/**
* 查詢所有
*
* @return 返回所有數據
*/
List<T> findAll();
/**
* 添加
*
* @param t 實體
*
* @return
*/
int save(T t);
/**
* 修改
*
* @param t
* 實體
* @return
*/
int updateByPrimaryKey(T t);
/**
* 根據主鍵刪除
*
* @param t 主鍵
*
* @return
*/
int deleteByPrimaryKey(int t);
/**
* 查詢表格列表
* @param t 分頁參數
* @return
*/
TableData<T> getTableData(PageBean pageBean);
}
上面只是封裝基本增刪改查的方法,后續可自行添加方法。
然后添加實現類
public abstract class BaseServiceImpl<T> implements BaseService<T> {
@Autowired
protected MyMapper<T> mapper;
@Override
public List<T> findAll() {
return mapper.selectAll();
}
@Override
public int save(T t) {
return mapper.insert(t);
}
@Override
public int updateByPrimaryKey(T t) {
return mapper.updateByPrimaryKey(t);
}
@Override
public int deleteByPrimaryKey(int t) {
return mapper.deleteByPrimaryKey(t);
}
@Override
public TableData<T> getTableData(PageBean bean) {
int count = mapper.selectAll().size();
if (count > 0) {
PageHelper.startPage((bean.getOffset()/bean.getLimit()) + 1, bean.getLimit());
List<T> list = this.findAll();
return TableData.bulid(count, list);
}
return TableData.empty();
}
}
注意:我用的編輯器是eclipse,如果用idea編輯器,這里可把abstract去掉。
然后添加對應的接口和實現類繼承上面的接口和方法就可以了,比如添加一個newsserver 接口和newsserverImpl類
public interface NewsService extends BaseService<SysUser> {
}
@Service
public class NewsServiceImpl extends BaseServiceImpl<SysUser> implements NewsService{
}
5 為了減少數據庫服務器的壓力,一般我們查詢數據的時候都會使用pagehelper進行分頁查詢,為了更加清晰的顯示我們展示的數據,使用bootstrap table展示數據,bootstrap table獲取數據有兩種途經,一種是客戶端模式,即獲取全部數據之后,在前端進行分頁展示。另外一種,也就是我們接下來要說的服務端模式:要獲取的數據信息,比如獲取數據頁碼,每一頁數據的大小,都可以通過前端發送以上的參數向后台發請求,后台得到這些參數信息之后返回數據。
6 引入bootstrap table相關的js css文件之后,開始在網上找了一些資料之后發現很多都是要在前端頁面添加如下繁瑣的配置,
$('#mytable').bootstrapTable({
//請求方法
method: 'get',
//是否顯示行間隔色
striped: true,
//是否使用緩存,默認為true,所以一般情況下需要設置一下這個屬性(*)
cache: false,
//是否顯示分頁(*)
pagination: true,
//是否啟用排序
sortable: false,
//排序方式
sortOrder: "desc",
//初始化加載第一頁,默認第一頁
//我設置了這一項,但是貌似沒起作用,而且我這默認是0,- -
//pageNumber:1,
//每頁的記錄行數(*)
pageSize: 10,
//可供選擇的每頁的行數(*)
pageList: [10, 25, 50, 100],
//這個接口需要處理bootstrap table傳遞的固定參數,並返回特定格式的json數據
url: "${contextPath}/mapper/getTableData",
//默認值為 'limit',傳給服務端的參數為:limit, offset, search, sort, order Else
//queryParamsType:'',
////查詢參數,每次調用是會帶上這個參數,可自定義
queryParams: queryParams : function(params) {
var subcompany = $('#subcompany option:selected').val();
var name = $('#name').val();
return {
pageNumber: params.offset+1,
pageSize: params.limit,
companyId:subcompany,
name:name
};
},
//分頁方式:client客戶端分頁,server服務端分頁(*)
sidePagination: "server",
//是否顯示搜索
search: false,
//Enable the strict search.
strictSearch: true,
//Indicate which field is an identity field.
idField : "id",
columns: [],
pagination:true
});
每次添加一個頁面如果都要添加以上的配置信息也顯得繁瑣,不過bootstrap-table.js里面有個默認的配置,只需要修改里面的幾個配置。
contentType: 'application/json',//post請求頭 application/x-www-form-urlencoded; charset=UTF-8'
dataType: 'json',
sidePagination: 'server', // 改成server
當我們點擊表格分頁頁碼的時候,獲取改變每頁顯示的頁碼時候,前端會自動調用queryParams()方法,我們需要將這些數據傳遞給后台,
function queryParams(params) {
var query={};
query["limit"] = params.limit;//第幾條數據開始
query["offset"] = params.offset;//數據大小
return query;
}
6 配合上一步前端的分頁,我們就需要使用pagehelp插件了,同樣我們把這個分頁的方法放在通用server類上,
public TableData<T> getTableData(PageBean bean) {
int count = mapper.selectAll().size();
if (count > 0) {
PageHelper.startPage((bean.getOffset()/bean.getLimit()) + 1, bean.getLimit());
List<T> list = this.findAll();
return TableData.bulid(count, list);
}
return TableData.empty();
}
上面的pagehelper.startpage需要做一點改變,前端傳過來的是顯示第幾條數據,但是startpage方法第一個參數是顯示第幾頁的數據,所以做一個轉換pageoffset/limit +1,然后在查詢數據,需要注意的是,一定要將startpage方法方法查詢數據語句的前一行,不能空行,或者換行。