MP实战系列(十二)之封装方法详解(续二)

继续MP实战系列(十一)之封装方法详解(续一)这篇文章之后。

此次要讲的是关于查询。

查询是用的比较多的,查询很重要,好的查询,加上索引如鱼得水,不好的查询加再多索引也是无济于事。

1.selectById()方法

演示示例:

        UserEntity user = ud.selectById(33);
        System.out.println(user.getEmail());
    

简单的说明:

如果是在MyBatis中,需要再对应的xml编写这样的sql select column1,column2... from table where id=#{id}

这里的id指的是主键。根据主键获取对应的信息。

selectById的源码如下:

    /**
     * <p>
     * 根据 ID 查询
     * </p>
     *
     * @param id 主键ID
     * @return T
     */
    T selectById(Serializable id);

2.selectOne()

演示示例:

    EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("user_id", 4);

        UserEntity user = ud.selectOne(wrapper);
        System.out.println(user.getEmail());

对应的sql 是 select * from user where user_id=#{userId}

如果你想指定需要的字段,而不全部查出来,当然这有助于sql优化,可以通过wrapper调用,上面代码就变成这样

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.setSqlSelect("email","username");
        wrapper.eq("user_id", 4);

        UserEntity user = ud.selectOne(wrapper);
        System.out.println(user.getEmail());

wrapper.setSqlSelect()中的必须要写数据表中的列名,而不是对应JavaBean的属性名。这个是要注意的地方。

3.selectByMap()

这个方法主要是针对集合的,而不是单个数据查询。

演示代码如下:

    Map<String,Object> columnMap = new HashMap<String,Object>();
        columnMap.put("username", "test");
        List<UserEntity> list =ud.selectByMap(columnMap);
        for (UserEntity userEntity : list) {
            System.out.println(userEntity.getCreateTime());
        }

相当于的sql是 select * from user where username=#{username}

put中的和相当于#{username}占位符。

源代码如下:

    /**
     * <p>
     * 查询(根据 columnMap 条件)
     * </p>
     *
     * @param columnMap 表字段 map 对象
     * @return List<T>
     */
    List<T> selectByMap(Map<String, Object> columnMap);

4.selectList()

顾名思义,也是查询集合数据

演示代码如下:

    EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        List<UserEntity> list =ud.selectList(wrapper);
        for (UserEntity userEntity : list) {
            System.out.println(userEntity.getCreateTime());
        }

不过不同的是,如果selectList(null),参数值为null,那么就意味着查询所有不含条件。wrappper就相当于条件。

wrapper可以指定很多条件,如下所示:

        wrapper.between(column, val1, val2)
        wrapper.groupBy(columns)  //对应sql中分组
        wrapper.eq(column, params) //相当于where条件
        wrapper.in(column, value) //sql中in
        wrapper.notIn(column, value) //sql中 not in
        wrapper.orderBy(columns, isAsc) //排序
        wrapper.exists(value) //相对于sql中exists查询
        wrapper.notExists(value) //相当于sql中not exists查询
        wrapper.notBetween(column, val1, val2) //相当于sql中在某个范围内使用的between
        wrapper.ge(column, params) //大于等于
        wrapper.le(column, params) //小于等于
        wrapper.like(column, value) //模糊查询
        wrapper.having(sqlHaving, params) //条件过滤

只要符合你的业务需要,都能使用。

方法名很容易理解。

源码如下:

    /**
     * <p>
     * 查询列表
     * </p>
     *
     * @param wrapper 实体包装类 {@link Wrapper}
     * @return
     */
    List<T> selectList(Wrapper<T> wrapper);

5.selectCount()

演示代码如下:

    EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        int lines =ud.selectCount(wrapper);
        System.out.println(lines);
    

查询符合条件的数量,通常情况下用于分页查询总数。

源代码如下:

    /**
     * <p>
     * 根据 Wrapper 条件,查询总记录数
     * </p>
     *
     * @param wrapper 实体对象
     * @return int
     */
    int selectCount(Wrapper<T> wrapper);

