前言

在项目中经常会使用到一些简单的联合查询获取对应的数据信息,我们常规都是会根据对应的mapper接口写对应的mapper.xml的来通过对应的业务方法来调用获取,针对这一点本人感觉有点繁琐,就对@select注解联合查询进行探索和尝试,并将自己总结的分享给大家,有不到之处,敬请大家批评指正!!!

  • pom.xml所用到依赖如下

  1.     <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5.  
  6. <dependency>
  7. <groupId>org.projectlombok</groupId>
  8. <artifactId>lombok</artifactId>
  9. <optional>true</optional>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-test</artifactId>
  14. <scope>test</scope>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.mybatis.spring.boot</groupId>
  18. <artifactId>mybatis-spring-boot-starter</artifactId>
  19. <version>2.2.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>mysql</groupId>
  23. <artifactId>mysql-connector-java</artifactId>
  24. <version>5.1.38</version>
  25. </dependency>
  • application.yml的配置如下:

  1. server:
  2. port: 8888
  3.  
  4. spring:
  5. datasource:
  6. driver-class-name: com.mysql.jdbc.Driver
  7. url: jdbc:mysql://localhost:3306/project?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false
  8. username: root
  9. password: 123456
  10. mybatis:
  11. type-aliases-package: com.songwp.snowflake.entity
  12. mapper-locations: classpath:mybatis/mapper/*.xml
  13. configuration:
  14. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • 数据库测试表

  1. -- ----------------------------
  2. -- Table structure for sys_dept
  3. -- 部门表
  4. -- ----------------------------
  5. DROP TABLE IF EXISTS `sys_dept`;
  6. CREATE TABLE `sys_dept` (
  7. `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '部门ID',
  8. `user_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户ID',
  9. `dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '部门名称',
  10. `parent_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '父级部门ID',
  11. `parent_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '父级部门名称',
  12. `status` int(5) DEFAULT 0 COMMENT '部门状态:0-正常 1-禁用',
  13. PRIMARY KEY (`id`) USING BTREE
  14. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
  15.  
  16. -- ----------------------------
  17. -- Records of sys_dept
  18. -- ----------------------------
  19. INSERT INTO `sys_dept` VALUES ('5a8f893eedef4eafbc66feded3541c0f', '4117460f-20f7-47e7-bf8a-507a32880c06', '集团本部', 'GS-001', '集团本部', 0);
  20. INSERT INTO `sys_dept` VALUES ('6271dd03e426400b9fd001bae9074efc', '4117460f-20f7-47e7-bf8a-507a32880c06', '财务部门', 'GS-003', '集团本部', 0);
  21. INSERT INTO `sys_dept` VALUES ('f33503159a084e73b4e1313932cc9629', '4117460f-20f7-47e7-bf8a-507a32880c06', '研发部门', 'GS-002', '集团本部', 0);
  22.  
  23. -- ----------------------------
  24. -- Table structure for sys_user
  25. -- 用户表
  26. -- ----------------------------
  27. DROP TABLE IF EXISTS `sys_user`;
  28. CREATE TABLE `sys_user` (
  29. `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键ID',
  30. `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
  31. `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '真实姓名',
  32. `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
  33. `gender` int(5) DEFAULT 1 COMMENT '性别:0-女 1-男',
  34. `age` int(5) DEFAULT NULL COMMENT '年龄',
  35. `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系电话',
  36. `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '住址',
  37. `status` int(5) DEFAULT 0 COMMENT '用户状态:0-正常 1-冻结 2- 已注销',
  38. `birthday` date DEFAULT NULL COMMENT '生日',
  39. `create_time` datetime DEFAULT NULL COMMENT '添加时间',
  40. `create_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  41. `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  42. `update_user` varchar(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
  43. `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  44. PRIMARY KEY (`id`) USING BTREE
  45. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
  46.  
  47. -- ----------------------------
  48. -- Records of sys_user
  49. -- ----------------------------
  50. INSERT INTO `sys_user` VALUES ('4117460f-20f7-47e7-bf8a-507a32880c06', 'zs', '张三', '123456', 0, 25, '13888888888', '陕西西安', 0, '1996-05-07', '2022-03-28 10:17:54', '张三', NULL, NULL, NULL);
  51. INSERT INTO `sys_user` VALUES ('fb962a7f-3a61-4312-820c-9e67eefaa74a', 'zll', '赵老六', '123456', 1, 28, '13666666666', '陕西西安', 0, '1992-05-07', '2022-03-28 10:14:45', '赵老六', NULL, NULL, NULL);
  • @select注解中SQL的写法

假设我想用户名(username)为“zs”和密码(password)为“123456”的条件下用户的信息和对应部门的信息为例:

  1. SELECT
  2. u.username,
  3. u.PASSWORD,
  4. u.nickname,
  5. u.phone,
  6. u.gender,
  7. u.address,
  8. d.id AS dept_id,
  9. d.dept_name,
  10. d.STATUS AS dept_status
  11. FROM
  12. sys_user u
  13. INNER JOIN sys_dept d ON u.id = d.user_id
  14. WHERE
  15. u.username = 'zs'
  16. AND u.PASSWORD = '123456'
  • Navicat中结果执行如下:

  • mapper接口

  1. @Select("<script> SELECT " +
  2. "u.username," +
  3. "u.password," +
  4. "u.nickname," +
  5. "u.phone," +
  6. "u.gender," +
  7. "u.address," +
  8. "d.id as dept_id," +
  9. "d.dept_name," +
  10. "d.status as dept_status " +
  11. "from" +
  12. " sys_user u" +
  13. " inner join sys_dept d on u.id = d.user_id " +
  14. " where u.username = #{username} <when test='password !=null'> " +
  15. " and u.password = #{password} </when> </script>")
  16. List<Map> getByParmsMap(String username, String password);
  1. 1@Select注解基本用法
  2. @Select注解的目的是为了取代xml中的select标签,只作用于方法上面。下面看一下@Select注解的源码介绍:
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Target(ElementType.METHOD)
  5. public @interface Select
  6. {
  7. String[] value();
  8. }
  9. 从上述可以看到两点信息:
  10. 1@Select注解只能修饰方法
  11. 2@Select注解的值是字符数组。
  12. 所以,@Select注解的用法是这样的:
  13. @Select({ "select * from xxx", "select * from yyy" })
  14. Person selectPersonById(Integer id);
  15. 虽然@Select注解的值是字符数组,但是真正生效的应该是最后那条SQL语句。这一点请大家要留意一下。
  16. 2@Select注解动态SQL拼写
  17. 普通的字符串值,只能实现变量的替换功能,如下所示,
  18. @Select("select * from t_person where id = #{id}")
  19. Person selectPersonById(Integer id);

  20. 如果要想实现复杂的逻辑判断,则需要使用标签,如下所示:
  21. @Select("<script> select * from t_person where id = #{id}
  22. <when test='address !=null'> and address = #{address}
  23. </when> </script>")
  24. Person selectPersonById(Integer id);
  25. 其实,标签并非是@Select注解专用的,其他的注解,例如@Insert@Update等等,都可以使用的。
  • 业务层service接口

  1. List<Map> getByParmsMap(String username, String password);
  • 业务实现类的方法

  1. public List<Map> getByParmsMap(String username, String password) {
  2. return userMapper.getByParmsMap(username,password);
  3. }
  • 控制器controller方法

  1. @RequestMapping(value = {"/getByParmsMap"}, method = RequestMethod.GET)
  2. @ResponseBody
  3. public List<Map> getByParmsMap(@RequestParam("username")String username,@RequestParam("password")String password){
  4. return userService.getByParmsMap(username,password);
  5. }
  • Postman接口调用如下

  1. [
  2. {
  3. "password": "123456",
  4. "address": "陕西西安",
  5. "gender": 0,
  6. "phone": "13888888888",
  7. "nickname": "张三",
  8. "dept_name": "集团本部",
  9. "dept_status": 0,
  10. "dept_id": "5a8f893eedef4eafbc66feded3541c0f",
  11. "username": "zs"
  12. },
  13. {
  14. "password": "123456",
  15. "address": "陕西西安",
  16. "gender": 0,
  17. "phone": "13888888888",
  18. "nickname": "张三",
  19. "dept_name": "财务部门",
  20. "dept_status": 0,
  21. "dept_id": "6271dd03e426400b9fd001bae9074efc",
  22. "username": "zs"
  23. },
  24. {
  25. "password": "123456",
  26. "address": "陕西西安",
  27. "gender": 0,
  28. "phone": "13888888888",
  29. "nickname": "张三",
  30. "dept_name": "研发部门",
  31. "dept_status": 0,
  32. "dept_id": "f33503159a084e73b4e1313932cc9629",
  33. "username": "zs"
  34. }
  35. ]
  • 如下图所示:

Mybatis中@select注解联合查询的更多相关文章

  1. Mybatis oracle多表联合查询分页数据重复的问题

    Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...

  2. MyBatis 中两表关联查询MYSQL (14)

    MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...

  3. mybatis 使用@Select 注解,因为字符编码不一致导致mybatis 报错

    使用 mybatis 的@Select 注解, @Select({ "<script>select " + ALL_COLUMNS + " from &quo ...

  4. 【mybatis】mybatis 中select 查询 select * 查询出来的数据,字段值带不出来 数据不全

    原来的代码如下: <select id="findByGoodsUid" resultType="com.pisen.cloud.luna.ms.goods.bas ...

  5. MyBatis中实现多表查询

    如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1  业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...

  6. mybatis实现多表联合查询

    本文转自:http://www.cnblogs.com/xdp-gacl/p/4264440.html#!comments 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) ...

  7. Mybatis中的多表查询 多对一,一对多

    示例:用户和账户 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 步骤: 1.建立两张表:用户表,账户表 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中 ...

  8. Oracle使用MyBatis中RowBounds实现分页查询

    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行 ...

  9. 在Mybatis中使用连表查询的一次实际应用

    以前在工作中很少使用多表关联查询,对连表查询的具体作用和使用场景也没有很直观的认识,通过这次在项目中的实际应用,对此有了一定的认识,特记录如下. 关联表介绍: 分别是属性表attr_info.属性值表 ...

随机推荐

  1. HTTP和HTTPS有什么不同

    网站的URL会分为两部分:通信协议和域名地址. 域名地址都很好理解,不同的域名地址表示网站中不同的页面,而通信协议,简单来说就是浏览器和服务器之间沟通的语言.网站中的通信协议一般就是HTTP协议和HT ...

  2. Xray学习

    Xray 目前支持的漏洞检测类型包括: XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd-injection) 目录枚举 (k ...

  3. react实战系列 —— 起步(mockjs、第一个模块、docusaurus)

    其他章节请看: react实战 系列 起步 本篇我们首先引入 mockjs ,然后进入 spug 系统,接着模仿"任务计划"模块实现一个类似的一级导航页面("My任务计划 ...

  4. VMWARE vcenter重置root密码

    1\重启VCSA 2\在GNU GRUBc的时候,按住e键,在后面加上一句命令 3.rw init=/bin/bash 4. 按CTRL-X或者按住F10,启动系统 5. 使用passwd命令修改ro ...

  5. Django视图函数:CBV与FBV (ps:补充装饰器)

    CBV 基于类的视图  FBV 基于函数的视图 CBV: 1 项目目录下: 2 urlpatterns = [ 3 path('login1/',views.Login.as_view()) #.as ...

  6. 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...

  7. 论文解读(DAGNN)《Towards Deeper Graph Neural Networks》

    论文信息 论文标题:Towards Deeper Graph Neural Networks论文作者:Meng Liu, Hongyang Gao, Shuiwang Ji论文来源:2020, KDD ...

  8. 超清晰的 DNS 原理入门指南,看这一篇就够了~

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! DNS 是互联网核心协议之一.不管是上网浏览,还是编程开 ...

  9. ThinkPHP信息泄露

    昨天遇到了一个ThinkPHP日志泄露,然后我就写了个脚本利用shodan搜索批量的来找一下漏洞,估计已经被人撸完了,不过还有一些网站有着此漏洞.ip收集和漏洞验证脚本工具我会放在最下面,需要的直接复 ...

  10. font-family样式对照表

    .a { font-family: "微软雅黑" } .b { font-family: "黑体" } .c { font-family: "楷体&q ...