随笔 - 633,  文章 - 0,  评论 - 13,  阅读 - 48万
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

1.官网:简介 | MyBatis-Plus

2.pom.xml中配置依赖:

复制代码
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!--mybatis-plus 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!--mybatis-plus 代码生成器 依赖模板引擎velocity-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
复制代码

3.在包目录下新建一个文件夹utils

4.在文件夹utils中新建一个代码生成器的类,CodeGenerator.java,代码如下:

复制代码
package com.example.demo.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

//代码生成器
public class CodeGenerator {
    public static void main(String[] args) {
        String sqlurl="jdbc:mysql://192.168.0.105:3306/wanwen?serverTimeZone=GMT%2b8";     //数据库的url
        String sqlusername="root";  //数据库的登录名
        String sqlpassword="root";  //数据库的登录密码
        String outputDir="D:\\myvuep\\demo\\src\\main\\java";  //生成代码的指定目录,一般配置成自己的工程目录下的java路径,即包名“com.example.demo”的目录
        String packageName="com.example.demo";  //配置包名“com.example.demo”
        String mapperXmlOutFilePath="D:\\myvuep\\demo\\src\\main\\resources\\mapper\\";  //mapperXml文件的输出目录
        String sqlTableName="users_userprofile";  //要对应的数据库中的表名

        generate(sqlurl,
                sqlusername,
                sqlpassword,
                outputDir,
                packageName,
                mapperXmlOutFilePath,
                sqlTableName);  //调用代码生成器函数

    }

    //生成代码方法
    private static void generate(String sqlurl,
                                 String sqlusername,
                                 String sqlpassword,
                                 String outputDir,
                                 String packageName,
                                 String mapperXmlOutFilePath,
                                 String sqlTableName){
        FastAutoGenerator.create(sqlurl, sqlusername, sqlpassword)  //数据库连接配置,必不可少的一个配置
                .globalConfig(builder -> {  //全局配置
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(outputDir); // 指定输出目录
                })
                .packageConfig(builder -> {   //包配置
                    builder.parent(packageName) // 设置父包名
                            .moduleName(null) // 设置父包模块名,可以设置为空,默认在包名之下,设置成null,防止生成双斜杠问题
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperXmlOutFilePath)); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude(sqlTableName) // 设置需要生成的表名
                            .addTablePrefix("t_", "sys"); // 设置过滤表前缀,忽略一些表头,如“sys_user”,填写了sys,就会忽略sys,生成user
                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();

    }
}
复制代码

 

 输入psvm,直接生成一个主函数main

 alt+enter,为导包

 

5.运行:

1.右键-》run "CodeGenerator.main()"

2.或者,按 ctrl+shift+f10 运行

6.运行CodeGenerator.java,会在包名下(如“com.example.demo”)的文件夹下自动生成一些文件

 针对数据库表“users_userprofile”,自动生成的文件如下:

复制代码
1.在com.example.demo.controller文件夹下生成UsersUserprofileController.java   ---类文件

2.com.example.demo.entity文件夹下生成
UsersUserprofile.java    ---类文件

3.com.example.demo.mapper文件夹下生成
UsersUserprofileMapper.java   ---接口文件

4.com.example.demo.service文件夹下生成
IUsersUserprofileService.java    ---接口文件
以及“impl”文件夹,
      及其文件夹下的UsersUserprofileServiceImpl.java   ---类文件

5.在resources\mapper路径下生成
UsersUserprofileMapper.xml
复制代码

7.默认的所有文件内容:

  1.UsersUserprofileController.java 

复制代码
package com.example.demo.controller;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
@Controller
@RequestMapping("//usersUserprofile")
public class UsersUserprofileController {

}
复制代码

 

  2.UsersUserprofile.java

复制代码
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * <p>
 * 
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
@TableName("users_userprofile")
@ApiModel(value = "UsersUserprofile对象", description = "")
public class UsersUserprofile implements Serializable {

    private static final long serialVersionUID = 1L;

      @TableId(value = "id", type = IdType.AUTO)
      private Integer id;

    private String password;

    private LocalDateTime lastLogin;

    private Boolean isSuperuser;

    private String username;

    private String firstName;

    private String lastName;

    private String email;

    private Boolean isStaff;

    private Boolean isActive;

    private LocalDateTime dateJoined;

    private String chinaName;

    private LocalDate birthday;

    private String gender;

    private String mobile;

    private String idNumber;

    private LocalDateTime addTime;

    private LocalDateTime updateTime;

    
    public Integer getId() {
        return id;
    }

      public void setId(Integer id) {
          this.id = id;
      }
    
    public String getPassword() {
        return password;
    }

      public void setPassword(String password) {
          this.password = password;
      }
    
    public LocalDateTime getLastLogin() {
        return lastLogin;
    }

