因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来应该会实现此功能。

由于本人开发习惯的原因,实在是太讨厌大量的xml充斥在整个项目中,尤其是表的mapper.xml,虽然有代码生成器可以生成,但是有些复杂的查询还是需要手写配置文件里的动态sql,这点比较反感(至于为什么反感,也是有多方面原因的)。

不过可能是大量的java开发人员已经被虐惯了,已经习惯各种配置文件,虽然有代码生成器,但是本人觉得,这种不是真正的路子,按理说开源出去的东西让别人用的越简单越爽越好,而不是还需要依赖大量的工具配合才能使用(这个观点仁者见仁智者见智吧)。

因为本人采用的是spring-boot进行开发,本身springboot就提倡采用不用配置自动配置的方式,所以真心希望mybatis(不是mybatis-plus)这点需要继续努力。

基于这点,采用了mybatis-plus里的已经实现好的方法来进行了取巧的操作,废话不多说,直接上代码。

数据库是mysql。

demo的思路是这样的:学生表(Student),学生班级表(StudentClass),在学生的实体类里通过班级Id和班级进行一对一关联,主要通过mapper接口来实现,基于@Results、@Result、@One(或@Many)、@ResultMap这几个mybatis里的注解加上

mybatis-plus里的BaseMapper、QueryWrapper<ChannelEntity>结合起来实现,所以还得写一些代码。

如果mybatis-plus团队把关系映射一并实现注解到实体对象上就能省大量代码了,期待他们早日实现。

pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.4.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.lyb</groupId>
  12. <artifactId>spring-mybatis-demo</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <packaging>jar</packaging>
  15. <name>spring-mybatis-demo</name>
  16. <description>Demo project for Spring Boot</description>
  17.  
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  21. <java.version>1.8</java.version>
  22. </properties>
  23.  
  24. <dependencies>
  25. <!--
  26. <dependency>
  27. <groupId>org.mybatis.spring.boot</groupId>
  28. <artifactId>mybatis-spring-boot-starter</artifactId>
  29. <version>2.0.0</version>
  30. </dependency>
  31. -->
  32.  
  33. <dependency>
  34. <groupId>com.baomidou</groupId>
  35. <artifactId>mybatis-plus-boot-starter</artifactId>
  36. <version>3.1.1</version>
  37. </dependency>
  38.  
  39. <dependency>
  40. <groupId>org.projectlombok</groupId>
  41. <artifactId>lombok</artifactId>
  42. <version>1.18.8</version>
  43. <scope>provided</scope>
  44. </dependency>
  45.  
  46. <dependency>
  47. <groupId>com.baomidou</groupId>
  48. <artifactId>mybatis-plus</artifactId>
  49. <version>3.1.1</version>
  50. </dependency>
  51.  
  52. <dependency>
  53. <groupId>mysql</groupId>
  54. <artifactId>mysql-connector-java</artifactId>
  55. <scope>runtime</scope>
  56. </dependency>
  57. <dependency>
  58. <groupId>com.baomidou</groupId>
  59. <artifactId>mybatis-plus-generator</artifactId>
  60. <version>3.1.1</version>
  61. </dependency>
  62. <dependency>
  63. <groupId>org.springframework.boot</groupId>
  64. <artifactId>spring-boot-starter-test</artifactId>
  65. <scope>test</scope>
  66. </dependency>
  67. </dependencies>
  68.  
  69. <build>
  70. <plugins>
  71. <plugin>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-maven-plugin</artifactId>
  74. </plugin>
  75. </plugins>
  76. </build>
  77.  
  78. </project>

可以看到数据库操作只需依赖mybatis-plus-boot-starter

application.yml文件

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
  4. username: root
  5. password: liuyabin
  6. driver-class-name: com.mysql.jdbc.Driver
  7. mybatis-plus:
  8. type-aliases-package: com.lyb.springmybatisdemo.entity
  9. type-aliases-super-type: java.lang.Object

Student实体类代码,可以看到实体类上加上了mybatis-plus的注解,这里也加了@Data lombok的注解为了节省多敲代码:

  1. package com.lyb.springmybatisdemo.entity;
  2.  
  3. import com.baomidou.mybatisplus.annotation.IdType;
  4. import com.baomidou.mybatisplus.annotation.TableField;
  5. import com.baomidou.mybatisplus.annotation.TableId;
  6. import com.baomidou.mybatisplus.annotation.TableName;
  7. import lombok.*;
  8.  
  9. @Data
  10. @Builder
  11. @ToString
  12. @EqualsAndHashCode
  13. @NoArgsConstructor
  14. @AllArgsConstructor
  15. @TableName(value = "student")
  16. public class Student {
  17. @TableId(value = "Id",type = IdType.AUTO)
  18. private int id;
  19. @TableField(value = "SName",exist = true,select = true)
  20. private String name;
  21. @TableField(value = "Age")
  22. private int age;
  23. @TableField(value = "ClassId")
  24. private int classId;
  25. @TableField(exist = false)
  26. private StudentClass studentClass;
  27. }

