上篇文章介紹了如何使用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