1、简单介绍MyBatisPlus
MyBatisPlus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,完全去SQL化,封装好了大量的CRUD操作。甚至吧CRUD操作封装到了Service层,可以直接在Controller调用现成的CRUD服务层,极度舒适省心。
局限:只支持简单的CRUD操作,不支持多表操作(join、union、子查询),不支持GroupBy和各种函数。
2 初步使用
2.1 引入依赖
新建SpringBoot工程。引入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
2.2 增加符合MyBatisPlus规范的Mapper和Service
@Repository public interface EmployeePlusMapper extends BaseMapper<Employee> { }
@Service public class EmployeePlusServiceImpl extends ServiceImpl<EmployeePlusMapper, Employee> { }
2.3 指定Bean的主键属性为自增
public class Employee { @TableId(value = "id",type = IdType.AUTO) private Integer id; }
2.4 修改Controller
@RestController public class EmployeePlusController { @Autowired private EmployeePlusServiceImpl employeeService; @RequestMapping(value = "/emp") public Object handle1(String op,Integer id,String lastname,String gender,String email){ //封装数据模型 Employee employee = new Employee(id, lastname, gender, email); switch (op){ case "select": if (id == null){ return "必须传入员工id!"; }else { Employee e = employeeService.getById(id); return e == null ? "查无此人!" : e; } case "insert" : employeeService.save(employee); return "操作完成!"; case "update": if (id == null){ return "必须传入员工id!"; }else { employeeService.updateById(employee); return "操作完成!"; } case "delete": if (id == null){ return "必须传入员工id!"; }else { employeeService.removeById(id); return "操作完成!"; } default: return "请正确操作"; } } @RequestMapping(value = "/getAllEmp") public Object handle2(){ List<Employee> all = employeeService.list(); return all; } }
3、按条件查询
现在希望对id>3的男性员工执行查询和更新删除操作如下:
@SpringBootTest public class MyTest { @Autowired EmployeeService employeeService; @Test public void testQuery(){ //指定查询条件: id>2的男性员工 QueryWrapper<Employee> wrapper = new QueryWrapper<Employee>().eq("gender", "male").gt("id", 2); //根据条件查询 List<Employee> list = employeeService.list(wrapper); //指定更新条件 UpdateWrapper<Employee> updateWrapper = new UpdateWrapper<Employee>().eq("gender", "male").gt("id", 4).set("gender", "female"); //根据条件更新性别为女性 employeeService.update(updateWrapper); //根据条件删除 employeeService.remove(wrapper); } }
4、MyBatisPlus模板生成器
虽然MyBatisPlus已经节省了sql编写的大部分工作,但是当面对几十上百个的处理的时候,仍然有大量的类模块要写,其中最大的工作量就是实体类的编写,如果手工还容易出错
所以MyBatis-Plus还推出了代码生成工具https://github.com/baomidou/generator。
4.1 添加依赖
在pom.xml文件中添加代码生成工具
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
4.2 编写生成器
编写生成器代码
public class MyGenerator { public static void main(String[] args) { //指定为哪些表生成 String[] tables={ "activity_info","activity_sku" }; FastAutoGenerator.create("jdbc:mysql://hadoop102:3306/gmall","root","000000") .globalConfig(builder -> { builder.author("atguigu") //作者 .outputDir("D:\\repo\\221109\\mybatisplusdemo\\src\\main\\java") //输出路径(写到java目录) .commentDate("yyyy-MM-dd") .dateType(DateType.ONLY_DATE); //选择实体类中的日期类型 ,Date or LocalDatetime }) .packageConfig(builder -> { //各个package 名称 builder.parent("com.atguigu.mybatisplus") //.moduleName("governance") .entity("bean") .service("service") .serviceImpl("service.impl") .controller("controller") .mapper("mapper"); }) .strategyConfig(builder -> { builder.addInclude(tables) .serviceBuilder() .enableFileOverride() //生成代码覆盖已有文件 谨慎开启 .formatServiceFileName("%sService") //类后缀 .formatServiceImplFileName("%sServiceImpl") //类后缀 .entityBuilder() .enableFileOverride() .enableLombok() //允许使用lombok .controllerBuilder() .enableFileOverride() .formatFileName("%sController") //类后缀 .enableRestStyle() //生成@RestController 否则是@Controller .mapperBuilder() .enableFileOverride() //生成通用的resultMap 的xml映射 .enableBaseResultMap() //生成xml映射 .superClass(BaseMapper.class) //标配 .formatMapperFileName("%sMapper") //类后缀 .mapperAnnotation(Mapper.class) ; //生成代码Mapper上自带@Mapper }) .templateConfig( builder -> { // 实体类使用我们自定义模板 builder.entity("templates/myentity.java"); }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); } }
4.3 自定义模块
以上生成代码主函数中有设计自定义模块。从idea中的jar包目录中找到jar包的模板。
拷贝到Resource/template目录下重命名为myentity.java.ftl,并吧第29,30行的修改
修改前:
… <#if entityLombokModel> @Getter @Setter …
修改后:
…… <#if entityLombokModel> @Data ……
之后重新运行生成器的代码,就可以根据自己的模板生成Bean。
注意:可以重复生成,是覆盖操作。