• springboot+mybatisplus 入门自学(单表+多表)


    1. 新建一个spring boot项目

    2. 参考https://baomidou.com/pages/779a6e/ 可以自己实现自动生成

    也可以按照如下来完成
    先引入pom

    `
    org.springframework.boot
    spring-boot-starter

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
        
            com.baomidou
            mybatis-plus-generator
            3.5.3
        
    
        
        
            io.springfox
            springfox-boot-starter
            3.0.0
        
    
        
            org.projectlombok
            lombok
        
    
        
            com.baomidou
            mybatis-plus-boot-starter
            3.5.2
        
    
        
            mysql
            mysql-connector-java
        
    
        
            org.freemarker
            freemarker
        
        
    
        
        
            org.springframework.boot
            spring-boot-starter-web
        `
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    修改配置文件:

    spring:
      datasource:
        url: jdbc:mysql:///java_shop
        username: root
        password:
        driver-class-name: com.mysql.cj.jdbc.Driver
      mvc:
        pathmatch:
          matching-strategy: ant_path_matcher
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    增加一个测试类:

    public class Test {
    
        public static void main(String[] args) {
            FastAutoGenerator.create("jdbc:mysql:///java_shop", "root", "")
                    .globalConfig(builder -> {
                        builder.author("zt") // 设置作者
                                .enableSwagger() // 开启 swagger 模式
                                .fileOverride() // 覆盖已生成文件
                                .outputDir("D:\\Program Files\\idea_workspace\\202207\\mp\\src\\main\\java"); // 指定输出目录
                    })
                    .packageConfig(builder -> {
                        builder.parent("com.zt") // 设置父包名
                                //.moduleName("system") // 设置父包模块名
                                .pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\Program Files\\idea_workspace\\202207\\mp\\src\\main\\resources\\mappers")); // 设置mapperXml生成路径
                    })
                    .strategyConfig(builder -> {
                        builder.addInclude("java_user") // 设置需要生成的表名
                                .addTablePrefix("java_"); // 设置过滤表前缀
                    })
                    .strategyConfig(builder -> {
                        builder.addInclude("java_cart") // 设置需要生成的表名
                                .addTablePrefix("java_"); // 设置过滤表前缀
                    })
                    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                    .execute();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    修改连接数据库的url 、username、password, 包名,还有就是你要生成的表名

    运行如上代码后,就会自动生成相应的controller、service、mapper、entity等
    在这里插入图片描述
    以上红框内的内容都是自动生成的,以上代码可以实现简单的单表增删改查操作:
    例如在mapper层:
    查询所有:selectList
    增加: insert
    根据id删除:deleteById
    根据id修改: updateById
    根据id查询:selectById
    这里可以参考https://baomidou.com/pages/49cc81/#service-crud-接口

     注意点: **以上程序若想执行成功,需要在启动类头上配置@MapperScan("com.zt.mapper")**
    
    • 1

    测试一下以上的生成:

    1. 在启动类增加@MapperScan(“com.zt.mapper”)
    2. 新增一个测试方法
      在这里插入图片描述
      测试结果如下,表示成功:
      在这里插入图片描述

    3. mp多表联查

    1.引入依赖

    
            <dependency>
                <groupId>com.github.yulichanggroupId>
                <artifactId>mybatis-plus-joinartifactId>
                <version>1.2.4version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.一对多
    一个商品对应一种类型

    @TableName("java_categroy")
    @Data
    @ToString
    @ApiModel(value = "Categroy对象", description = "")
    public class Categroy implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @TableId(value = "id", type = IdType.AUTO)
        private Integer id;
    
        private String name;
    
        @ApiModelProperty("1.一级   2.二级  3.三级")
        private Integer type;
    
        @ApiModelProperty("父级id,若是一级,则是0 ")
        private Integer parentId;
    
        @ApiModelProperty("显示时的顺序")
        private Integer orderNum;
    
        private LocalDateTime createTime;
    
        private LocalDateTime updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    @Data
    @ToString
    @TableName("java_product")
    @ApiModel(value = "Product对象", description = "")
    public class Product implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @TableId(value = "id", type = IdType.AUTO)
        private Integer id;
    
        private String pname;
    
        private String image;
    
        @ApiModelProperty("产品详情")
        private String detail;
    
        @ApiModelProperty("分类id")
        private Integer categroyId;
    
        private Object price;
    
        @ApiModelProperty("库存")
        private Integer stock;
    
        private LocalDateTime createTime;
    
        private LocalDateTime updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    产生中间实体:修改相同字段

    @Data
    public class ProductDto extends Categroy implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private Integer pid;
    
        private String pname;
    
        private String image;
    
        @ApiModelProperty("产品详情")
        private String detail;
    
        @ApiModelProperty("分类id")
        private Integer categroyId;
    
        private Object price;
    
        @ApiModelProperty("库存")
        private Integer stock;
    
        private LocalDateTime pcreateTime;
    
        private LocalDateTime pupdateTime;
       @Override
        public String toString() {
            return "Product{" +
                "pid = " + pid +
                ", pname = " + pname +
                ", image = " + image +
                ", detail = " + detail +
                ", categroyId = " + categroyId +
                ", price = " + price +
                ", stock = " + stock +
                ", pcreateTime = " + pcreateTime +
                ", pupdateTime = " + pupdateTime +
                 ",   Categroy{ id = " + super.getId() +
                        ", name = " + getName() +
            "}";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    修改mapper的extends MPJBaseMapper

    public interface ProductMapper extends MPJBaseMapper<Product> {
    
    }
    
    • 1
    • 2
    • 3

    修改service接口

    public interface IProductService extends IService<Product> {
    
        List<ProductDto> selectAllProduct();
    }
    
    • 1
    • 2
    • 3
    • 4

    修改service实现

    @Service
    public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {
    
        @Autowired
        private  ProductMapper productMapper;
        @Override
        public List<ProductDto> selectAllProduct() {
            List<ProductDto> list = productMapper.selectJoinList(ProductDto.class,
                    new MPJLambdaWrapper<Product>()
                    .selectAll(Product.class)
                    .selectAll(Categroy.class)
                    .selectAs(Product::getId,ProductDto::getPid)
                    .selectAs(Product::getCreateTime,ProductDto::getPcreateTime)
                    .selectAs(Product::getUpdateTime,ProductDto::getPupdateTime)
                    .leftJoin(Categroy.class,Categroy::getId,Product::getCategroyId)
                    .ne(Product::getStock,0)
            );
            return list;
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    编写测试类

     @Autowired
        private IProductService productService;
        @Test
        public void test02(){
            List<ProductDto> list = productService.selectAllProduct();
            list.forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试结果:
    在这里插入图片描述

    多对多操作:

    @Override
        public List<OrderDto> selectByUid(Integer uid, Integer flag) {
            List<OrderDto> list ;
            if (flag == null){
                list = orderMapper.selectJoinList(OrderDto.class,
                        new MPJLambdaWrapper<Order>()
                                .selectAll(Order.class)
                                .selectAs(Order::getId,OrderDto::getDid)
                                .selectAs(Order::getCreateTime,OrderDto::getDcreateTime)
                                .selectAs(Order::getUpdateTime,OrderDto::getDupdateTime)
                                .eq(Order::getUserId,uid)
                );
            }else{
                list = orderMapper.selectJoinList(OrderDto.class,
                        new MPJLambdaWrapper<Order>()
                                .selectAll(Order.class)
                                .selectAs(Order::getId,OrderDto::getDid)
                                .selectAs(Order::getCreateTime,OrderDto::getDcreateTime)
                                .selectAs(Order::getUpdateTime,OrderDto::getDupdateTime)
                                .eq(Order::getUserId,uid)
                                .eq(Order::getOrderStatus,flag)
                );
            }
    
            if(list.size()>0){
              for (OrderDto item : list){
                  LambdaQueryWrapper<OderItem> wrapper = Wrappers.lambdaQuery(OderItem.class)
                                                                 .in(OderItem::getOrderNo, item.getOrderNo());
                  // 通过订单号查询顶顶那详情
                  List<OderItem> listoderitem = oderItemMapper.selectList(wrapper);
                  List<OderItemDto> itemDtos = new ArrayList<>();
                  if (listoderitem.size()>0){
                       for(int i = 0 ; i < listoderitem.size(); i++){
                           OderItemDto dto = new OderItemDto();
                           LambdaQueryWrapper<Product> wrapper1 = Wrappers.lambdaQuery(Product.class)
                                   .eq(Product::getId, listoderitem.get(i).getProductId());
                           Product product =  productService.getOne(wrapper1);
                           dto.setPname(product.getPname());
                           dto.setQuantity(listoderitem.get(i).getQuantity());
                           dto.setUnitPrice(listoderitem.get(i).getUnitPrice());
                           itemDtos.add(dto);
                       }
                      }
                      item.setList(itemDtos);
                  }
            }       
            return list;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    可以去资源下载项目参考: smp_shop

  • 相关阅读:
    R语言七天入门教程四:对象数据类型
    shiro认证
    Pytorch 缓解过拟合和网络退化
    电商API接口——实现数据同步的实时数据封装接口
    企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
    MyBatis 学习(四)之 SQL 映射文件
    符尧:别卷大模型训练了,来卷数据吧!【干货十足】
    分布式配置中心Apollo
    Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
    多层高速PCB设计学习(一)初探基本知识(附单层设计补充)
  • 原文地址:https://blog.csdn.net/zhangting123123/article/details/127301910