MyBatis-Plus相关使用

一、MyBatis-Plus简介及搭建

1.简介

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

官方文档:MyBatis-Plus

2.特性

无侵入、损耗小、强大的CRUD操作、内置代码生成器、内置分页插件等。

3.项目搭建

首先创建新项目

next之后:Spring Web:Web——Spring Web  MyBatis Framework:SQL——MyBatis Framework  

Lombok:Developer Tools——Lombok

二、MyBatis-Plus代码生成器

1.导入相关依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

2.创建applocation.yml

可根据实际项目修改

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    #    driver-class-name: com.mysql.cj.jdbc.Driver
    #    url: jdbc:mysql://localhost:3306/gcxy_teach?serverTimezone=UTC
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://localhost:3306/gcxy_teach?serverTimezone=UTC
    password: 123456
    username: root
  main:
    banner-mode: off  # 关闭SpringBoot启动图标(banner)

3.创建CodeGenerator实体类

可根据实际项目修改

package com.gcxy.utils;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;


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

public class CodeGenerator {
    public static void main(String[] args) {
        //数据库连接
        String url = "jdbc:mysql://localhost:3306/gcxy_teach?serverTimezone=UTC";//数据库url
        String username = "root";//账号
        String password = "123456";//密码
        String module = "";//项目模块名,如果是有父项目的话,需要配置。
        //全局配置参数
        String author = "ddj";//作者
        String outputDir = System.getProperty("user.dir")+"/"+module+"/src/main/java";//指定输出目录
        //包配置参数
        String parent = "com.gcxy";//父包名
        String moduleName = "";//父包模块名
        String entity = "entity";//Entity 实体类包名
        String mapper = "mapper";//Mapper 包名
        String mapperXml = "mapper.xml";//Mapper XML 包名
        String service = "service";//Service 包名
        String serviceImpl = "service.impl";//Service Impl 包名
        String controller = "controller";//Controller 包名*/
        //要生成的数据库表
        List<String> tables = new ArrayList<>();
        tables.add("account_info");
        tables.add("dep");
        tables.add("phone");
        tables.add("stu");

        //开始生成
        FastAutoGenerator.create(url,username,password)
                //全局配置
                .globalConfig(builder -> {
                    builder.author(author)
                            .outputDir(outputDir)
                            .disableOpenDir() //生成之后不打开目录
                            /*.enableSwagger()//开启swagger*/
                            .fileOverride() // 覆盖已生成文件
                            .dateType(DateType.ONLY_DATE) //定义生成的实体类中日期类型 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                            .commentDate("yyyy-MM-dd");//注释日期

                })
                //包配置
                .packageConfig(builder -> {
                    builder.parent(parent)
                            .moduleName(moduleName)
                            .entity(entity)
                            .mapper(mapper)
                            .xml(mapperXml)
                            .service(service)
                            .serviceImpl(serviceImpl)
                            .controller(controller);
                })
                //策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tables)
//                            .addTablePrefix("sys_") // 设置过滤表前缀
                            //开启生成实体类
                            .entityBuilder()
                            .enableLombok()//开启 lombok 模型
                            .enableTableFieldAnnotation()//开启生成实体时生成字段注解
                            //开启生成mapper
                            .mapperBuilder()
                            //.enableBaseResultMap()//启用 BaseResultMap 生成
                            .superClass(BaseMapper.class)//设置父类
                            .enableMapperAnnotation()//开启 @Mapper 注解
                            .formatMapperFileName("%sMapper")//格式化 mapper 文件名称
                            .formatXmlFileName("%sMapper")//格式化 xml 实现类文件名称
                            //开启生成service及impl
                            .serviceBuilder()
                            .formatServiceFileName("%sService")//格式化 service 接口文件名称
                            .formatServiceImplFileName("%sServiceImpl")//格式化 service 实现类文件名称
                            //开启生成controller
                            .controllerBuilder()
                            // 映射路径使用连字符格式,而不是驼峰
                            //.enableHyphenStyle()
                            .formatFileName("%sController")//格式化文件名称
                            .enableRestStyle();
                })
                .templateEngine(new VelocityTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                //.templateConfig(builder -> builder.controller(""))//关闭生成controller
                .execute();
    }
}

4.Mybatisplus001Application加入注解

可根据实际项目修改

@SpringBootApplication
@MapperScan("com.gcxy.mapper")

三、MyBatis-Plus条件构造器

1.QueryWrpper条件构造器

QueryWrpper它提供了更多的查询条件封装

1.1创建logbackxml和spy.properties

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

</configuration>
#3.2.1????
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1?????????
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# ???????
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#????????
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# ???????? sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# ?? p6spy driver ??
deregisterdrivers=true
# ??JDBC URL??
useprefix=true
# ???? Log ??,????????error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# ????
dateformat=yyyy-MM-dd HH:mm:ss
# ???????
#driverlist=org.h2.Driver
# ?????SQL??
outagedetection=true
# ?SQL???? 2 ?
outagedetectioninterval=2

