MybatisPlus学习

目录

1概述

1.1,说明

1.2,特性

1.3,架构原理

2【掌握】MabatisPlus和Springboot的集成配置 

2.1创建项目添加依赖

2.2创建yml文件

2.3生成代码

2.3.1User

2.3.2UserMapper

2.3.3UserService

2.3.4UserServiceImpl

2.3.5修改启动类

2.3.6测试 

3【掌握】Service的用法 

4【掌握】实体类的相关注解说明 

5【掌握】QueryWarper的说明  

6【掌握】yaml的其它配置

6.1主键生成规则

6.2逻辑删除(假删除) 

7【掌握】存在问题如果想自定义方法如何办 

8【掌握】IDEA插件生成 

9【掌握】代码生成器 

1概述

对mybaits进行增强 。提供强大的生态,提供了强大的代码生成

https://mp.baomidou.com/

1.1,说明

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

官方文档说的愿景是成为 Mybatis 最好的搭档,就像 魂斗罗 中的1P、2P,基友搭配,效率翻倍。

1.2,特性

  1. 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 
  2. Mybatis 原生的特性
  3. 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
  4. 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  5. 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击
  6. 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  7. 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
  8. 支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
  9. 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
  10. 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
  11. 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  12. 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
  13. 内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
  14. 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
  15. 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作

1.3,架构原理

2【掌握】MabatisPlus和Springboot的集成配置 

2.1创建项目添加依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1.tmp</version>
</dependency>
 <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

2.2创建yml文件

##数据源的配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/1009-test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: root
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.3生成代码

2.3.1User

package com.wxz.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "user")
public class User {
    /**
     * 用户id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 姓名
     */
    @TableField(value = "name")
    private String name;

    /**
     * 年龄
     */
    @TableField(value = "age")
    private Integer age;

    /**
     * 地址
     */
    @TableField(value = "address")
    private String address;

    public static final String COL_ID = "id";

    public static final String COL_NAME = "name";

    public static final String COL_AGE = "age";

    public static final String COL_ADDRESS = "address";
}

2.3.2UserMapper

package com.wxz.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wxz.domain.User;

public interface UserMapper extends BaseMapper<User> {
}

2.3.3UserService

package com.wxz.service;

import com.wxz.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;

public interface UserService extends IService<User> {


}

2.3.4UserServiceImpl

package com.wxz.service.impl;

import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wxz.mapper.UserMapper;
import com.wxz.domain.User;
import com.wxz.service.UserService;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

2.3.5修改启动类

2.3.6测试 

根据id查询

 全查询

 查询数据总条数

 根据条件查询

 查询一个

 新增

 根据id修改

 根据id删除

分页 

需要配置分页