      public void setLastLogin(LocalDateTime lastLogin) {
          this.lastLogin = lastLogin;
      }
    
    public Boolean getIsSuperuser() {
        return isSuperuser;
    }

      public void setIsSuperuser(Boolean isSuperuser) {
          this.isSuperuser = isSuperuser;
      }
    
    public String getUsername() {
        return username;
    }

      public void setUsername(String username) {
          this.username = username;
      }
    
    public String getFirstName() {
        return firstName;
    }

      public void setFirstName(String firstName) {
          this.firstName = firstName;
      }
    
    public String getLastName() {
        return lastName;
    }

      public void setLastName(String lastName) {
          this.lastName = lastName;
      }
    
    public String getEmail() {
        return email;
    }

      public void setEmail(String email) {
          this.email = email;
      }
    
    public Boolean getIsStaff() {
        return isStaff;
    }

      public void setIsStaff(Boolean isStaff) {
          this.isStaff = isStaff;
      }
    
    public Boolean getIsActive() {
        return isActive;
    }

      public void setIsActive(Boolean isActive) {
          this.isActive = isActive;
      }
    
    public LocalDateTime getDateJoined() {
        return dateJoined;
    }

      public void setDateJoined(LocalDateTime dateJoined) {
          this.dateJoined = dateJoined;
      }
    
    public String getChinaName() {
        return chinaName;
    }

      public void setChinaName(String chinaName) {
          this.chinaName = chinaName;
      }
    
    public LocalDate getBirthday() {
        return birthday;
    }

      public void setBirthday(LocalDate birthday) {
          this.birthday = birthday;
      }
    
    public String getGender() {
        return gender;
    }

      public void setGender(String gender) {
          this.gender = gender;
      }
    
    public String getMobile() {
        return mobile;
    }

      public void setMobile(String mobile) {
          this.mobile = mobile;
      }
    
    public String getIdNumber() {
        return idNumber;
    }

      public void setIdNumber(String idNumber) {
          this.idNumber = idNumber;
      }
    
    public LocalDateTime getAddTime() {
        return addTime;
    }

      public void setAddTime(LocalDateTime addTime) {
          this.addTime = addTime;
      }
    
    public LocalDateTime getUpdateTime() {
        return updateTime;
    }

      public void setUpdateTime(LocalDateTime updateTime) {
          this.updateTime = updateTime;
      }

    @Override
    public String toString() {
        return "UsersUserprofile{" +
              "id=" + id +
                  ", password=" + password +
                  ", lastLogin=" + lastLogin +
                  ", isSuperuser=" + isSuperuser +
                  ", username=" + username +
                  ", firstName=" + firstName +
                  ", lastName=" + lastName +
                  ", email=" + email +
                  ", isStaff=" + isStaff +
                  ", isActive=" + isActive +
                  ", dateJoined=" + dateJoined +
                  ", chinaName=" + chinaName +
                  ", birthday=" + birthday +
                  ", gender=" + gender +
                  ", mobile=" + mobile +
                  ", idNumber=" + idNumber +
                  ", addTime=" + addTime +
                  ", updateTime=" + updateTime +
              "}";
    }
}
复制代码
  3.UsersUserprofileMapper.java   ---接口文件
复制代码
package com.example.demo.mapper;

import com.example.demo.entity.UsersUserprofile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
public interface UsersUserprofileMapper extends BaseMapper<UsersUserprofile> {

}
复制代码

  4.IUsersUserprofileService.java

复制代码
package com.example.demo.service;

import com.example.demo.entity.UsersUserprofile;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
public interface IUsersUserprofileService extends IService<UsersUserprofile> {

}
复制代码

 

  5.UsersUserprofileServiceImpl.java

复制代码
package com.example.demo.service.impl;

import com.example.demo.entity.UsersUserprofile;
import com.example.demo.mapper.UsersUserprofileMapper;
import com.example.demo.service.IUsersUserprofileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
@Service
public class UsersUserprofileServiceImpl extends ServiceImpl<UsersUserprofileMapper, UsersUserprofile> implements IUsersUserprofileService {

}
复制代码

 

  6.UsersUserprofileMapper.xml

<?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.example.demo.mapper.UsersUserprofileMapper">

</mapper>

 

8.默认生成的UsersUserprofileController.java ,即controller的文件是空的,解决:

1.找到依赖中Maven:com.baomidou:mybatis-plus-generator:3.5.1下的templates文件夹中的“controller.java.vm”文件复制到自己建立的templates文件夹下
2.这个“controller.java.vm”,就是默认使用的Velocity引擎模板

3.对复制到己建立的templates文件夹下的“controller.java.vm”文件进行改造

4.自己新建的templates文件夹位置:在resources文件夹下的templates文件夹
5.改造后的“controller.java.vm”文件内容

默认的“controller.java.vm”文件内容:

复制代码
package ${package.Controller};


import org.springframework.web.bind.annotation.RequestMapping;

#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end

/**
 * <p>
 * $!{table.comment} 前端控制器
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${kotlin})
class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end

#else
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end

}

#end
复制代码

改造后的“controller.java.vm”文件内容:

 

复制代码
1.将原模版中
“import org.springframework.web.bind.annotation.RequestMapping;”
一行替换成自己要导入的包:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;  //导包
import org.springframework.web.bind.annotation.*;  //导包
import javax.annotation.Resource; //导包
import java.util.List; //导包
import ${package.Service}.${service};    //导包,  相当于import com.example.demo.service.SpiderdataSpiderxrmmwService;
/*其中${package.Service}就等于 com.example.demo.service,${service}就等于SpiderdataSpiderxrmmwService*/
import ${package.Entity}.${entity}  //导包,相当于导入 import com.example.demo.entity.SpiderdataSpiderxrmmw;
/*其中${package.Entity}就等于com.example.demo.entity,${entity}就等于SpiderdataSpiderxrmmw,一种Java的模板引擎语法*/

2.写接口的名字(增删改查的逻辑),在#end中间加逻辑,加的内容如下:
    @Resource
    private ${table.serviceName} ${table.entityPath}Service;  /*导Service的包,table.serviceName就是spiderdataSpiderxrmmwService,对应之前的如下内容
    @Autowired
    private SpiderdataSpiderxrmmwService spiderdataSpiderxrmmwService;  //使用@Autowired引入spiderdataSpiderxrmmwService类*/

    //新增和修改接口
    @PostMapping
    public boolean save(@RequestBody ${entity} ${table.entityPath}){
        //新增或者更新
        return ${table.entityPath}Service.saveOrUpdate(${table.entityPath});
    }

    //删除接口
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id){
        return ${table.entityPath}Service.removeById(id);  //${table.entityPath} 就等于spiderdataSpiderxrmmw,只是换成一个变量,变成活的,可以自动变更的
    }

    //查询所有内容接口
    @DeleteMapping()
    public List<${entity}> findAll(){
        return ${table.entityPath}Service.list();   //返回查询到的所有数据
    }

    //根据id查询
    @DeleteMapping("/{id}")
    public List<${entity}> findOne(@PathVariable Integer id){
        return ${table.entityPath}Service.list();   //返回查询到的所有数据
    }

    //分页查询
    @GetMapping("/page")
    public IPage<${entity}> findPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize){
        //此处没有写查询条件逻辑,因为太活了,所有不在模板中写了
        return ${table.entityPath}Service.page(new Page<>(pageNum,pageSize));  //返回分页
    }

    //批量删除接口
    @PostMapping("/del/batch")   //传入的参数为批量的id值列表  [1,2,3,...]
    public boolean deleteBatch(@RequestBody List<Integer> ids){
        return ${table.entityPath}Service.removeBatchByIds(ids);
    }

    //导出接口
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws Exception{
        //从数据库查出所有的数据
        List<${entity}> list = ${table.entityPath}Service.list();
        //通过工具类创建writer 写出到磁盘路径

        //内存操作,写出到浏览器
        ExcelWriter writer = ExcelUtil.getWriter(true);

//        //自定义标题别名  。导出的时候,不起别名,就可以获取到一个英文的模板
//        writer.addHeaderAlias("spliderimgurl","照片url");
//        writer.addHeaderAlias("imgtitle","照片标题");
//        writer.addHeaderAlias("imgpeople","照片人名");

        //一次性写出list内的对象到excel,使用默认样式,强制输出标题
        writer.write(list,true);  //把list对象写入到writer中

        //设置浏览器响应的格式,基本上都是固定的,且必须要设置
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        String fileName = URLEncoder.encode("${table.entityPath}","UTF-8");  //直接用${table.entityPath}作为导出文件的名字,可以修改为自己需要的中文,如:用户信息
        response.setHeader("Content-Disposition","attachment;filename="+fileName+".xls");

        ServletOutputStream out=response.getOutputStream();  //获取数据流
        writer.flush(out, true);   //把writer中的内容刷新到数据流中
        out.close();
        // 关闭writer,释放内存
        writer.close();
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }


    //导入接口
    @PostMapping("/import")
    public Boolean imp(MultipartFile file) throws Exception{   //返回一个布尔值
        InputStream inputStream=file.getInputStream();    //获取流文件内容
        ExcelReader reader=ExcelUtil.getReader(inputStream);
        //第一种方式,通过javabean的方式读取Excel内的对象,要求导入的表头要是英文,和导出的英文字段要一致
        // 比较推荐这种方法
        List<${entity}> list = reader.readAll(${entity}.class);  //定义一个SpiderdataSpiderxrmmw 用于接收读取到的内容
        System.out.println(list);
        //保持数据到数据库
        //${table.entityPath}Service.save(one);  //save方法,插入单个
        ${table.entityPath}Service.saveBatch(list) ;   //saveBatch方法批量插入
        return true;   //返回一个true,表示插入成功
    }
