• mybatisplus自动生成代码


    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.

  • 相关阅读:
    HttpServlet RequestDispatcher sendredirect和forward
    java中判断字符串是否为数字的方法的几种方法
    apk 解包 打包
    js cookie
    js中的this关键字
    Myeclipse 添加Android开发工具
    List<T> List<?> 区别用法
    mysql 命令
    BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
    【学习笔记】求矩阵的特征多项式
  • 原文地址:https://www.cnblogs.com/jingzaixin/p/16483317.html
Copyright © 2020-2023  润新知