mybatis通用mapper的Example查询

2023-11-07

    mybatis的通用mapper,多用于单表查询,接口内部为我们提供了单表查询的基础查询语法,可以极大地帮助我们简化编程。

接下来让我们动手试一试:

我建的是springboot项目:

先导依赖:

		<dependency>
			<groupId>tk.mybatis</groupId>
			<artifactId>mapper-spring-boot-starter</artifactId>
			<version>2.0.4</version>
		</dependency>

这里连接池我用的是阿里的druid,数据库用的mysql

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.12</version>
		</dependency>

我的数据库两张测试用表:

t_roles​​​
t_users​

 

接下来搭建基本框架,先写实体类:

需要注意的是:使用通用Mapper需要给实体类加注解:

@Entity
@Table(name="t_users")
public class User implements Serializable{

	private static final long serialVersionUID = 8941012353272388061L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long id;
	
	@Column
	private String name;
	
	@Column
	private String password;
	
	@Column(name="role_id")
	private Long roleId;

}

别忘了实体类的getter/setter方法,然后dao层实现Mapper接口,注意UserMapper是接口不是类

public interface UserMapper extends Mapper<User> {

}

然后在主类上打开mapper扫描,

       注意是tk.mybatis下的@MapperScan,  不要导成org.mybatis.spring.annotation.MapperScan

import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("com.test.dao")
public class MapperTestApplication {
	public static void main(String[] args) {
		SpringApplication.run(MapperTestApplication.class, args);
	}
}

准备就绪,接下来测试;

1)、(单条件查询)根据role_id查询所有人

            业务类:


	/*
	 * 根据role_id查询所有人
	 * select * from t_users where role_id = ?;
	 */
    @Override
	public List<User> selectByUser1(User user) {
		Example example = new Example(User.class,true,true);
		Example.Criteria ec = example.createCriteria();
		ec.andEqualTo("roleId", user.getRoleId());
		return userMapper.selectByExample(example);
	}

          测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MapperTestApplicationTests {
	
	@Autowired
	private IUserServ userServ;

	@Test
	public void contextLoads() {
		User user = new User();
		user.setRoleId(1L);
		List<User> ulist = userServ.selectByUser1(user);
		ulist.forEach(System.err::println);
	}

}

        测试结果:通过:控制台打印

DEBUG 6268 --- [main] com.test.dao.UserMapper.selectByExample  : ==>  Preparing: SELECT id,name,password,role_id FROM t_users WHERE ( role_id = ? ) 
DEBUG 6268 --- [main] com.test.dao.UserMapper.selectByExample  : ==> Parameters: 1(Long)
DEBUG 6268 --- [main] com.test.dao.UserMapper.selectByExample  : <==      Total: 4
User [id=2, name=员工1, password=111, roleId=1, role=Role [id=null, describe=null]]
User [id=3, name=员工2, password=222, roleId=1, role=Role [id=null, describe=null]]
User [id=4, name=员工3, password=333, roleId=1, role=Role [id=null, describe=null]]
User [id=5, name=员工4, password=444, roleId=1, role=Role [id=null, describe=null]]

 

2)测试二:(多条件查询) 

业务类:

	/*
	  (多条件查询)根据role_id查询id大于min小于max,或者name为?的人
	 * select * from t_users where role_id = ? and id between min and max and name = ?
	 */
	@Override
	public List<User> selectByUser2(Long min,Long max,User user) {
		Example example = new Example(User.class,true,true);
		Example.Criteria ec = example.createCriteria();
		ec.andEqualTo("roleId", user.getRoleId()).andBetween("id", min, max).orEqualTo("name", user.getName());
		return userMapper.selectByExample(example);
	}

测试类:

	@Test
	public void contextLoads() {
		User user = new User();
		user.setRoleId(1L);
		user.setName("员工4");
		List<User> ulist = userServ.selectByUser2(2L,3L,user);
		ulist.forEach(System.err::println);
	}

测试结果:通过。控制台打印:

