上篇文章介绍了如何使用mybatis-generator生成实体类、Mapper接口代码,其中生成的Mapper接口代码是不带ByExample方法的。本篇文章将介绍如何使用mybatis-generator生成的ByExample方法动态扩展where字句。
一、Mapper接口生成ByExample方法
(1)下载上篇文章的demo:https://github.com/Bingjian-Zhu/MybatisGeneatorDemo.git
(2)修改generatorConfig.xml配置文件
把context元素中的targetRuntime属性修改成MyBatis3
<context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
(3)重新运行MBG,可以看到生成了很多ByExample的方法

二、mapper接口中的方法解析
|
方法 |
功能说明 |
|
int countByExample(UserExample example) thorws SQLException |
按条件计数 |
|
int deleteByPrimaryKey(Integer id) thorws SQLException |
按主键删除 |
|
int deleteByExample(UserExample example) thorws SQLException |
按条件查询 |
|
String/Integer insert(User record) thorws SQLException |
插入数据(返回值为ID) |
|
User selectByPrimaryKey(Integer id) thorws SQLException |
按主键查询 |
|
List selectByExample(UserExample example) thorws SQLException |
按条件查询 |
|
int updateByPrimaryKey(User record) thorws SQLException |
按主键更新 |
|
int updateByPrimaryKeySelective(User record) thorws SQLException |
按主键更新值不为null的字段 |
|
int updateByExample(User record, UserExample example) thorws SQLException |
按条件更新 |
|
int updateByExampleSelective(User record, UserExample example) thorws SQLException |
按条件更新值不为null的字段 |
三、example实例解析
MBG生成实例及实例对应的ByExample,Example用于添加条件,相当where后面的部分
xxxExample example = new xxxExample();
Criteria criteria = new Example().createCriteria();
|
方法 |
功能说明 |
|
example.setOrderByClause(“字段名 ASC”); |
添加升序排列条件,DESC为降序 |
|
example.setDistinct(false) |
去除重复,boolean型,true为选择不重复的记录。 |
|
criteria.andXxxIsNull |
添加字段xxx为null的条件 |
|
criteria.andXxxIsNotNull |
添加字段xxx不为null的条件 |
|
criteria.andXxxEqualTo(value) |
添加xxx字段等于value条件 |
|
criteria.andXxxNotEqualTo(value) |
添加xxx字段不等于value条件 |
|
criteria.andXxxGreaterThan(value) |
添加xxx字段大于value条件 |
|
criteria.andXxxGreaterThanOrEqualTo(value) |
添加xxx字段大于等于value条件 |
|
criteria.andXxxLessThan(value) |
添加xxx字段小于value条件 |
|
criteria.andXxxLessThanOrEqualTo(value) |
添加xxx字段小于等于value条件 |
|
criteria.andXxxIn(List<?>) |
添加xxx字段值在List<?>条件 |
|
criteria.andXxxNotIn(List<?>) |
添加xxx字段值不在List<?>条件 |
|
criteria.andXxxLike(“%”+value+”%”) |
添加xxx字段值为value的模糊查询条件 |
|
criteria.andXxxNotLike(“%”+value+”%”) |
添加xxx字段值不为value的模糊查询条件 |
|
criteria.andXxxBetween(value1,value2) |
添加xxx字段值在value1和value2之间条件 |
|
criteria.andXxxNotBetween(value1,value2) |
添加xxx字段值不在value1和value2之间条件 |
四、具体使用
(1)查询
① selectByPrimaryKey()
User user = XxxMapper.selectByPrimaryKey(100); //相当于select * from user where id = 100
② selectByExample()
UserExample example = new UserExample(); Criteria criteria = example.createCriteria(); criteria.andUsernameEqualTo("wyw"); criteria.andUsernameIsNull(); example.setOrderByClause("username asc,email desc"); List<?>list = XxxMapper.selectByExample(example); //相当于:select * from user where username = 'wyw' and username is null order by username asc,email desc
(2)插入数据
①insert()
User user = new User(); user.setId("dsfgsdfgdsfgds"); user.setUsername("admin"); user.setPassword("admin") user.setEmail("wyw@163.com"); XxxMapper.insert(user); //相当于:insert into user(ID,username,password,email) values ('dsfgsdfgdsfgds','admin','admin','wyw@126.com');
(3)更新数据
①updateByPrimaryKey()
User user =new User(); user.setId("dsfgsdfgdsfgds"); user.setUsername("wyw"); user.setPassword("wyw"); user.setEmail("wyw@163.com"); XxxMapper.updateByPrimaryKey(user); //相当于:update user set username='wyw', password='wyw', email='wyw@163.com' where id='dsfgsdfgdsfgds'
②updateByPrimaryKeySelective()
User user = new User(); user.setId("dsfgsdfgdsfgds"); user.setPassword("wyw"); XxxMapper.updateByPrimaryKey(user); //相当于:update user set password='wyw' where id='dsfgsdfgdsfgds'
③ updateByExample() 和 updateByExampleSelective()
UserExample example = new UserExample(); Criteria criteria = example.createCriteria(); criteria.andUsernameEqualTo("admin"); User user = new User(); user.setPassword("wyw"); XxxMapper.updateByPrimaryKeySelective(user,example); //相当于:update user set password='wyw' where username='admin'
updateByExample()更新所有的字段,包括字段为null的也更新,建议使用 updateByExampleSelective()更新想更新的字段
(4)删除数据
①deleteByPrimaryKey()
XxxMapper.deleteByPrimaryKey(1); //相当于:delete from user where id=1
②deleteByExample()
UserExample example = new UserExample(); Criteria criteria = example.createCriteria(); criteria.andUsernameEqualTo("admin"); XxxMapper.deleteByExample(example); //相当于:delete from user where username='admin'
(5)查询数据数量
①countByExample()
UserExample example = new UserExample(); Criteria criteria = example.createCriteria(); criteria.andUsernameEqualTo("wyw"); int count = XxxMapper.countByExample(example); //相当于:select count(*) from user where username='wyw'
五、pagehelper分页
(1)配置pom
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> <exclusions> <exclusion> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency>
(2)在application.properties配置pagehelper的属性
pagehelper.helperDialect=mysql pagehelper.reasonable=true #为了使用输入页数为负或者超出最大页时候使页数为最小或最大值 pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql
(3)进行分页
PageHelper.startPage(pageNum, pageSize);
(4)按需返回数据
以上3步已实现分页,如需返回以下类型数据,可实现Serializable接口,自定义数据返回类型

