mybatis-plus入门学习
mybatis-plus手动创建代码
mybatis-plus基础
第一个mybatis-plus程序
环境:IDEA+maven+mybatis-plus
目录结构如下:
2、在pom文件里添加依赖
<dependencies>
<!--boot核心-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.0</version>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3、在数据库里创建表
4、实体类User
package com.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@TableName("user")
@Data
public class User {
private Integer uid; // 主键
private String uname;
private String usex;
}
5、mapper
package com.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
6、springboot启动类
package com;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类代码
*/
@SpringBootApplication
@MapperScan("com.dao") // 注解方式设置mapper扫描路径
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
7、配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root111
password: root12345611
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
mybatis-plus:
mapper-locations: classpath:dao/*Mapper.xml
check-config-location: true
type-aliases-package: com.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
8、测试
mybatis-plus自带CRUD方法,不用写mapper.xml文件就可以直接使用
package com;
import com.entity.User;
import com.dao.UserMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null); //null表示查询所有
// Assert.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
}
mybatis-plus代码生成器-与springboot整合
mybatis-plus可以根据数据库表,自动生成代码,包括controller层和service层
生成代码,使用基本增删改查方法
1、引入springboot和代码生成器相关依赖,pom文件如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis plus 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
2、测试类中编写代码生成的各种配置(前提:数据库已有表)
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.Scanner;
public class MybatisGen {
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir"); ///Users/xxx/Desktop/itest
gc.setOutputDir(projectPath + "/core/src/main/java/com/jd/core");
gc.setAuthor("zuozhe");
gc.setOpen(false);
gc.setServiceName("%sService"); // 设置生成的service接口的名字的首字母是否为I
//实体属性 Swagger2 注解
gc.setSwagger2(false);
mpg.setGlobalConfig(gc);
// 2、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root111");
dsc.setPassword("111123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName(scanner("模块名"));
pc.setParent("apitable");
pc.setEntity("entity");
pc.setMapper("dao");
pc.setService("service");
pc.setServiceImpl("service.impl");
// pc.setXml("dao"); //生成mapper.xml映射文件,放在dao下
mpg.setPackageInfo(pc);
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("com.baomidou.mybatisplus.extension.activerecord.Model");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setEntityLombokModel(true);
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
3、yaml配置文件
server:
port: 8081
servlet:
context-path: /
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/autotest?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root111
password: 123456111
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
serialization:
write-dates-as-timestamps: false
mybatis-plus:
configuration:
# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
map-underscore-to-camel-case: true
auto-mapping-behavior: full
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*:mapper/**/*Mapper.xml
global-config:
# 逻辑删除配置
db-config:
#主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
id-type: auto
# #字段策略 IGNORED:"忽略判断" NOT_NULL:"非 NULL 判断") NOT_EMPTY:"非空判断"
# field-strategy: 2
update-Strategy: default
# 删除前
logic-not-delete-value: 1
# 删除后
logic-delete-value: 0
4、分页插件配置:用于分页查询
package com.jd.core.apitable.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
5、执行test,自动生成代码
执行MybatisGen测试类,输入要生成的表:
生成后,目录结构:
6、springboot启动类
package com.jd.core.apitable;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.jd.core.apitable.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
7、结构
在生成的文件里或许需要补加一些注解,。
mybatis-plus基本的CRUD不需要再新建mapper.xml文件写sql语句,可以直接使用,在生成的ApiServiceImpl实现类中不需要进行注入mapper(ServiceImpl中已经注入好了)。
mybatis中,需要在mapper中定义增删改查方法,在service中注入mapper进行具体操作,可以在在controller中在处理url请求的时候调用service中方法。而plus可以直接在controller中直接使用Crud方法吗,只需注入service接口。
以下实现了基本增删改查:具体生成的文件如下:
接口service:
package com.jd.core.apitable.service;
import com.jd.core.apitable.entity.Api;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author xxx
* @since 2021-03-05
*/
public interface ApiService extends IService<Api> {
}
ApiServiceImpl实现类
package com.jd.core.apitable.service.impl;
import com.jd.core.apitable.entity.Api;
import com.jd.core.apitable.dao.ApiMapper;
import com.jd.core.apitable.service.ApiService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author xxx
* @since 2021-03-05
*/
@Service
public class ApiServiceImpl extends ServiceImpl<ApiMapper, Api> implements ApiService {
/**
* 不用再进行mapper的注入.
* EmployeeServiceImpl 继承了ServiceImpl
* 1. 在ServiceImpl中已经完成Mapper对象的注入,直接在EmployeeServiceImpl中进行使用
* 2. 在ServiceImpl中也帮我们提供了常用的CRUD方法, 基本的一些CRUD方法在Service中不需要我们自己定义.
*/
// @Autowired
// private ApiMapper apiMapper; //进行mapper的注入
//
// public List<Api> queryAllApi(){
// return apiMapper.selectList(null); //null标识查询表中所有
// }
}
实体类
package com.jd.core.apitable.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author xxx
* @since 2021-03-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class Api extends Model {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 应用ID
*/
private Integer app;
private String name;
private String describer;
/**
* http或https
*/
private String scheme;
private String url;
private String requestMethod;
/**
* postForm表单还是postJson
*/
@TableField("content_Type") //数据库里字段是content_Type
private String contentType;
private String header;
private String param;
private String body;
private LocalDateTime createTime;
}
mapper/dao层
package com.jd.core.apitable.dao;
import com.jd.core.apitable.entity.Api;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author xxx
* @since 2021-03-05
*/
public interface ApiMapper extends BaseMapper<Api> {
}
controller层
package com.jd.core.apitable.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jd.core.apitable.entity.Api;
import com.jd.core.apitable.service.ApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author xxx
* @since 2021-03-05
*/
@RestController
@RequestMapping("test/api") //请求接口的拼接
public class ApiController {
@Autowired
private ApiService apiService;
/**
* mybatis-plus自带crud方法,ApiService可直接调用,
* 不用在ApiServiceImpl中注入mapper实现具体操作
*
* 根据ID获取API信息
* @Param apiID
* @return Api实体
*/
@GetMapping("/getApi")
@ResponseBody
public Api getApiById(@RequestParam(name = "id") Long id){
return apiService.getById(id);
}
/**
* 查询全部信息
* @return Api list
*/
@GetMapping("/getAllApi")
@ResponseBody
public List<Api> getAllApi(){
return apiService.list();
}
/**
* 插入信息
* @RequestBody 以简单对象接收前端传过来的json数据
* @return boolean
*/
@PostMapping("/saveApiInfo")
@ResponseBody
public void saveApiInfo(@RequestBody Api api) {
apiService.save(api);
}
/**
* 批量插入信息
* @RequestBody 以简单对象接收前端传过来的json数据
* @return boolean
*/
@PostMapping("/saveBatchApiInfo")
@ResponseBody
public void saveBatchApiInfo(@RequestBody List<Api> api) {
apiService.saveBatch(api);
}
/**
* 更新信息:根据实体中的ID去更新
* @RequestBody 以简单对象接收前端传过来的json数据
* @return boolean
*/
@PostMapping("/updateApiInfo")
@ResponseBody
public void updateApiInfo(@RequestBody Api api) {
apiService.updateById(api);
}
/**
* 新增或者更新用户信息:实体类ID若值存在,就会更新,如果不存在就会新增(id自增)
* @RequestBody 以简单对象接收前端传过来的json数据
* @return boolean
*/
@PostMapping("/saveOrUpdateApiInfo")
@ResponseBody
public void saveOrUpdateApiInfo(@RequestBody Api api) {
apiService.saveOrUpdate(api);
}
/**
* 删除信息,根据id删除
* @return boolean
*/
@DeleteMapping("/deleteApiInfo")
@ResponseBody
public void deleteApiInfo(@RequestParam(name = "id")Long id) {
apiService.removeById(id);
}
/**
* 批量删除信息
* @return boolean
*/
@DeleteMapping("/deleteBatchApiInfo")
@ResponseBody
@SuppressWarnings("unchecked") //IDEA泛型处理
public void deleteBatchApiInfo(@RequestParam(name = "id")List id) {
apiService.removeByIds(id);
}
@GetMapping("/apiPage")
@ResponseBody ///分页查询
public IPage<Api> selectPage(@RequestParam int pageNum, @RequestParam int pageSize){
// IPage<Api> page = new Page<>(pageNum,pageSize);
// page.setCurrent(pageNum); //当前页
// page.setSize(pageSize); //每页条数
// page = apiService.page(page);
// return page;
return apiService.page(new Page<>(pageNum,pageSize));
}
}
附上数据库表
测试
8、测试controller里方法
1、运行DemoApplication启动类,启动springboot服务
2、打开postman,请求接口即可
新增信息接口:
批量增加
根据id删除
批量删除
根据id更新信息
更新或增加接口
分页查询
更多注解的使用,以及条件构造器等高级查询的使用可以学习尚硅谷的视频:B站学习视频
附上:
springboot学习:springboot基础
mybatis-plus拓展
实现数据库时间字段自动填充
当我们的数据库表中有如下字段:create_time(插入数据时间),update_time(更新数据时间)时, 我们希望可以实现自动填充
1、使用注解@TableField
实体类中时间属性上加入注解:
public class Api extends Model {
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
}
FieldFill是一个枚举, 主要为:
public enum FieldFill {
DEFAULT, // 默认状态,不处理
INSERT, // 仅在插入数据时更新
UPDATE, // 仅在更新数据时更新
INSERT_UPDATE; // 在插入数据和更新数据时更新
private FieldFill() {
}
}
2、实现填充器(没有这一步数据库不会自动插入)
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MybatisMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//2、filedName参数要是实体类中属性名,不是数据库字段名
//1、数据库时间类型是datetime,实体类和时间函数要用LocalDateTime,date类型则用new Date()
this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
}
}
注意:
1、数据库时间类型是datetime,实体类和时间函数要用LocalDateTime,数据库时间类型是date,则用new Date()
2、filedName参数要是实体类中属性名,不是数据库字段名
3、插入时间不是当前时间的24小时制
修改配置文件application.yml中的连接数据库配置项:
url: jdbc:mysql://59.110.222.201:3306/autotest?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
改为:
url: jdbc:mysql://59.110.222.201:3306/autotest?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
4、接口测试
接口测试时,插入参数删去时间即可,会自动插入=当前时间