乐趣区

关于java:Springboot-整合通用mapper和pagehelper展示分页数据附github源码

简介

springboot

设计目标就是为了减速开发,缩小 xml 的配置。如果你不想写配置文件只须要在配置文件增加绝对应的配置就能疾速的启动的程序。

通用 mapp

通用 mapper 只反对对单表的操作,对单表的增删改查,无需在 mapper.xml 写对应的 sql 语句, 只须要咱们调用相应的接口即可。

pagehelp

pagehelper 次要是在对查问的数据进行一个分页查问。

  1. 首先在 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 办法办法查问数据语句的前一行,不能空行,或者换行。

附录:

github 源码
demo 展现

退出移动版