1.2条件

  • allEq
  • 例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null
  • 等于 =
  • 例: eq("name", "老王")--->name = '老王'
  • 不等于 <>
  • 例: ne("name", "老王")--->name <> '老王'
  • 大于 >
  • 例: gt("age", 18)--->age > 18
  • 大于等于 >=
  • 例: ge("age", 18)--->age >= 18
  • 小于 <
  • 例: lt("age", 18)--->age < 18
  • 小于等于 <=
  • 例: le("age", 18)--->age <= 18
  • BETWEEN 值1 AND 值2
  • 例: between("age", 18, 30)--->age between 18 and 30
  • LIKE '%值%'
  • 例: like("name", "王")--->name like '%王%'
  • ......and so on

1.3test类

可根据实际项目修改

1.4QueryWrpper实现查询

例:

QueryWrapper<User1> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","%精%").eq("sex","女");
List<User1> users = user1Service.list(queryWrapper);
QueryWrapper<User1> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age",18,35).eq("sex","女");
List<User1> users = user1Service.list(queryWrapper);
QueryWrapper<User1> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("age",100).eq("sex","女");
List<User1> users = user1Service.list(queryWrapper);

1.5QueryWrpper实现删除

例:

        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("name","xiaoming2");
        wrapper.eq("age",12);

//        delete from user where (name="xiaoming2" and age = 12);
        userMapper.delete(wrapper);

其余操作可自行完成

四、Mapper层增删改查

1.Mapper层实现查询

 //根据id查询
User user = userMapper.selectById(10L);
System.out.println(user.toString());

 //根据id批量查询
List<User> userList = userMapper.selectBatchIds(Arrays.asList(10L,11L,12L));

//通过wrapper组装查询条件,查询全部数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//设置查询字段,仅查询name id 字段
queryWrapper.select("id","name");
//添加查询条件
queryWrapper.eq("id",11L);
List<User> users = userMapper.selectList(queryWrapper);

2.Mapper层实现删除

        // 根据主键id删除数据(直接传id)
      int count = userMapper.deleteById(9L);
      System.out.println("删除了:"+ count);

        // 根据主键id删除(传实体类)
      User user = new User();
     user.setId(8L);
      int count = userMapper.deleteById(user);
     System.out.println("删除了:"+ count);

        // 根据主键id批量删除数据
      List<Long> ids = new ArrayList<>();
      ids.add(1L);
      ids.add(2L);
//        delete from user where id in (1,2);
       userMapper.deleteBatchIds(ids);

3.Mapper层实现修改

  //根据实体类修改    
      User user = User.builder()
              .name("xaioxiaoming")
              .id(10L)
             .gender(0)
               .build();
      int count = userMapper.updateById(user);
      System.out.println("更新了:" + count);

        //通过wrapper进行更新
      User user = User.builder().name("hahah").gender(0).build();
      UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
      userUpdateWrapper.eq("age",17);
      int count = userMapper.update(user,userUpdateWrapper);

4.Mapper层实现增加

        // 批量保存或者更新
       List<User> userList = new ArrayList<>();
       for (int i =3;i<10;i++){
           User user1 = new User();
          user1.setAge(10+ i);
           user1.setGender(1 + i);
          user1.setName("xiaoming" + i);
           userList.add(user1);
       }
       boolean isSuccess = userMapper.saveOrUpdateBatch(userList);
       System.out.println("返回结果:"+isSuccess );

service层类似方法,可自行添加进行修改

五、MyBati-Plus多表分页查询

1.创建UserMapperxml

可根据实际项目修改

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gcxy.mapper.UserMapper">
    <resultMap id="orderMap" type="com.gcxy.entity.OrderVo">
        <result property="userName" column="name"/>
        <result property="userAge" column="age"/>
        <result property="userGender" column="gender"/>
        <result property="orderId" column="order_id"/>
        <result property="userId" column="user_id"/>
        <result property="goodsName" column="goods_name"/>
        <result property="goodsPrice" column="goods_price"/>
    </resultMap>
    <!--    <select id="selectOrders" resultMap="orderMap">-->
<!--    select o.order_id,o.user_id,o.goods_name,o.goods_price,u.name,u.age,u.gender-->
<!--    from t_order-->
<!--    as o left join t_user as u on o.user_id = u.id-->
    <!--    </select>-->
    <select id="selectOrderPage" resultMap="orderMap">
        select o.order_id,o.user_id,o.goods_name,o.goods_price,u.name,u.age,u.gender
        from t_order
                 as o left join t_user as u on o.user_id = u.id
        ${ew.customSqlSegment}
    </select>
</mapper>

2.test类

        //关联分页查询
        //查询第一页,每页显示十条数据
        Page<OrderVo> page = new Page<>(1,10);
        //手动关闭sql优化,不然查询总数的时候指挥查询主表
        page.setOptimizeCountSql(false);
        //组装查询条件 age = 14
        QueryWrapper<OrderVo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("age",14);
        IPage<OrderVo> page1 = userMapper.selectOrderPage(page,queryWrapper);
        System.out.println("总记录数:" + page1.getTotal());
        System.out.println("总页数:" + page1.getPages());
        System.out.println("当前页码:" + page1.getCurrent());
        System.out.println("当前查询数据:" + page1.getRecords());

这样,你就能够全面地了解MyBatis-Plus代码生成器和条件构造器等相关知识,并在mapper层和service层编写相应的测试类进行验证。

  • 14
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值