6.selectMap

演示代码如下:

    EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");

        UserEntity user = new UserEntity();
        Map<String,Object> map= ud.selectMap(wrapper);
        map.put("user", user);

        for (String u : map.keySet()) {
            System.out.println(map.get(u));
        }

这是通过Map的形式遍历,不过只能获取一条数据。

源代码如下:

    /**
     * <p>
     * 根据 Wrapper,查询一条记录
     * </p>
     *
     * @param wrapper {@link Wrapper}
     * @return Map<String,Object>
     */
    Map<String, Object> selectMap(Wrapper<T> wrapper);

这种使用场景的话,就目前我而言,没有用到过。

当然,我也一再强调,没有用到,并不代表没用。

7.selectMaps

演示代码如下:

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        UserEntity user = new UserEntity();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("user", user);

        List<Map<String,Object>> list= ud.selectMaps(wrapper);
        list.add(map);
        for (Map<String, Object> maps : list) {
            System.out.println(maps.keySet()+"||"+maps.values());
        }

主要用于查询集合数据

源码如下:

    /**
     * <p>
     * 查询列表
     * </p>
     *
     * @param wrapper {@link Wrapper}
     * @return
     */
    List<Map<String, Object>> selectMaps(Wrapper<T> wrapper);

关于Map相关的一系列源码,我会再后续章节详细讲解。

此次主要讲的是MyBatis Plus的常用和包含的方法

8.selectPage

演示示例1:

List<UserEntity> records = ud.selectList(null);
        int lines = ud.selectCount(null);
        Page<UserEntity> page = new Page<UserEntity>();
        page.setLimit(0);
        page.setSize(10);
        page.setRecords(records);
        page.setCurrent(1);
        page.setTotal(lines);
        System.out.println(ud.selectPage(page));

演示示例2:

    List<UserEntity> records = ud.selectList(null);
        int lines = ud.selectCount(null);
        EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        Page<UserEntity> page = new Page<UserEntity>();
        page.setLimit(0);
        page.setSize(10);
        page.setRecords(records);
        page.setCurrent(1);
        page.setTotal(lines);
        System.out.println(ud.selectPage(page, wrapper));

主要是用于翻页查询,可以理解为分页查询

非常易懂

limit索引从几开始

size每页显示多少条数据

record集合数据放置

current当前页

total总数

源码如下:

    /**
     * <p>
     * 翻页查询
     * </p>
     *
     * @param page 翻页对象
     * @return
     */
    Page<T> selectPage(Page<T> page);
    /**
     * <p>
     * 翻页查询
     * </p>
     *
     * @param page    翻页对象
     * @param wrapper 实体包装类 {@link Wrapper}
     * @return
     */
    Page<T> selectPage(Page<T> page, Wrapper<T> wrapper);

9.selectObj

演示代码如下:

        EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");

        Object obj = ud.selectObj(wrapper);
        System.out.println(obj);

返回的结果是该用户对应的ID

源码如下:

    /**
     * <p>
     * 根据 Wrapper,查询一条记录
     * </p>
     *
     * @param wrapper {@link Wrapper}
     * @return Object
     */
    Object selectObj(Wrapper<T> wrapper);

10.selectObjs

演示代码如下:

        EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");

        List<Object> obj = ud.selectObjs(wrapper);
        for (Object object : obj) {
            System.out.println(object);
        }

selectObj返回符合条件的一条数据,该selectObjs返回全部符合条件的数据

源码如下:

    /**
     * <p>
     * 根据 Wrapper 条件,查询全部记录
     * </p>
     *
     * @param wrapper 实体对象封装操作类(可以为 null)
     * @return List<Object>
     */
    List<Object> selectObjs(Wrapper<T> wrapper);

小结:

其实查询还有几个,不过那几个我不是特别理解,所有就没有列出来了,上述列出的除了倒数两个不常用,其他或多或少十分常用。

如果你项目最初开发,使用的持久层为MyBatis Plus,你可以参考我的这篇文章MP实战系列(六)之代码生成器讲解