StudentClass类代码:

  1. package com.lyb.springmybatisdemo.entity;
  2.  
  3. import com.baomidou.mybatisplus.annotation.IdType;
  4. import com.baomidou.mybatisplus.annotation.TableField;
  5. import com.baomidou.mybatisplus.annotation.TableId;
  6. import com.baomidou.mybatisplus.annotation.TableName;
  7. import lombok.*;
  8.  
  9. @Data
  10. @Builder
  11. @ToString
  12. @EqualsAndHashCode
  13. @NoArgsConstructor
  14. @AllArgsConstructor
  15. @TableName(value = "stuClass")
  16. public class StudentClass {
  17. @TableId(value = "ClassId",type = IdType.AUTO)
  18. private int classId;
  19. @TableField(value = "ClassName")
  20. private String className;
  21. }

具体的数据库结构就不放了,参照实体类上注解就很能轻松构建出来,因为就两个表。

StudentClassMapper类代码:

  1. package com.lyb.springmybatisdemo.mapper;
  2.  
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.lyb.springmybatisdemo.entity.StudentClass;
  5. import org.apache.ibatis.annotations.Mapper;
  6.  
  7. @Mapper
  8. public interface StudentClassMapper extends BaseMapper<StudentClass> {
  9. }

这个mapper很简单,因为mybatis-plus里的BaseMapper已经将基础的单表操作给做了,并且该表没有一对多的需求,如果现实中确实有一对多的需求的话,可以参照下面一对一的方式实现。

StudentMapper代码:

  1. package com.lyb.springmybatisdemo.mapper;
  2.  
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5. import com.lyb.springmybatisdemo.entity.Student;
  6. import org.apache.ibatis.annotations.*;
  7.  
  8. import java.util.List;
  9.  
  10. @Mapper
  11. public interface StudentMapper extends BaseMapper<Student> {
  12. @Results(id="stuMap",value = {
  13. @Result(property = "id",column = "Id"),
  14. @Result(property = "name",column = "SName"),
  15. @Result(property = "age",column = "Age"),
  16. @Result(property = "classId",column = "ClassID"),
  17. @Result(property = "studentClass",column = "ClassID",one = @One(select = "com.lyb.springmybatisdemo.mapper.StudentClassMapper.selectById"))
  18. })
  19. @Select("SELECT * FROM STUDENT WHERE ID=#{id}")
  20. Student findStudentById(int id);
  21.  
  22. @Select("select * from Student where 1=1 and " +
  23. "${ew.sqlSegment}")
  24. @ResultMap(value = "stuMap")
  25. List<Student> selectStudents(@Param("ew") QueryWrapper<Student> wrapper);
  26.  
  27. }

主要关注selectStudents方法的代码。id="stuMap"的@Results里定义了一对一的关系,可以看到有一个@One(select = "com.lyb.springmybatisdemo.mapper.StudentClassMapper.selectById")的定义,该方法并没有在

StudentClassMapper里实现,而是mybatis-plus在BaseMapper里帮我们实现了,那就可以直接方便的拿过来用了,省了我们多谢一个方法的代码了。

selectStudents方法传入的参数QueryWrapper<Student> wrapper可以充分利用lambda来自己构建各种各样的where条件,而且注意该方法的@Select的类SQL的写法,这样不会出错。

接下来是就往两张表里插入多条数据,然后是测试代码:

  1. package com.lyb.springmybatisdemo;
  2.  
  3. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.lyb.springmybatisdemo.entity.Student;
  6. import com.lyb.springmybatisdemo.mapper.StudentMapper;
  7. import org.junit.Assert;
  8. import org.junit.Test;
  9. import org.junit.runner.RunWith;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.boot.test.context.SpringBootTest;
  12. import org.springframework.test.context.junit4.SpringRunner;
  13.  
  14. import java.util.List;
  15.  
  16. @RunWith(SpringRunner.class)
  17. @SpringBootTest
  18. public class SpringMybatisDemoApplicationTests {
  19.  
  20. @Autowired
  21. private StudentMapper studentMapper;
  22.  
  23. @Test
  24. public void testByWrapper(){
  25. QueryWrapper<Student> queryWrapper = new QueryWrapper<Student>();
  26. queryWrapper.lambda().eq(Student::getAge,2)
  27. .eq(Student::getClassId,1);
  28. List<Student> students = studentMapper.selectStudents(queryWrapper);
  29. }
  30. }