DEBUG 14728 --- [main] com.test.dao.UserMapper.selectByExample  : ==>  Preparing: SELECT id,name,password,role_id FROM t_users WHERE ( role_id = ? and id between ? and ? or name = ? ) 
DEBUG 14728 --- [main] com.test.dao.UserMapper.selectByExample  : ==> Parameters: 1(Long), 2(Long), 3(Long), 员工4(String)
DEBUG 14728 --- [main] com.test.dao.UserMapper.selectByExample  : <==      Total: 3
User [id=2, name=员工1, password=111, roleId=1, role=Role [id=null, describe=null]]
User [id=3, name=员工2, password=222, roleId=1, role=Role [id=null, describe=null]]
User [id=5, name=员工4, password=444, roleId=1, role=Role [id=null, describe=null]]

3)排序(我们继续用刚才的多条件查询,结果倒序)

select * from t_users where ( role_id = ? and id between ? and ? or name = ? ) order by id DESC 

业务层:(加example.setOrderByClause("id DESC");)

	@Override
	public List<User> selectByUser2(Long min,Long max,User user) {
		Example example = new Example(User.class,true,true);
		Example.Criteria ec = example.createCriteria();
		ec.andEqualTo("roleId", user.getRoleId()).andBetween("id", min, max).orEqualTo("name", user.getName());
		example.setOrderByClause("id DESC");
		return userMapper.selectByExample(example);
	}

测试类不变:

测试结果:通过:控制台打印

DEBUG 10780 --- [main] com.test.dao.UserMapper.selectByExample  : ==>  Preparing: SELECT id,name,password,role_id FROM t_users WHERE ( role_id = ? and id between ? and ? or name = ? ) order by id DESC 
DEBUG 10780 --- [main] com.test.dao.UserMapper.selectByExample  : ==> Parameters: 1(Long), 2(Long), 3(Long), 员工4(String)
DEBUG 10780 --- [main] com.test.dao.UserMapper.selectByExample  : <==      Total: 3
User [id=5, name=员工4, password=444, roleId=1, role=Role [id=null, describe=null]]
User [id=3, name=员工2, password=222, roleId=1, role=Role [id=null, describe=null]]
User [id=2, name=员工1, password=111, roleId=1, role=Role [id=null, describe=null]]

此外:Example类还为我们封装了指定列查询,排除列查询等许多单表查询的方法,具体需求具体分析,我们可以去追 Example类的源码找寻自己需要的方法。

总结:通用Mapper适合于基于单表的复杂查询,涉及多张表的查询建议使用反向映射生成mapper.XML查询

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis通用mapper的Example查询 的相关文章