直接通过代码生成器开发,一次性生成所有实体、DAO、Service及其实现类和XML文件。绝对比MyBatis的逆向工程要简洁好用的多。

通过MyBatis Plus,你的开发效率,我相信可以提高70%或者80%。我公司目前采用这个,同事们的开发效率提高了很多。项目进展也比较快。

当然,我希望我以后能更深入的掌握MyBatis Plus的原理或者MyBatis也行。因为MyBatis Plus就是从MyBatis衍生出来的。

原文地址:https://www.cnblogs.com/youcong/p/9314309.html

时间: 2024-10-11 10:24:36

MP实战系列(十二)之封装方法详解(续二)的相关文章

artDialog学习之旅(二)之扩展方法详解

名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集的情况这是iframe应用工具集中的核心方法,你可以用它来操作父页面对象(包括上面的对话框) art.dialog.data(name, value) 跨框架数据共享写入接口.框架与框架之间以及与主页面之间进行数据交换是非常头疼的事情,常规情况下你必须知道框架的名称才能进行数据交换,如果是在复杂的多

Handler详解系列(五)——Handler的post()方法详解

MainActivity如下: package cc.testui1; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /*

AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 2,预检请求 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的.下面的2种情况需要进行预检:a,不是上面的简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求b,在请求中设置自定义头,比如 X-JSON.X-MENGXI

MongoDB副本集配置系列十:MongoDB local库详解和数据同步原理

1:local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 gechongrepl:PRIMARY> use local switched to db local gechongrepl:PRIMARY> show tables me oplog.rs replset.minvalid slaves startup_log system.indexes system.replset temp 2:local库下的每个集合分别记录的内容 local库下面的me集合保存了服务器名称

Exchange Server 2016管理系列课件02.创建邮箱方法详解

在现有域账户上开启邮箱 选择[用户邮箱]选择[现有用户]选择用户邮箱存放的数据库.创建完成. 开启邮箱的同时新建域账户 设置新账户的信息.点开更多选项,继续设置密码.邮箱创建完成.打开AD用户和计算机,可以看到账号也同时创建了. 将已断开链接的邮箱关联到现有的域账户 首先禁用邮箱.然后连接已禁用的邮箱.打开连接邮箱的向导.也可以使用Powershell查询已断开连接的邮箱. Get-MailboxDatabase | Get-MailboxStatistics | Where{$_.Discon

MP实战系列(二)之集成swagger

其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同的资源有不同的请求标识.例如PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH等. 对于技术的初学,最好的话还是建议去官网,官网最详细也最权威,虽然不少博客对此有挺好的解说,但还是强烈建议去官网,不要求仔仔细细阅读,至少读个大概. 对于目前,有人要问我swagger能做什么

MP实战系列(九)之集成Shiro

下面示例是在之前的基础上进行的,大家如果有什么不明白的可以参考MP实战系列的前八章 当然,同时也可以参考MyBatis Plus官方教程 建议如果参考如下教程,使用的技术为spring+mybatis plus + springmvc+jdk8+maven工程 满足这个条件可以减少不必要的麻烦,当然持久层也可以用mybatis. 只要按照如下示例来,也不会有大问题的.之前我也强调过mybatis和mybatis plus的区别主要是封装和继承,mybatis plus封装一系列增删改查的方法,但

MP实战系列(七)之集成springboot

springboot是现在比较流行的微服使用的框架,springboot本质上就是将spring+springmvc+mybatis零配置化,基本上springboot的默认配置符合我们的开发.当然有一部分还是需要自定义的. 本章不是专门讲springboot的,主要将springboot+mybatis plus是如何整合的. 一.导入pom依赖 <parent> <groupId>org.springframework.boot</groupId> <arti

Velocity魔法堂系列二:VTL语法详解

一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不同的平台上,如.Net的NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少哦. 最好的学习资源——官网:http://velocity.apache.org/ 本系列打算采用如下结构对Velocity进行较为