学会Mybatis-Plus,从此告别加班,谁用谁知道!

前言:

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它的愿景就是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。

要说起mp就得先说 mybatis和hibernate,mybatis的众所周知他的好处就是sql写起来很灵活,hibernate的好处就是不用写sql通过实体类的关系配置,只要操作类就可以啦,,抛弃了数据库中心的思想,完全的面向对象思想。所以有人就想有没有集两者优点的框架呢,于是mp(mybatis-Plus)诞生啦。

这篇文章通过mybatis-plus整合springboot来讲解mybatis-plus的一些基本操作!

正文:

一、整合springboot和mybatis-plus

1.新建一个springboot项目

这个我在之前的博客写过,传送门https://blog.csdn.net/jdk_wangtaida/article/details/86293548

2.我的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dada</groupId>
    <artifactId>springboot_jsp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_jsp</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>RELEASE</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- mybatisPlus 核心库 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <!-- 数据库 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--添加 代码生成器 依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.我的application.yml文件

# 配置端口
server:
  port: 9202
spring:
  # 配置数据源
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/bendi?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
# mybatis-plus相关配置
mybatis-plus:
  # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath:mapper/*.xml
  # 以下配置均有默认值,可以不设置
  global-config:
    db-config:
      #主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: auto
      #字段策略 IGNORED:"忽略判断"  NOT_NULL:"非 NULL 判断")  NOT_EMPTY:"非空判断"
      field-strategy: NOT_EMPTY
      #数据库类型
      db-type: MYSQL
  configuration:
    # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: true
    # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
    call-setters-on-nulls: true
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.我的逆向工程类CodeGenerator

package com.dada.springboot_jsp.until;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class CodeGenerator {
    /**
     * 数据库 URL
     */
    private static final String URL = "jdbc:mysql://localhost:3306/bendi?characterEncoding=utf8&useSSL=false";
    /**
     * 数据库驱动
     */
    private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
    /**
     * 数据库用户名
     */
    private static final String USERNAME = "root";
    /**
     * 数据库密码
     */
    private static final String PASSWORD = "root";
    /**
     * @author 值
     */
    private static final String AUTHOR = "dada";
    /**
     * 需要生成的表名
     */
    public static final String[] INCLUDE_TABLES = {"user"};
    /**
     * 代码所在服务名
     */
    public static final String SERVICE_NAME = "study";
    /**
     * 代码生成的包名
     */
    public static String PACKAGE_NAME = "com.dada.springboot_jsp";

    /**
     * 代码生成路径
     */
    public static final String Output_Dir_NAME = "F:\\tower\\springboot_jsp\\src\\main\\java";

    public static void main(String[] args) {
            AutoGenerator mpg = new AutoGenerator();

            // 全局配置
            GlobalConfig gc = new GlobalConfig();
            gc.setOutputDir(Output_Dir_NAME);
            gc.setFileOverride(true);
            gc.setActiveRecord(true);
            gc.setEnableCache(true);// XML 二级缓存
            gc.setBaseResultMap(true);// XML ResultMap
            gc.setBaseColumnList(true);// XML columList
            gc.setAuthor(AUTHOR);

            // 自定义文件命名,注意 %s 会自动填充表实体属性!
            gc.setMapperName("%sDao");
            gc.setXmlName("%sMapper");
            gc.setServiceName("%sService");
            gc.setServiceImplName("%sServiceImpl");
            gc.setControllerName("%sController");
            mpg.setGlobalConfig(gc);

            // 数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setDbType(DbType.MYSQL);
        /*dsc.setTypeConvert(new MySqlTypeConvert(){
            // 自定义数据库表字段类型转换【可选】
            @Override
            public DbColumnType processTypeConvert(String fieldType) {
                System.out.println("转换类型:" + fieldType);
                return super.processTypeConvert(fieldType);
            }
        });*/

            dsc.setDriverName( DRIVER_NAME);
            dsc.setUrl(URL);
            dsc.setUsername(USERNAME);
            dsc.setPassword(PASSWORD);
            mpg.setDataSource(dsc);

            // 策略配置
            StrategyConfig strategy = new StrategyConfig();
            // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
            // strategy.setTablePrefix(new String[] { "tlog_", "tsys_" });// 此处可以修改为您的表前缀
            strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
            strategy.setInclude(INCLUDE_TABLES); // 需要生成的表
            // strategy.setExclude(new String[]{"test"}); // 排除生成的表
            mpg.setStrategy(strategy);

            // 包配置
            PackageConfig pc = new PackageConfig();
            pc.setParent(PACKAGE_NAME);
            pc.setModuleName(SERVICE_NAME);
            mpg.setPackageInfo(pc);

            // 执行生成
            mpg.execute();
        }


    }

5.建表语句和插入数据的语句

CREATE TABLE `user` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

INSERT INTO `user` VALUES (1, '阿达', 20);
INSERT INTO `user` VALUES (2, '小达', 19);
INSERT INTO `user` VALUES (3, '达达', 18);

6.执行逆向工程的类CodeGenerator,生成如下图的目录结构

二、我们先写一个最简单的demo

1.前端controller的代码(记住这里我也只写了前端controller的代码)

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 获取所有User
     * @return
     */
    @RequestMapping("/getAllUser")
    public List<User> getAllUser(){
        List<User> list = userService.list();
        return list;
    }

}

 2.postman请求的例子

3.请求的结果

三、 MyBatis-Plus通用的CRUD

我们通过逆向工程生成的这一系列代码,直接调用相应的service就可以帮我们完成基本增删改查。(这里就不对源码进行解释啦,主要讲解使用的例子,感兴趣的可以追一下代码)

1.增

controller层代码

 /**
     *新增User
     */
    @RequestMapping("/save")
    public Boolean save(@RequestBody User user){
        boolean save = userService.save(user);
        return save;
    }

postman请求的例子:

 请求结果:

2.改

 controller层代码

 /**
     *修改User
     */
    @RequestMapping("/update")
    public Boolean update(@RequestBody User user){
        boolean save = userService.saveOrUpdate(user);
        return save;
    }

 postman请求的例子:

 请求结果:

 3.查

 controller层代码

 /**
     *查询detail
     */
    @RequestMapping("/detail")
    public User detail(@RequestBody User user){
        User userout = userService.getById(user);
        return userout;
    }

  postman请求的例子:

  请求结果:

四、似乎上面的mybatis也可以做到,别着急,MP 最好用的就是条件构造器QueryWrapper

1.这里我举个根据名字查询用户的信息的例子

controller层代码:

 /**
     *根据name查询用户信息
     */
    @RequestMapping("/selectByName")
    public User selectByName(@RequestBody User user){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("name",user.getName());
        User one = userService.getOne(userQueryWrapper);
        return one;
    }

   postman请求的例子:

   请求结果:

后台打印的日志:

这里我就简单举这些例子,更丰富的查询方法,可以参考官方文档,传送门:https://mp.baomidou.com/guide/

总结:

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有3255位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言!

发布了98 篇原创文章 · 获赞 917 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/jdk_wangtaida/article/details/103972614