复制代码

 

改造后的“controller.java.vm”文件内容完整代码如下(多次调试生成如下可用,以上的改造内容只是提供一个思路,最终的完整代码以下为准):

复制代码
package ${package.Controller};



import cn.hutool.core.io.IoUtil; //导包
import cn.hutool.poi.excel.ExcelReader; //导包
import cn.hutool.poi.excel.ExcelUtil; //导包
import cn.hutool.poi.excel.ExcelWriter; //导包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; //导包
import com.baomidou.mybatisplus.core.metadata.IPage; //导包
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;  //导包
import org.springframework.web.bind.annotation.*;  //导包
import org.springframework.web.multipart.MultipartFile;  //导包
import javax.annotation.Resource; //导包
import javax.servlet.ServletOutputStream; //导包
import javax.servlet.http.HttpServletResponse; //导包
import java.io.InputStream; //导包
import java.net.URLEncoder; //导包
import java.util.List; //导包
import ${package.Service}.${table.serviceName};    //导包,  相当于import com.example.demo.service.SpiderdataSpiderxrmmwService;
/*其中${package.Service}就等于 com.example.demo.service,${table.serviceName}就等于SpiderdataSpiderxrmmwService*/
import ${package.Entity}.${entity};  //导包,相当于导入 import com.example.demo.entity.SpiderdataSpiderxrmmw;
/*其中${package.Entity}就等于com.example.demo.entity,${entity}就等于SpiderdataSpiderxrmmw,一种Java的模板引擎语法*/

#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end

/**
 * <p>
 * $!{table.comment} 前端控制器
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${kotlin})
class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end

#else
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end

    @Resource
    private ${table.serviceName} ${table.entityPath}Service;  /*导Service的包,table.serviceName就是spiderdataSpiderxrmmwService,对应之前的如下内容
    @Autowired
    private SpiderdataSpiderxrmmwService spiderdataSpiderxrmmwService;  //使用@Autowired引入spiderdataSpiderxrmmwService类*/

    //新增和修改接口
    @PostMapping
    public boolean save(@RequestBody ${entity} ${table.entityPath}){
        //新增或者更新
        return ${table.entityPath}Service.saveOrUpdate(${table.entityPath});
    }

    //删除接口
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id){
        return ${table.entityPath}Service.removeById(id);  //${table.entityPath} 就等于spiderdataSpiderxrmmw,只是换成一个变量,变成活的,可以自动变更的
    }

    //查询所有内容接口
    @GetMapping()
    public List<${entity}> findAll(){
        return ${table.entityPath}Service.list();   //返回查询到的所有数据
    }

    //根据id查询
    @GetMapping("/{id}")
    public ${entity} findOne(@PathVariable Integer id){
        return ${table.entityPath}Service.getById(id);   //返回查询到指定id的数据
    }

    //分页查询
    @GetMapping("/page")
    public IPage<${entity}> findPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize){
        //此处没有写查询条件逻辑,因为太活了,所有不在模板中写了
        IPage<${entity}> page = new Page<>(pageNum,pageSize);  //新建一个page
        QueryWrapper<${entity}> queryWrapper = new QueryWrapper<>();  //新建一个queryWrapper
        /* 加判断逻辑
        if(!"".equals(img_people)){   //表示如果该字段不为空值,则再进行查询
        queryWrapper.like("img_people",img_people);  //返回包含img_people的内容,其中column,为数据库中真实的字段名字,img_people,而非entity包中定义的别名imgpeople
        }
        if(!"".equals(img_title)){  //表示如果该字段不为空值,则再进行查询
        queryWrapper.like("img_title",img_title);
        }
        if(!"".equals(splider_img_url)){  //表示如果该字段不为空值,则再进行查询
        queryWrapper.like("splider_img_url",splider_img_url);
        }*/
        queryWrapper.orderByDesc("id");   //通过id倒序显示
        return ${table.entityPath}Service.page(page,queryWrapper);  //返回分页
    }

    //批量删除接口
    @PostMapping("/del/batch")   //传入的参数为批量的id值列表  [1,2,3,...]
    public boolean deleteBatch(@RequestBody List<Integer> ids){
        return ${table.entityPath}Service.removeBatchByIds(ids);
    }

    //导出接口
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws Exception{
        //从数据库查出所有的数据
        List<${entity}> list = ${table.entityPath}Service.list();
        //通过工具类创建writer 写出到磁盘路径

        //内存操作,写出到浏览器
        ExcelWriter writer = ExcelUtil.getWriter(true);

//        //自定义标题别名  。导出的时候,不起别名,就可以获取到一个英文的模板
//        writer.addHeaderAlias("spliderimgurl","照片url");
//        writer.addHeaderAlias("imgtitle","照片标题");
//        writer.addHeaderAlias("imgpeople","照片人名");

        //一次性写出list内的对象到excel,使用默认样式,强制输出标题
        writer.write(list,true);  //把list对象写入到writer中

        //设置浏览器响应的格式,基本上都是固定的,且必须要设置
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        String fileName = URLEncoder.encode("${table.entityPath}","UTF-8");  //直接用${table.entityPath}作为导出文件的名字,可以修改为自己需要的中文,如:用户信息
        response.setHeader("Content-Disposition","attachment;filename="+fileName+".xls");

        ServletOutputStream out=response.getOutputStream();  //获取数据流
        writer.flush(out, true);   //把writer中的内容刷新到数据流中
        out.close();
        // 关闭writer,释放内存
        writer.close();
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }


    //导入接口
    @PostMapping("/import")
    public Boolean imp(MultipartFile file) throws Exception{   //返回一个布尔值
        InputStream inputStream=file.getInputStream();    //获取流文件内容
        ExcelReader reader=ExcelUtil.getReader(inputStream);
        //第一种方式,通过javabean的方式读取Excel内的对象,要求导入的表头要是英文,和导出的英文字段要一致
        // 比较推荐这种方法
        List<${entity}> list = reader.readAll(${entity}.class);  //定义一个SpiderdataSpiderxrmmw 用于接收读取到的内容
        System.out.println(list);
        //保持数据到数据库
        //${table.entityPath}Service.save(one);  //save方法,插入单个
        ${table.entityPath}Service.saveBatch(list) ;   //saveBatch方法批量插入
        return true;   //返回一个true,表示插入成功
    }

}

#end
复制代码

 

 

模板完成

 

9.然后重新运行CodeGenerator.java

10.新生成的UsersUserprofileController.java文件内容如下:

复制代码
package com.example.demo.controller;



import cn.hutool.core.io.IoUtil; //导包
import cn.hutool.poi.excel.ExcelReader; //导包
import cn.hutool.poi.excel.ExcelUtil; //导包
import cn.hutool.poi.excel.ExcelWriter; //导包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; //导包
import com.baomidou.mybatisplus.core.metadata.IPage; //导包
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;  //导包
import org.springframework.web.bind.annotation.*;  //导包
import org.springframework.web.multipart.MultipartFile;  //导包
import javax.annotation.Resource; //导包
import javax.servlet.ServletOutputStream; //导包
import javax.servlet.http.HttpServletResponse; //导包
import java.io.InputStream; //导包
import java.net.URLEncoder; //导包
import java.util.List; //导包
import com.example.demo.service.IUsersUserprofileService;    //导包,  相当于import com.example.demo.service.SpiderdataSpiderxrmmwService;
/*其中com.example.demo.service就等于 com.example.demo.service,IUsersUserprofileService就等于SpiderdataSpiderxrmmwService*/
import com.example.demo.entity.UsersUserprofile;  //导包,相当于导入 import com.example.demo.entity.SpiderdataSpiderxrmmw;
/*其中com.example.demo.entity就等于com.example.demo.entity,UsersUserprofile就等于SpiderdataSpiderxrmmw,一种Java的模板引擎语法*/

import org.springframework.stereotype.Controller;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
@Controller
@RequestMapping("/usersUserprofile")
public class UsersUserprofileController {

    @Resource
    private IUsersUserprofileService usersUserprofileService;  /*导Service的包,table.serviceName就是spiderdataSpiderxrmmwService,对应之前的如下内容
    @Autowired
    private SpiderdataSpiderxrmmwService spiderdataSpiderxrmmwService;  //使用@Autowired引入spiderdataSpiderxrmmwService类*/

    //新增和修改接口
    @PostMapping
    public boolean save(@RequestBody UsersUserprofile usersUserprofile){
        //新增或者更新
        return usersUserprofileService.saveOrUpdate(usersUserprofile);
    }

