继续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衍生出来的。

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

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

    之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...

  2. MP实战系列(十四)之分页使用

    MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...

  3. MP实战系列(十)之SpringMVC集成SpringFox+Swagger2

    该示例基于之前的实战系列,如果公司框架是使用JDK7以上及其Spring+MyBatis+SpringMVC/Spring+MyBatis Plus+SpringMVC可直接参考该实例. 不过建议最好 ...

  4. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  5. MP实战系列(十九)之批量新增

    批量操作在实际开发中也应用非常多,例如批量下发优惠券.批量添加用户等. 以MyBatis为例,通常实现批量操作,有这么几种方式? 第一,单条插入sql语句,进行for循环遍历,基准条件是根据前端传过的 ...

  6. MP实战系列(十八)之XML文件热加载

    你还在为每次修改XML文件中的SQL重新启动服务器或者是等待几分钟而烦恼吗? 配置了热加载即可解决你的这个问题. 这就是XML文件热加载的目的,减少等待时间成本,提高开发效率. SSM框架配置(Spr ...

  7. MP实战系列(十五)之执行分析插件

    SQL 执行分析拦截器[ 目前只支持 MYSQL-5.6.3 以上版本 ],作用是分析 处理 DELETE UPDATE 语句, 防止小白或者恶意 delete update 全表操作! 这里我引用M ...

  8. MP实战系列(十六)之性能分析插件

    性能分析拦截器,用于输出每条 SQL 语句及其执行时间. 虽然使用阿里的Druid连接池可以完成这个目的,但是,我们一般认为,目前的组件能够达到这个目的,尽量使用目前的组件,因为修改配置和引入第三方库 ...

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

    名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集 ...

随机推荐

  1. Android Interpolator(插值器)

    1.概述 插值器定义如何计算动画中的特定值作为时间的函数.例如,指定动画在整个动画中线性发生,这意味着动画在整个时间内均匀移动,或者指定动画以使用非线性时间,例如,在开始或结束时使用加速或减速动画. ...

  2. POJ2411(SummerTrainingDay02-I 状态压缩dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17187   Accepted: 991 ...

  3. Software-Defined Networking A Comprehensive Survey --阅读_day2

    3. 什么是SDN?(WHAT IS SOFTWARE-DEFINED NETWORKING?) The term SDN was originally coined to represent the ...

  4. 从无到有,用Nodejs+express+mongodb搭建简易登陆系统

    前端处理server表示很蛋疼,初学Node,虽然感觉异常强大,但是学起来还是有些吃力的,Node是工具,它不是万能的,搭建一个系统还是需要借助其他一些工具,对于我这个没怎么接触server的前端来说 ...

  5. Atcoder:AGC004F Namori

    传送门 先考虑树,树是一个二分图. 看到是二分图并且每次是对两边的同色的点反色可以想到转化:让奇数层的点为黑,偶数为白,变成每次可以交换两个点的颜色. 把黑看成 \(-1\),白看成 \(1\),那么 ...

  6. MaxScript与外部程序通讯

    最近项目要求通过java给max发送任务指令,max接收指令执行任务,并且返回执行的结果.不管为什么会有这样的需求,有就要去实现. 1.OLE开启 Max本身提供了一个方式,它可以将自己注册成一个Ol ...

  7. Android studio Connection failed (dl.google.com)

    公司的网,莫名其妙的不能更新了,却可以下载compile文件... 于是乎FQ,hosts,修改studio.exe.vmoptions文件 然并卵,都特么不行 搞了一天还是不行 这种问题或许可以找到 ...

  8. Android--解决EditText放到popupWindow中,原有复制、粘贴、全选、选择功能失效问题

    1.原来是将EditView放到了popupwindow,发现EditView原有的复制.粘贴.全选.选择功能失效了,所以便用DialogFragment代替了popupWindow 直接上代码 ①. ...

  9. servlet和jsp页面过滤器Filter的作用及配置

    刚刚有个朋友问我,Servlet的过滤器有什么作用? 现在发个帖子说明一下,            过滤器是一个对象,可以传输请求或修改响应.它可以在请求到达Servlet/JSP之前对其进行预处理, ...

  10. MySQL——索引实现原理

    在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 MyISAM引擎使用B+Tr ...