@SuppressWarnings("rawtypes")
public class MyPageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
// 总记录数
protected long total;
// 当前页
protected int pageNum;
// 每页的数量
protected int pageSize;
// 结果集
protected List<T> list;
public MyPageInfo() {
}
/**
* 包装Page对象
*
* @param list
*/
public MyPageInfo(List<T> list) {
this.list = list;
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.total = page.getTotal();
} else {
this.pageNum = 1;
this.pageSize = list.size();
this.total = list.size();
}
}
public static <T> MyPageInfo<T> of(List<T> list) {
return new MyPageInfo<T>(list);
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("MyPageInfo{");
sb.append("total=").append(total);
sb.append(", pageNum=").append(pageNum);
sb.append(", pageSize=").append(pageSize);
sb.append(", list=").append(list);
sb.append('}');
return sb.toString();
}
}
具体使用:
public MyPageInfo<User> getAllUsers(String userName, Boolean deleted, Integer pageNum, Integer pageSize) { PageHelper.startPage(pageNum, pageSize); UserExample example = new UserExample(); UserExample.Criteria criteria = example.createCriteria(); if (userName != null && !StringUtils.isEmpty(userName.trim())) criteria.andUserNameLike("%" + userName.trim() + "%"); if (deleted != null) criteria.andDeletedEqualTo(deleted); example.setOrderByClause("id asc"); List<User> list = userMapper.selectByExample(example); MyPageInfo<User> pageInfo = new MyPageInfo<User>(list); return pageInfo; }
源码地址:https://github.com/Bingjian-Zhu/MybatisByExampleDemo.git
参考博客:https://blog.csdn.net/biandous/article/details/65630783#commentBox