随机推荐

  • 大数据是什么意思?

    一 大数据的概念 大数据是指无法在一定时间内用常规软件工具对其内容进行抓取 管理和处理的数据集合 大数据技术 是指从各种各样类型的数据中 快速获得有价值信息的能力 适用于大数据的技术 包括大规模并行处理 MPP 数据库 数据挖掘电网 分布式
  • stm32中使用cJSON

    STM32中使用cJSON cJSON 下载地址 https github com DaveGamble cJSON 将其拉取到本地是有很多文件 但只有两个比较重要 cJSON c cJSON h 我们将其添加到自己工程目录下 其中 在进行
  • 【华为面试题】深度优先搜索(一)

    题目 Jungle居住在蓝鲸城 一个拥有规则街道的城市 然而 街道每天的封闭情况都是不同的 为了测试Jungle的导航技巧 我们设置了以下挑战 Jungle必须从他的家 表示为 S 出发 前往公司 表示为 T 街道图由以下元素构成 代表可走
  • 华三交换机端口镜像抓包实战

    目录 1 端口镜像的使用场景 2 华三交换机配置端口镜像 web 命令行 3 wireshark分析配置端口镜像前后抓包的数据区别 1 端口镜像的使用场景 端口镜像 Mirror Port 功能通过在交换机或路由器上 将一个或多个源端口的数
  • Qt学习笔记(QFile)

    文件操作 基础课以文件操作结尾 QFile 无非就是读和写操作 QFile file 路径 file open 打开方式 QIODevice ReadOnly file readAll readLine file atEnd 判断是否到文件
  • C++实现 快速排序

    目录 一 快速排序主函数 代码如下 二 分区函数 1 选取支点 2 定义左右指针 移动指针 3 返回分割点的位置 代码如下 三 swap函数 元素互换 代码如下 四 printArr函数 打印输出 代码如下 完整代码如下 测试方法如下 运行
  • 小米VS华为:水军?黑稿?到底是谁黑了谁?

    那边罗永浩和黄章互相吐槽还没结束 雷军又向华为开炮 雷军发微博称 其被华为水军黑了 事情的起因其实很简单 一位微博名为 IT华少 的网友称 小米手机4的芯片没有进行点胶处理 所以认定其 做工粗糙 不如华为的荣耀6 雷军在看到华强电子产业研究
  • CentOS7 系统简单 Python 环境使用

    文章目录 1 CentOS7 系统简单 Python 环境使用 1 1 查看当前系统 Python 版本 1 2 使用 CentOS7 系统中的 Python3 版本 1 3 CentOS7 系统中 Pycharm 环境使用 1 4 Pyc
  • 数据库ALTER语句使用

    ALTER语句使用 ALTER是数据库DDL语言的一部分 其操作对像主要是可以是表中的字段和索引 一般被用来修改上述对象的部分 1 操作表 1 1 表中增加列 ALTER TABLE tbl name ADD COLUMN column n
  • xgboost 安装问题(xgboost library (xgboost.dll) could not be loaded)win10+ anaconda3.8+pycharm最新社区版

    最近打算使用XGBOOST跑跑数据 奈何换了电脑 安装过程一把泪 1 搜索大部分安装办法 https blog csdn net qazplm155357 article details 107313915 utm medium distr
  • Spring Boot 性能优化几点

    点击下方 IT牧场 选择 设为星标 程序员大目 IT牧场公众号 BAT 技术专家分享开发 架构 运维相关干货 159篇原创内容 公众号 文章来源 http a nxw so 1biCvy 目录 异步执行 增加内嵌 Tomcat 的最大连接数
  • Bert的NSP任务的loss原理

    Bert的NSP任务是预测上句和下句的关系 对一个句子的表征可以用CLS的embedding bert的NSP任务 NSP 是一个预测两段文本是否在原文本中连续出现的二元分类损失 NSP 是一种二进制分类损失 用于预测原始文本中是否有两个片
  • 彻底理解Linux下动态替换.so的方法

    0x00 背景 hdfs增加了一个native方法 打成了libhadoop so这个动态库 需要分发到线上的各个Datanode上以便升级 在灰度分发到datanode时遇到了可复现的问题 即datanode进程肯定会core dump
  • scipy.sparse稀疏矩阵内积点乘--效率优化!

    在使用scipy和numpy做数据计算时 感觉运行速度较慢 但是程序已经到了使用多数计算使用内积运算地步了 真的不知道该如何优化 如果能够优化下内积运算该有多好啊 奔着这个目标 希望能够写一篇文章盘点各种内积优化方法 也算是贡献自己的微薄之
  • Java RMI 解析

    1 什么是RMI Java RMI 即 远程方法调用 Remote Method Invocation 一种用于实现远程过程调用 RPC Remote procedure call 的Java API 能直接传输序列化后的Java对象和分布
  • GD32替换STM32后 写片上闪存(flash)失败的解决方法

    目录 型号 问题 解决办法 下载gd的fmc操作库 修改fmc文件 使用 擦除一页 写一页 型号 使用的GD32C103CB等引脚替换STM32F103CB 问题 使用hal库的flash操作接口 片上flash可以正常擦除 但是无法写入
  • Flash Player 10 中的RTMFP协议(实现P2P技术)

    RTMFP是Adobe公司开发的一套新的通信协议 该协议可以让使用Adobe Flash Player的终端用户之间进行直接通信 用Adobe AIR框架开发的程序也可以用此协议来发布直播 实时信息 通过使用RTMFP 那些以来直播 实时通
  • 03多线程之间通讯

    线程之间的通信 一 为什么要线程通信 1 多个线程并发执行时 在默认情况下CPU是随机切换线程的 当我们需要多个线程来共同完成一件任务 并且我们希望他们有规律的执行 那么多线程之间需要一些协调通信 以此来帮我们达到多线程共同操作一份数据 2
  • linux内存文件系统

    写文件时 太耗内存的话 可以使用dma拷贝 或者使用内存文件系统的方式 但首先要搞清楚一点 正常的文件操作 多久会真正保存到磁盘中去呢 参考 浅谈Linux系统写磁盘机制 http blog sina com cn s blog 96757
  • mybatis通用mapper的Example查询

    mybatis的通用mapper 多用于单表查询 接口内部为我们提供了单表查询的基础查询语法 可以极大地帮助我们简化编程 接下来让我们动手试一试 我建的是springboot项目 先导依赖