一个简单的例子学会mybatis-generator+tk.mybatis插件 实现父子表关系查询

项目环境:

开发环境:IntelliJ IDEA 2019.3.1 ,JDK1.8 ,MySQL: 5.6.47
采用远程数据库连接:使用ailiyun ESC CentOS 7.0

项目技术:

学会使用mybatis-generator自动部署代码
学会使用tk.mybatis插件进行数据库的操作
学会实现父子表管子查询

项目资源连接:示例源代码

项目说明

 本项目采用mybatis-generator的自动生成插件和Tk插件结合,实现对父子表的联合查询,使返回结果包括父表信息和它的子表每个子数据信息。
在这里插入图片描述

项目准备

创建数据库schooldb

 使用Navicat创建数据库schooldb,并运行下面的sql文件

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tbl_student
-- ----------------------------
DROP TABLE IF EXISTS `tbl_student`;
CREATE TABLE `tbl_student`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `teacher_id` bigint(20) NULL DEFAULT NULL,
  `name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '学生姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;

-- ----------------------------
-- Records of tbl_student
-- ----------------------------
INSERT INTO `tbl_student` VALUES (1, 1, '小明', 15);
INSERT INTO `tbl_student` VALUES (2, 1, '小李', 15);
INSERT INTO `tbl_student` VALUES (3, 1, '小红', 14);
INSERT INTO `tbl_student` VALUES (4, 2, '小李', 14);
INSERT INTO `tbl_student` VALUES (5, 2, '王二', 15);
INSERT INTO `tbl_student` VALUES (6, 2, '张三', 13);

-- ----------------------------
-- Table structure for tbl_teacher
-- ----------------------------
DROP TABLE IF EXISTS `tbl_teacher`;
CREATE TABLE `tbl_teacher`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '老师姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '老师年龄',
  `phone` int(11) NULL DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;
-- ----------------------------
-- Records of tbl_teacher
-- ----------------------------
INSERT INTO `tbl_teacher` VALUES (1, '王老师', 45, 1596369856);
INSERT INTO `tbl_teacher` VALUES (2, '李老师', 32, 1358948956);

SET FOREIGN_KEY_CHECKS = 1;

项目结构

在这里插入图片描述

一、依赖与配置

依赖

在这里插入图片描述
pom.xml

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!--    增加配置数据库连接池的依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <!-- 加入对应mysql版本的mysql-connector-java版本-->
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <scope>runtime</scope>
                        <!-- 加入对应mysql版本的mysql-connector-java版本-->
                        <version>5.1.6</version>
                    </dependency>
                    <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.1.5</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <!--mybatis generator插件配置文件位置,默认值${basedir}/src/main/resources/generatorConfig.xml-->
                    <configurationFile>${basedir}/src/main/resources/mybatis-generator.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>

配置application.properties

#远程数据库连接
spring.datasource.url=jdbc:mysql://121.40.83.80:3306/schooldb?characterEncoding=UTF-8&useSSL=false
#数据库用户名
spring.datasource.username=alvin
#数据库密码
spring.datasource.password=123456
#数据源类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

mybatis.mapper-locations=classpath:/mapper/*.xml

配置Tk<Mapper>

 在utils包下 创建TkMapper.java类

/**
 * 继承
 * @param <T>
 */
public interface TkMapper<T> extends Mapper<T>, MySqlMapper<T> {
    //特别注意,该接口不能被扫描到,否则会出错
}

配置mybatis-generator.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <properties resource="application.properties"/>
    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="com.alvin.mybatis.utils.TkMapper"/>
            <property name="caseSensitive" value="true"/>
            <property name="forceAnnotation" value="true"/>
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
        </plugin>

        <commentGenerator>
            <!-- 这个元素用来去除指定生成的注释中是否包含生成的日期 false:表示保护 -->
            <!-- 如果生成日期,会造成即使修改一个字段,整个实体类所有属性都会发生变化,不利于版本控制,所以设置为true -->
            <property name="suppressDate" value="true" />
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="false" />
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://121.40.83.80:3306/schooldb"
                        userId="alvin"
                        password="123456">
        </jdbcConnection>
        <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
            <!--
                true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型
                false:默认,
                    scale>0;length>18:使用BigDecimal;
                    scale=0;length[10,18]:使用Long;
                    scale=0;length[5,9]:使用Integer;
                    scale=0;length<5:使用Short;
             -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>


        <!-- java模型创建器,是必须要的元素
            负责:1,key类(见context的defaultModelType);2,java类;3,查询类
            targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
            targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
         -->
        <javaModelGenerator targetPackage="com.alvin.mybatis.model" targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="true"/>
            <!-- 是否对model添加 构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!-- 生成SQL map的XML文件生成器,
            注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),
                或者只使用Mapper接口+Annotation,
                所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置
            targetPackage/targetProject:同javaModelGenerator
         -->
        <sqlMapGenerator targetPackage="mybatis" targetProject="src/main/resources">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>


        <!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口
            targetPackage/targetProject:同javaModelGenerator
            type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
                1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
                2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
                3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
            注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
        -->
        <javaClientGenerator targetPackage="com.alvin.mybatis.mapper" type="XMLMAPPER" targetProject="src/main/java">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 要生成哪些表 -->
        <table tableName="tbl_student" domainObjectName="Student" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
        </table>
        <table tableName="tbl_teacher" domainObjectName="Teacher" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
        </table>
        <table tableName="tbl_teacher_student" domainObjectName="TeacherStudent" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

配置启动类

 这里需要在启动类加入一个注解@MapperScan(basePackages = "com.alvin.mybatis.mapper"),注意它的引包是import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
//com.alvin.mybatis.mapper是我们扫描.mapper的地址
@MapperScan(basePackages = "com.alvin.mybatis.mapper")
public class MybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisApplication.class, args);
    }
}

配置data sources

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、自动生成

在这里插入图片描述
在这里插入图片描述
自动生成结果如下
在这里插入图片描述

三、实现父子表查询

数据层

  • StudentDto.java
public class StudentDto {
    private Long id;
    private String name;
    private Integer age;
    private Long teacherId;
    //省略setter/getter方法
}
  • TeacherDto.java
public class TeacherDto {
    private Long id;
    private String name;
    private Integer age;
    private Integer phone;
    private List<StudentDto> dtoList;
    //省略setter/getter方法
}

控制层

  • TestController.java
@Controller
public class TestController {
    @Autowired
    TestService testService;
    
    @ResponseBody
    @GetMapping("/test")
    public List<TeacherDto> search(
            @RequestParam Long id
    ){
        return testService.search(id);
    }
}

业务逻辑层

  • TestService.java
@Service
public class TestService {
    @Autowired
    StudentMapper studentMapper;
    @Autowired
    TeacherMapper teacherMapper;

    public List<TeacherDto> search(Long id){

        List<TeacherDto>  repList = new ArrayList<>();
        TeacherDto teacherDto = new TeacherDto();
        //查询该老师的所有信息
        Teacher teacher = teacherMapper.selectByPrimaryKey(id);
        BeanUtils.copyProperties(teacher,teacherDto);
        repList.add(teacherDto);
        //查询该老师的所有学生
        Example example = new Example(Student.class);
        example.createCriteria().andEqualTo("teacherId",id);
        List<Student> students = studentMapper.selectByExample(example);
        //查询每个学生的个人信息
        List<StudentDto> studentDtoList = new ArrayList<>();
        for(Student student : students){
            StudentDto studentDto = new StudentDto();
            BeanUtils.copyProperties(student,studentDto);

            studentDtoList.add(studentDto);
            teacherDto.setDtoList(studentDtoList);
        }
        return repList;
    }
}

也可以根据java8的特性使用stream代替for迭代

@Service
public class TestService {
    @Autowired
    StudentMapper studentMapper;
    @Autowired
    TeacherMapper teacherMapper;

    public List<TeacherDto> search(Long id){

        List<TeacherDto>  repList = new ArrayList<>();
        TeacherDto teacherDto = new TeacherDto();
        //查询该老师的所有信息
        Teacher teacher = teacherMapper.selectByPrimaryKey(id);
        BeanUtils.copyProperties(teacher,teacherDto);
        repList.add(teacherDto);
        //查询该老师的所有学生
        Example example = new Example(Student.class);
        example.createCriteria().andEqualTo("teacherId",id);
        List<Student> students = studentMapper.selectByExample(example);
        //查询每个学生的个人信息
        List<StudentDto> list = students.stream().map(student -> {
            StudentDto studentDto = new StudentDto();
            BeanUtils.copyProperties(student, studentDto);
            return studentDto;
        }).collect(Collectors.toList());
        teacherDto.setDtoList(list);
        return repList;
}

四、Postman调用

在这里插入图片描述

### 回答1: mybatis-plus-code-generator-3.5.2.x.jar是一个用于MyBatis Plus框架的代码生成器工具。MyBatis Plus是一个开源的持久层框架,它是在传统的MyBatis框架的基础上进行了扩展和增强。它提供了许多便捷的功能,使得开发者可以更快速、更高效地进行数据库操作。 通过使用mybatis-plus-code-generator-3.5.2.x.jar工具,开发者可以根据数据库中的结构自动生成对应的实体类、Mapper接口以及SQL映射文件,并且可以自定义生成规则,灵活地生成满足自己需求的代码。这样,开发者就无需手动编写大量的重复性代码,提高了开发效率。 mybatis-plus-code-generator-3.5.2.x.jar提供了丰富的配置选项,包括数据源配置、代码生成路径配置、包名配置、生成策略配置等等,开发者可以根据自己的项目需求进行相应的配置。同时,该工具还支持生成基于注解的代码,以及支持生成Controller、Service和ServiceImpl等常见的层级代码。 总之,mybatis-plus-code-generator-3.5.2.x.jar是一个功能强大、使用便捷的代码生成器工具,可以大大提升开发效率,减少重复工作,使得开发者能够更专注于业务逻辑的实现。无论是对于初学者还是有经验的开发者来说,该工具都是一个十分实用的助手。 ### 回答2: MyBatis-Plus-Code-Generator一个用于生成MyBatis-Plus代码的工具,版本号为3.5.2.x。 MyBatis-Plus是一个优秀的持久层框架,它在MyBatis框架的基础上进行了扩展和增强,提供了更多的功能和便利性。这个代码生成器是MyBatis-Plus的一个子项目,用于自动化生成DAO(数据访问对象)代码。 使用MyBatis-Plus-Code-Generator可以极大地提高开发效率。开发者只需要配置好数据库连接信息和相关选项,然后运行生成器,就能自动生成实体类、Mapper接口、XML映射文件等各种代码文件。这样的话,开发者就不需要手动编写繁琐的重复代码,大大减轻了开发负担。 除了基本的代码生成功能,MyBatis-Plus-Code-Generator还提供了很多有用的选项和扩展功能。例如,可以根据数据库的命名规则自动转换成Java类的命名规则,还可以自定义生成代码的包结构、注释等。此外,它还支持生成分页查询代码、根据外键生成关联查询代码等高级功能,进一步简化了开发过程。 总而言之,MyBatis-Plus-Code-Generator一个非常实用的代码生成工具,能够极大地提高开发效率,减少重复劳动,可以快速生成符合MyBatis-Plus规范的代码文件,是MyBatis-Plus框架的重要辅助工具。 ### 回答3: Mybatis-Plus是一个基于Mybatis的增强工具库,主要用于简化Mybatis的开发流程。而Mybatis-Plus Code Generator是其中的一个模块,它提供了一个可视化的代码生成工具,方便开发者根据数据自动生成相应的实体类、Mapper接口、Service接口及其实现类等代码。 相对于手动编写这些代码,使用Mybatis-Plus Code Generator能够减少重复劳动和出错的几率,提高开发效率。它的使用非常简单,只需配置好数据库连接信息和代码生成的路径,选择要生成的,点击生成按钮即可。 Mybatis-Plus Code Generator支持多种代码风格的生成,可以根据自己的项目需求进行配置,例如实体类是否生成字段注解、是否生成 Swagger 注解等。此外,它还支持自定义代码模板,开发者可以根据自己的规范定制代码生成的模板,从而满足项目的特殊需求。 除了简化开发流程,Mybatis-Plus Code Generator还提供了一些常用的增删改查方法的默认实现,使得开发者在编写Service接口和实现类时可以更加便捷。同时,它还支持生成的代码的增量更新,当数据结构有变化时,只需重新生成代码即可,无需手动修改已有的代码。 总之,Mybatis-Plus Code Generator一个非常实用的代码生成工具,可以大大提高开发效率,并且提供了丰富的配置选项和自定义功能,可以满足不同项目的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lukey Alvin

谢谢鼓励!越努力越幸运!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值