使用mybatis動態where字句方法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM