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

使用mybatis动态where字句方法的更多相关文章

  1. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  2. mybatis动态调用表名和字段名

    以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...

  3. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  4. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  5. Mybatis动态查询语句

    MyBatis中动态SQL语句完成多条件查询 标签: mybatis动态SQL多条件查询java.sql.SQLSyntaxEr 2015-06-29 19:00 22380人阅读 评论(0) 收藏  ...

  6. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  7. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

  8. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  9. mybatis 动态sql和参数

    mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...

随机推荐

  1. C# windows服务,解决应用程序开机自启问题

    最近在东营做一个超市购物的项目,业务体量很小,是仅供内部员工使用的内网应用程序,其中涉及一个商品数据同步的winform应用程序,有一个问题就是服务器重启后,必须登录服务器操作系统,手动启动才行,于是 ...

  2. Java 实现 HtmlEmail 邮件发送功能

    引言 在平常的企业级应用开发过程中,可能会涉及到一些资讯通知需要传达,以及软件使用过程中有一些安全性的东西需要及早知道和了解,这时候在局域网之间就可以通过发送邮件的方式了.以下就是代码实现了: pac ...

  3. idea使用lombok不生效的解决办法

    file-->setting-->plugins点击下方的 browse repositories. 搜索lombok plugin. 安装后,重启. file-->setting- ...

  4. Leakcanary原理浅析

    LeakCanary是Android内存泄漏的框架,作为一个"面试常见问题",它一定有值得学习的地方,今天我们就讲一下它.作为一名开发,我觉得给人讲框架或者库的原理,最好先把大概思 ...

  5. oracle学习笔记(十九) 子程序——存储过程

    子程序--存储过程 我们可以使用子程序来封装一下我们需要的操作,子程序又有存储过程,函数和触发器. 这里先学习存储过程~ 语法 create [or replace] procedure $proce ...

  6. c#中list集合使用Max()方法查找到最大值

    在C#的List集合操作中,有时候需要查找到List集合中的最大值,此时可以使用List集合的扩展方法Max方法,Max方法有2种形式,一种是不带任何参数的形式,适用于一些值类型变量的List集合,另 ...

  7. android studio 出现找不到R文件的错误

    百度知道: 检查是否编译了项目.Android studio有时候没有编译就会报出没有R文件的错误. 检查带代码中包名是否正确.有时候从其他地方复制代码过来时连带了包名,也会报出R文件找不到. 检查布 ...

  8. Javase之集合体系(3)之Set及其子类知识

    集合体系之Set及其子类知识 Set(接口) public interface Set<E>extends Collection<E> ​ 特点:无序(存储顺序与取出顺序不一致 ...

  9. VS2017 打开WebService 提示已经在解决方案中打开了具有该名称的项目

    .net开发.用VS2017工具,打开VS2010创建的WebSevice工程时,提示工程不可用. 重新加载后提示:已经在解决方案中打开了具有该名称的项目. 该问题原因是因为启用了源代码管理工具的问题 ...

  10. Redis中使用redis-cli及密码登录

    使用redis-cli登录后如果Redis中设置了密码那么输入密码可能会出现: NOAUTH Authentication required的错. 这个时候可以输入:auth password 进行登 ...