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.