    //删除接口
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id){
        return usersUserprofileService.removeById(id);  //usersUserprofile 就等于spiderdataSpiderxrmmw,只是换成一个变量,变成活的,可以自动变更的
    }

    //查询所有内容接口
    @GetMapping()
    public List<UsersUserprofile> findAll(){
        return usersUserprofileService.list();   //返回查询到的所有数据
    }

    //根据id查询
    @GetMapping("/{id}")
    public UsersUserprofile findOne(@PathVariable Integer id){
        return usersUserprofileService.getById(id);   //返回查询到指定id的数据
    }

    //分页查询
    @GetMapping("/page")
    public IPage<UsersUserprofile> findPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize){
        //此处没有写查询条件逻辑,因为太活了,所有不在模板中写了
        IPage<UsersUserprofile> page = new Page<>(pageNum,pageSize);  //新建一个page
        QueryWrapper<UsersUserprofile> queryWrapper = new QueryWrapper<>();  //新建一个queryWrapper
        /* 加判断逻辑
        if(!"".equals(img_people)){   //表示如果该字段不为空值,则再进行查询
        queryWrapper.like("img_people",img_people);  //返回包含img_people的内容,其中column,为数据库中真实的字段名字,img_people,而非entity包中定义的别名imgpeople
        }
        if(!"".equals(img_title)){  //表示如果该字段不为空值,则再进行查询
        queryWrapper.like("img_title",img_title);
        }
        if(!"".equals(splider_img_url)){  //表示如果该字段不为空值,则再进行查询
        queryWrapper.like("splider_img_url",splider_img_url);
        }*/
        queryWrapper.orderByDesc("id");   //通过id倒序显示
        return usersUserprofileService.page(page,queryWrapper);  //返回分页
    }

    //批量删除接口
    @PostMapping("/del/batch")   //传入的参数为批量的id值列表  [1,2,3,...]
    public boolean deleteBatch(@RequestBody List<Integer> ids){
        return usersUserprofileService.removeBatchByIds(ids);
    }

    //导出接口
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws Exception{
        //从数据库查出所有的数据
        List<UsersUserprofile> list = usersUserprofileService.list();
        //通过工具类创建writer 写出到磁盘路径

        //内存操作,写出到浏览器
        ExcelWriter writer = ExcelUtil.getWriter(true);

//        //自定义标题别名  。导出的时候,不起别名,就可以获取到一个英文的模板
//        writer.addHeaderAlias("spliderimgurl","照片url");
//        writer.addHeaderAlias("imgtitle","照片标题");
//        writer.addHeaderAlias("imgpeople","照片人名");

        //一次性写出list内的对象到excel,使用默认样式,强制输出标题
        writer.write(list,true);  //把list对象写入到writer中

        //设置浏览器响应的格式,基本上都是固定的,且必须要设置
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        String fileName = URLEncoder.encode("usersUserprofile","UTF-8");  //直接用usersUserprofile作为导出文件的名字,可以修改为自己需要的中文,如:用户信息
        response.setHeader("Content-Disposition","attachment;filename="+fileName+".xls");

        ServletOutputStream out=response.getOutputStream();  //获取数据流
        writer.flush(out, true);   //把writer中的内容刷新到数据流中
        out.close();
        // 关闭writer,释放内存
        writer.close();
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }


    //导入接口
    @PostMapping("/import")
    public Boolean imp(MultipartFile file) throws Exception{   //返回一个布尔值
        InputStream inputStream=file.getInputStream();    //获取流文件内容
        ExcelReader reader=ExcelUtil.getReader(inputStream);
        //第一种方式,通过javabean的方式读取Excel内的对象,要求导入的表头要是英文,和导出的英文字段要一致
        // 比较推荐这种方法
        List<UsersUserprofile> list = reader.readAll(UsersUserprofile.class);  //定义一个SpiderdataSpiderxrmmw 用于接收读取到的内容
        System.out.println(list);
        //保持数据到数据库
        //usersUserprofileService.save(one);  //save方法,插入单个
        usersUserprofileService.saveBatch(list) ;   //saveBatch方法批量插入
        return true;   //返回一个true,表示插入成功
    }

}
复制代码

 

 

自动生成完成

 

11.生成后的文件中路径有两个斜杠:

生成的为:

  @RequestMapping("//usersUserprofile")

正确的应该为:

  @RequestMapping("/usersUserprofile")

12.解决方法:

将CodeGenerator.java 中的 

moduleName(null) 设置成null,如果是双引号,则会进行路径引用

13. 修改完成,后再次生成就不会有双斜杠了,不过本文中已经设置成null,直接可用

 

14.自动生成的文件,无法进行访问,是因为自动生成的类是“

@Controller

”而我们需要的是“

@RestController

所有需要把“@Controller”修改成“@RestController”

也可以进行全局配置

15.修改完后,记得重启服务

16.配置自动生成代码的时候,可以配置使用Lombok:

1.在strategyConfig的builder中添加一行:
 builder.entityBuilder().enableLombok(); // 设置自动生成entity类的使用使用Lombok,不设置的话,默认就使用get,set的方法,比较臃肿

即可

配置后完整代码如下:

复制代码
package com.example.demo.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