最后是springboot的启动类

  1. package com.lyb.springmybatisdemo;
  2.  
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6.  
  7. @SpringBootApplication
  8. @MapperScan("com.lyb.springmybatisdemo.mapper")
  9. public class SpringMybatisDemoApplication {
  10.  
  11. public static void main(String[] args) {
  12. SpringApplication.run(SpringMybatisDemoApplication.class, args);
  13. }
  14.  
  15. }

运行测试类如果按照查询条件插入了多条数据,即年龄是2,班级Id是1的数据,并且班级表里也插入了数据,结果会查询出来,并且结果里Student对象的studentClass属性是已经赋了值的。

到此此示例结束,希望对大家有所帮助。

springboot整合mybatis-plus基于纯注解实现一对一(一对多)查询的更多相关文章

  1. SpringBoot整合Mybatis多数据源 (AOP+注解)

    SpringBoot整合Mybatis多数据源 (AOP+注解) 1.pom.xml文件(开发用的JDK 10) <?xml version="1.0" encoding=& ...

  2. springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)

    一.注解方式 pom <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId& ...

  3. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例

    1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...

  4. SpringBoot整合Mybatis【非注解版】

    接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 ​ 选择Spring Initializr,配置JDK版本 ​ 输入项目名 ​ 选择构建web项目所需的state ...

  5. SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]

    SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...

  6. springboot整合mybatis(注解)

    springboot整合mybatis(注解) 1.pom.xml: <?xml version="1.0" encoding="UTF-8"?> ...

  7. SpringBoot整合Mybatis之xml

    SpringBoot整合Mybatis mybatis ORM框架.几个重要的概念: Mapper配置 : 可以使用基于XML的Mapper配置文件来实现,也可以使用基于Java注解的Mybatis注 ...

  8. springboot整合mybatis(SSM开发环境搭建)

    0.项目结构: ---------------------方法一:使用mybatis官方提供的Spring Boot整合包实现--------------------- 1.application.p ...

  9. SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)

    前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...

随机推荐

  1. 图片滚动js代码

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  2. echarts.js导致angular-translate加载模块失败

    echarts.js导致angular-translate加载模块失败,待解决

  3. Ubuntu 安装 docker,并上传到dockerhub

    一.安装Docker apt-get -y install docker.io 链接: ln -sf /usr/bin/docker.io /usr/local/bin/docker 检查docker ...

  4. ceph常用命令(3)

    1.查看集群配置信息 ceph daemon /var/run/ceph/ceph-mon.$(hostname -s).asok config show 2.在部署节点修改了ceph.conf文件, ...

  5. git学习教程二之远程仓库学习

    首先你需要注册一个github用户名,我的github账户是:1654218052@qq.com 由于本地的git仓库和github的仓库是通过SSH加密的,所以我们还需要设置一点东西哦 第1步:创建 ...

  6. 【Hadoop】MapReduce自定义分区Partition输出各运营商的手机号码

    MapReduce和自定义Partition MobileDriver主类 package Partition; import org.apache.hadoop.io.NullWritable; i ...

  7. OpenCV图像平移

    图像平移是将图像的所有像素坐标进行水平或垂直方向移动,也就是所有像素按照给定的偏移量在水平方向上沿x轴.垂直方向上沿y轴移动.这种操作分为两种,一种是图像大小不改变,这样最后原图像中会有一部分不在图像 ...

  8. Leetcode刷题6—不同路径

    一.要求 二.知识点 这道题属于动态规划,主要思路就是将大问题不断分解成小问题进行求解 三.解题思路 1.利用数学思路找规律 将m和n组合成一个m*n的矩阵,而且是一个对称阵 [[0],[1],[1] ...

  9. day26 封装、多态、内置函数、反射、动态导入

    今日内容 1.封装 什么是封装? 封装从字面意思上看就只将某种东西封起来装好,当我们代码中的某些方法与属性不想让外界进行访问时,就对这些属性进行特殊的处理,使这种属性或者方法不能被外界直接进行访问或者 ...

  10. Docker 运行 MYSQL 数据库的总结

    公司里面要求做一个小demo 学习java相关的东西 然后使用了mysql数据库 很早之前做过mysql的容器化运行. 现在想想已经忘记的差不多了  所以这里总结一下 docker化运行mysql数据 ...