今天使用了abel533大神的mybatis分页插件,遇到了写问题,特意在这里做个总结,方便以后查找。
首先该测试是在本人的ssm基础框架上实现的,有兴趣的可以先看看本人的博客置顶帖。高手就略过吧。
主要使用abel533的两个东西,一个是mapper,主要作用是单表的通用mapper;另一个是mybatis的分页插件pageHelper
ok,开始吧。
(一)集成
首先是jar包,此处我们使用maven管理jar包,引入下面两个jar包就可以了:
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.1.2</version>
</dependency>
<!-- pagehelper jar包 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.0.0</version>
</dependency>
然后是mybatis.xml的配置,主要是两个拦截器(更多属性配置请查看abel533大神的开发文档):
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
</plugin>
<!-- mapper插件放在最下面 -->
<plugin interceptor="tk.mybatis.mapper.mapperhelper.MapperInterceptor">
<!--================================================-->
<!--可配置参数说明(一般无需修改)-->
<!--================================================-->
<!--UUID生成策略-->
<!--配置UUID生成策略需要使用OGNL表达式-->
<!--默认值32位长度:@java.util.UUID@randomUUID().toString().replace("-", "")-->
<!--<property name="UUID" value="@java.util.UUID@randomUUID().toString()"/>-->
<!--主键自增回写方法,默认值MYSQL,详细说明请看文档-->
<property name="IDENTITY" value="mysql"/>
<!--序列的获取规则,使用{num}格式化参数,默认值为{0}.nextval,针对Oracle-->
<!--可选参数一共3个,对应0,1,2,分别为SequenceName,ColumnName,PropertyName-->
<property name="seqFormat" value="{0}.nextval"/>
<!--主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER)-->
<!--<property name="ORDER" value="AFTER"/>-->
<!--通用Mapper接口,多个通用接口用逗号隔开-->
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
</plugin>
</plugins>
两步就可以集成mapper和pageHelper插件。
(二)具体使用
1.首先是mapper,需要继承通用的Mapper<T>,必须指定泛型<T>,下面是例子:
public interface UserInfoMapper extends Mapper<UserInfo> {
//其他必须手写的接口...
}
2.泛型(实体类)<T>的类型必须符合要求(此处引用,gen更多请查阅文档http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/3.Use.md)
实体类按照如下规则和数据库表进行转换,注解全部是JPA中的注解:
表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如UserInfo默认对应的表名为user_info。
表名可以使用@Table(name = "tableName")进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.
字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.
可以使用@Column(name = "fieldName")指定不符合第3条规则的字段名
使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用.
建议一定是有一个@Id注解作为主键的字段,可以有多个@Id注解的字段作为联合主键.
默认情况下,实体类中如果不存在包含@Id注解的字段,所有的字段都会作为主键字段进行使用(这种效率极低).
实体类可以继承使用,可以参考测试代码中的tk.mybatis.mapper.model.UserLogin2类.
由于基本类型,如int作为实体类字段时会有默认值0,而且无法消除,所以实体类中建议不要使用基本类型.
3.将继承的Mapper接口添加到mybatis配置中,有两种写法,此处采用spring的方式:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.isea533.mybatis.mapper"/>
</bean>
4.就是在代码中使用了,此处,我将粘贴上mapper,service和controller的示例代码:
(1)首先是controller:
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.aodong.mybatisTest.model.Student;
import com.aodong.mybatisTest.service.PageTestService;
@Controller
@RequestMapping("/pageHelper")
public class PageHelperController {
@Autowired
private PageTestService pageTestService;
@RequestMapping(value="/requestTest", method=RequestMethod.GET)
@ResponseBody
public List<Student> requestTest(
@RequestParam(value="pageNum", required=false, defaultValue="1")int pageNum,
@RequestParam(value="pageSize", required=false, defaultValue="10")int pageSize
){
return pageTestService.selectPage(pageNum, pageSize);
}
}
(2)然后是service:
1.BaseService
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.github.pagehelper.PageHelper;
import tk.mybatis.mapper.common.Mapper;
public abstract class BaseService<T> {
@Autowired
protected Mapper<T> mapper;
public int save(T entity){
return mapper.insert(entity);
}
public int delete(T entity){
return mapper.deleteByPrimaryKey(entity);
}
/**
* 单表分页查询
*
* @param pageNum
* @param pageSize
* @return
*/
public List<T> selectPage(int pageNum,int pageSize){
PageHelper.startPage(pageNum, pageSize);
List<T> list = mapper.select(null);
System.out.println(list.size());
//Spring4支持泛型注入
return list;
}
}
2.service接口
import java.util.List;
import com.aodong.mybatisTest.model.Student;
public interface PageTestService {
public List<Student> selectPage(int pageNum, int pageSize);
}
3.serviceImpl实现类
import org.springframework.stereotype.Service;
import com.aodong.mybatisTest.model.Student;
import com.aodong.mybatisTest.service.BaseService;
import com.aodong.mybatisTest.service.PageTestService;
@Service("pageTestService")
public class PageTestServiceImpl extends BaseService<Student> implements PageTestService {
}
(3)然后是mapper
import tk.mybatis.mapper.common.Mapper;
import com.aodong.mybatisTest.model.Student;
public interface PageTestMapper extends Mapper<Student> {
}
(4)最后是model,一般要求最少有个id注解
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@Id
@Column(name = "Id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private Integer age;
private String name;
private String nicename;
public Student() {
}
public Student(long id, Integer age, String name, String nicename) {
super();
this.id = id;
this.age = age;
this.name = name;
this.nicename = nicename;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNicename() {
return nicename;
}
public void setNicename(String nicename) {
this.nicename = nicename;
}
@Override
public String toString() {
return "Student [id=" + id + ", age=" + age + ", name=" + name
+ ", niceName=" + nicename + "]";
}
}