//代码生成器
public class CodeGenerator {
    public static void main(String[] args) {
        String sqlurl="jdbc:mysql://192.168.0.105:3306/wanwen?serverTimeZone=GMT%2b8";     //数据库的url
        String sqlusername="root";  //数据库的登录名
        String sqlpassword="root";  //数据库的登录密码
        String outputDir="D:\\myvuep\\demo\\src\\main\\java";  //生成代码的指定目录,一般配置成自己的工程目录下的java路径,即包名“com.example.demo”的目录
        String packageName="com.example.demo";  //配置包名“com.example.demo”
        String mapperXmlOutFilePath="D:\\myvuep\\demo\\src\\main\\resources\\mapper\\";  //mapperXml文件的输出目录
        String sqlTableName="users_userprofile";  //要对应的数据库中的表名

        generate(sqlurl,
                sqlusername,
                sqlpassword,
                outputDir,
                packageName,
                mapperXmlOutFilePath,
                sqlTableName);  //调用代码生成器函数

    }

    //生成代码方法
    private static void generate(String sqlurl,
                                 String sqlusername,
                                 String sqlpassword,
                                 String outputDir,
                                 String packageName,
                                 String mapperXmlOutFilePath,
                                 String sqlTableName){
        FastAutoGenerator.create(sqlurl, sqlusername, sqlpassword)  //数据库连接配置,必不可少的一个配置
                .globalConfig(builder -> {  //全局配置
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(outputDir); // 指定输出目录
                })
                .packageConfig(builder -> {   //包配置
                    builder.parent(packageName) // 设置父包名
                            .moduleName(null) // 设置父包模块名,可以设置为空,默认在包名之下,设置成null,防止生成双斜杠问题
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperXmlOutFilePath)); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.entityBuilder().enableLombok(); // 设置自动生成entity类的使用使用Lombok,不设置的话,默认就使用get,set的方法,比较臃肿
                    builder.addInclude(sqlTableName) // 设置需要生成的表名
                            .addTablePrefix("t_", "sys"); // 设置过滤表前缀,忽略一些表头,如“sys_user”,填写了sys,就会忽略sys,生成user
                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();

    }
}
复制代码

 

 

17.重新生成后,生成的entity的内容如下:

 UsersUserprofile.java内容如下:

复制代码
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

/**
 * <p>
 * 
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
@Getter
@Setter
  @TableName("users_userprofile")
@ApiModel(value = "UsersUserprofile对象", description = "")
public class UsersUserprofile implements Serializable {

    private static final long serialVersionUID = 1L;

      @TableId(value = "id", type = IdType.AUTO)
      private Integer id;

    private String password;

    private LocalDateTime lastLogin;

    private Boolean isSuperuser;

    private String username;

    private String firstName;

    private String lastName;

    private String email;

    private Boolean isStaff;

    private Boolean isActive;

    private LocalDateTime dateJoined;

    private String chinaName;

    private LocalDate birthday;

    private String gender;

    private String mobile;

    private String idNumber;

    private LocalDateTime addTime;

    private LocalDateTime updateTime;


}
复制代码

增加了

@Getter

@Setter

不用再写一堆get和set的函数

 

 

18.加多个配置的代码如下:

1.只加enableLombok()配置代码:
builder.entityBuilder().enableLombok();
2.加多个,比如再加上个enableRemoveIsPrefix配置如下:
builder.entityBuilder().enableLombok().enableRemoveIsPrefix();

在后面加点,加配置函数即可

entity策略配置官网:代码生成器(3.5.1+版本) | MyBatis-Plus

Mapper策略配置

19.Mapper策略配置,加上mapper注解,配置如下:

1.1.在strategyConfig的builder中添加一行:
builder.mapperBuilder().enableMapperAnnotation().build();  //加上一个mapper注解

即可

配置后完整代码如下:

复制代码
package com.example.demo.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

//代码生成器
public class CodeGenerator {
    public static void main(String[] args) {
        String sqlurl="jdbc:mysql://192.168.0.105:3306/wanwen?serverTimeZone=GMT%2b8";     //数据库的url
        String sqlusername="root";  //数据库的登录名
        String sqlpassword="root";  //数据库的登录密码
        String outputDir="D:\\myvuep\\demo\\src\\main\\java";  //生成代码的指定目录,一般配置成自己的工程目录下的java路径,即包名“com.example.demo”的目录
        String packageName="com.example.demo";  //配置包名“com.example.demo”
        String mapperXmlOutFilePath="D:\\myvuep\\demo\\src\\main\\resources\\mapper\\";  //mapperXml文件的输出目录
        String sqlTableName="users_userprofile";  //要对应的数据库中的表名

        generate(sqlurl,
                sqlusername,
                sqlpassword,
                outputDir,
                packageName,
                mapperXmlOutFilePath,
                sqlTableName);  //调用代码生成器函数

    }

    //生成代码方法
    private static void generate(String sqlurl,
                                 String sqlusername,
                                 String sqlpassword,
                                 String outputDir,
                                 String packageName,
                                 String mapperXmlOutFilePath,
                                 String sqlTableName){
        FastAutoGenerator.create(sqlurl, sqlusername, sqlpassword)  //数据库连接配置,必不可少的一个配置
                .globalConfig(builder -> {  //全局配置
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(outputDir); // 指定输出目录
                })
                .packageConfig(builder -> {   //包配置
                    builder.parent(packageName) // 设置父包名
                            .moduleName(null) // 设置父包模块名,可以设置为空,默认在包名之下,设置成null,防止生成双斜杠问题
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperXmlOutFilePath)); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.entityBuilder().enableLombok(); // 设置自动生成entity类的使用使用Lombok,不设置的话,默认就使用get,set的方法,比较臃肿
                    builder.mapperBuilder().enableMapperAnnotation().build();  //加上一个mapper注解
                    builder.addInclude(sqlTableName) // 设置需要生成的表名
                            .addTablePrefix("t_", "sys"); // 设置过滤表前缀,忽略一些表头,如“sys_user”,填写了sys,就会忽略sys,生成user
                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();

    }
}
复制代码

 20.重新生成后,生成 的

UsersUserprofileMapper.java文件为:
复制代码
package com.example.demo.mapper;

import com.example.demo.entity.UsersUserprofile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author baomidou
 * @since 2022-07-16
 */
@Mapper
public interface UsersUserprofileMapper extends BaseMapper<UsersUserprofile> {

}
复制代码

会在

public interface UsersUserprofileMapper extends BaseMapper<UsersUserprofile>

函数上 增“@Mapper”

 

21.Controller策略配置,

1.1.在strategyConfig的builder中添加一行:
builder.controllerBuilder().enableHyphenStyle()  //开启驼峰转连字符
                            .enableRestStyle();   //开始生成@RestController控制器

即可

配置后完整代码如下:

复制代码
package com.example.demo.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

//代码生成器
public class CodeGenerator {
    public static void main(String[] args) {
        String sqlurl="jdbc:mysql://192.168.0.105:3306/wanwen?serverTimeZone=GMT%2b8";     //数据库的url
        String sqlusername="root";  //数据库的登录名
        String sqlpassword="root";  //数据库的登录密码
        String outputDir="D:\\myvuep\\demo\\src\\main\\java";  //生成代码的指定目录,一般配置成自己的工程目录下的java路径,即包名“com.example.demo”的目录
        String packageName="com.example.demo";  //配置包名“com.example.demo”
        String mapperXmlOutFilePath="D:\\myvuep\\demo\\src\\main\\resources\\mapper\\";  //mapperXml文件的输出目录
        String sqlTableName="users_userprofile";  //要对应的数据库中的表名

        generate(sqlurl,
                sqlusername,
                sqlpassword,
                outputDir,
                packageName,
                mapperXmlOutFilePath,
                sqlTableName);  //调用代码生成器函数

    }

    //生成代码方法
    private static void generate(String sqlurl,
                                 String sqlusername,
                                 String sqlpassword,
                                 String outputDir,
                                 String packageName,
                                 String mapperXmlOutFilePath,
                                 String sqlTableName){
        FastAutoGenerator.create(sqlurl, sqlusername, sqlpassword)  //数据库连接配置,必不可少的一个配置
                .globalConfig(builder -> {  //全局配置
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(outputDir); // 指定输出目录
                })
                .packageConfig(builder -> {   //包配置
                    builder.parent(packageName) // 设置父包名
                            .moduleName(null) // 设置父包模块名,可以设置为空,默认在包名之下,设置成null,防止生成双斜杠问题
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperXmlOutFilePath)); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.entityBuilder().enableLombok(); // 设置自动生成entity类的使用使用Lombok,不设置的话,默认就使用get,set的方法,比较臃肿
                    builder.mapperBuilder().enableMapperAnnotation().build();  //加上一个mapper注解
                    builder.controllerBuilder().enableHyphenStyle()  //开启驼峰转连字符
                            .enableRestStyle();   //开始生成@RestController控制器
                    builder.addInclude(sqlTableName) // 设置需要生成的表名
                            .addTablePrefix("t_", "sys"); // 设置过滤表前缀,忽略一些表头,如“sys_user”,填写了sys,就会忽略sys,生成user
                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();

    }
}
复制代码

 

22.重新运行CodeGenerator.java文件,会在生成的 controller中 加上@RestController,以及在接口访问时将带有下划线路径访问改为去掉下划线,使用首字母大写的方式访问

 

23.此处只写了一个controller的模板,也可以定义

entity,mapper,service,serviceImpl,各种对应配置文件如下:

controller.java.vm     ---controller
entity.java.vm          ---entity
mapper.java.vm       ---mapper
service.java.vm        ---service
serviceImpl.java.vm    ---serviceImpl

 

24.

 

posted on   大话人生  阅读(1802)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-07-16 django 筛选不等于的内容
点击右上角即可分享
微信分享提示