package com.wxz.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig{

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

3【掌握】Service的用法 

 

 

 

4【掌握】实体类的相关注解说明 

5【掌握】QueryWarper的说明  

public class TestQueryWarpper {

    public static void main(String[] args) {
        QueryWrapper<User> qw=new QueryWrapper<User>();
        //等值条件
//        qw.eq("id",12);
//        //每一个参数是判断当前这个条件是否有效
//        qw.eq(false,"id",12);
//        //比较条件
//        qw.gt("id",10);//大于
//        qw.ge("id",10);//大于等于
//        qw.lt("id",5);//小于
//        qw.le(true,"id",15); //小于等于
//
//        //between条件  如果成立  ,就 id between 1 10
//        qw.between(true,"id",1,10);
//        qw.notBetween("id",1,10);
//        //模糊匹配条件
//        qw.like("name","小");
//        qw.notLike("name","小");
//        //in条件
//        Integer[] ids={1,2,3,4,5};
//        qw.in("id",ids);
//        qw.notIn("id",ids);

        //以上的条件配置每一个都使用and去链接

        //如果要实现 select * form user where   name like "%小%"  and (id=1 or id=2)
        qw.like("name","小");
        qw.and(new Consumer<QueryWrapper<User>>() {
            @Override
            public void accept(QueryWrapper<User> userQueryWrapper) {
                userQueryWrapper.eq("id",1)
                        .or().eq("id",2);
            }
        });
//输出构造的sql
        System.out.println(qw.getSqlSegment());
    }
}

6【掌握】yaml的其它配置

6.1主键生成规则

Auto 根据数据库表的主规则  如果id有值就用给的值  如果没 就使用数据库的增长

Uuid 使用uuid生成主键的值 ,数据库不用算

Input 强制要求代码提供主键 ,数据库不主键值

6.2逻辑删除(假删除) 

就是不真实删除数据库里面的数据  使用字段的标识符来处理  0  1

7【掌握】存在问题如果想自定义方法如何办 

跟mybatis一样,自己写xml

8【掌握】IDEA插件生成 

引入插件

9【掌握】代码生成器 

加入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1.tmp</version>
</dependency>

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.2</version>
</dependency>

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency>


<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetl</artifactId>
    <version>3.0.17.RELEASE</version>
</dependency>

生成代码的类 

package com.wxz;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class MyBatisPlusGenerator {

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
        // 代码生成器  生成器的主类对象
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");//得到当前项目目录
//        String projectPath="D:/code";
        gc.setOutputDir(projectPath + "/mybatisplus_generator/src/main/java");
        gc.setAuthor("文哥");//设置代生成代码的作者
        gc.setOpen(false);//是否生成之后打开代码文件夹
        // gc.setSwagger2(true); 实体属性 Swagger2 注解  是否在实体上加@Swagger2的注解
        mpg.setGlobalConfig(gc);//注入配置

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/1009-test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
        // dsc.setSchemaName("public");//设置数据库名
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("com.wxz");//设置父包名
        pc.setService("service");
        pc.setEntity("domain");
        pc.setServiceImpl("service.impl");
        pc.setMapper("mapper");
        pc.setXml("mapper");
        mpg.setPackageInfo(pc);//注入包的设置

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel); //如果表名和sys_user 生成的实体为SysUser
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//如果字段名有 _  生成的实体为user_id   userId
//        strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategy.setSuperEntityClass("com.wxz.domian.BaseDomain");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        // 公共父类
//        strategy.setSuperControllerClass("com.wxz.controller.BaseController");
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id","name");
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");//设置表的前缀  sys_user     User
        mpg.setStrategy(strategy);
        mpg.execute();
    }
}

10.工作中遇到的查询

10.1查询分组

LambdaQueryWrapper<TempMessage> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.select(TempMessage::getYwid,TempMessage::getType).groupBy(TempMessage::getYwid,TempMessage::getType);
        List<TempMessage> tempMessageList = messageService.list(lambdaQueryWrapper);

SQL:select ywid,type from user group by ywid,type

10.2update更新

 UpdateWrapper<TempMessage> updateWrapper = new UpdateWrapper<>();
            updateWrapper.set("STATE",tempMessage.getState()).eq("YWID",ywid).eq("TYPE",type);
            messageService.update(null,updateWrapper);

SQL:update user set state='' where ywid='' and type =''

11总结:springboot整合mybatlsplus

1)、导入依赖


      <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
      </dependency>

2)、配置

2,1 、配置数据源;

2.1.1、导入数据库的驱动

 <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
</dependency>

2.1.2在application.yml配置数据源相关信息 

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/honey2024?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: root

2.2、配置MyBatis-Plus

2.2.1在项目的启动类上面使用@MapperScan ---用来扫描mapper接口

2.2.2告诉MyBatis-Plus,sql映射文件位置

#扫描xml文件
mybatis-plus:
#  打印sql日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapperLocations: classpath:mapper/**/*.xml
#  统一配置主键自增
  global-config:
    db-config:
      id-type: auto
server:
  port: 80

# mysql
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root
#扫描xml文件
mybatis-plus:
#  打印sql日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapperLocations: classpath:mapper/**/*.xml
#  统一配置主键自增
  global-config:
    db-config:
      id-type: auto

classpath:和classpath*的区别 

它们的区别在于:
classpath: 只会在指定的类路径中查找类,不包括其它jar包或目录下的类,它只会加载指定路径下的类文件。
classpath*: 会扫描所有的类路径,包括jar包和目录,查找类文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值