zoukankan      html  css  js  c++  java
  • 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衍生出来的。

  • 相关阅读:
    为什么杜蕾斯的文案工资月薪5万?
    在独立音乐上,网易云音乐是如何甩了其他音乐平台几条街?
    两次大战,为什么德国成不了世界霸主呢?
    在大城市打拼的你,是想留下还是想攒够了钱回家?
    生存在互联网公司是种怎样的体验?
    5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
    放下恩怨,曝小米中兴投关键性一票让华为顺利取得5G短码控制权
    中国唯一的科技城
    互联网圈的6大奇葩大产品经理:张小龙不在乎手机碎屏,马化腾让用户一秒变白痴
    为什么说中国快递分两种:一种叫顺丰,一种叫快递?
  • 原文地址:https://www.cnblogs.com/youcong/p/9314309.html
Copyright © 2011-2022 走看看