MyBatis 查询
1、创建表与实体类之间的映射文件 xml。里面编写 SQL 语句
2、创建和映射文件对应的接口 Mapper。
3、通过 SqlSessionFactory 获取 SqlSession。
MybatisPlus 快速入门
1、pom.xml 中引入 MybatisPlus 依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
2、创建实体类
package com.ai.mybatisplus.entity;
import lombok.Data;
import java.util.Date;
public class Student {
private Integer id;
private String name;
private Double score;
private Date birthday;
}
3、创建 Mapper 接口
package com.ai.mybatisplus.mapper;
import com.ai.mybatisplus.entity.Student;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface StudentMapper extends BaseMapper<Student> {
}
4、启动类需要添加 @MapperScan(“mapper所在的包”)
package com.ai.mybatisplus.mapper;
import com.ai.mybatisplus.entity.Student;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
class StudentMapperTest {
private StudentMapper studentMapper;
void test() {
studentMapper.selectList(null).forEach(System.out::println);
}
}
5、配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mbtest?useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 1314
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
常用注解
@TableName
映射数据库的表名
public class Student {
private Integer id;
private String name;
private Double score;
private Date birthday;
}
@TableId 主键映射
type 设置主键类型,主键的生成策略
AUTO(0), 数据库自增
NONE(1), MP set 主键,雪花算法实现
INPUT(2), 需要开发者手动赋值
ASSIGN_ID(3), MP 分配 ID:Long、Integer、String
ASSIGN_UUID(4); 分配一个 uuid:String
@TableField 其他字段映射
exist 表示是否为数据库字段,如果实体类中的成员变量在数据库中没有对应字段,则可以使用 exist,VO、DTO。
select 表示是否查询该字段
fill 表示是否自动化填充,将对象存入数据库时,由 MP 自动给某些字段赋值,例如订单 create_time, update_time。
- 如果数据库字段名是 create_time,则在 JavaBean 中 变量名为 createTime,MP 会自动二者进行绑定。
1、给表添加创建、更新时间
package com.ai.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
public class Student {
private Long id;
private String name;
private Double score;
private Date birthday;
private Date createTime;
private Date updateTime;
private String gender;
}
2、创建自动填充的处理器
package com.ai.mybatisplus.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
public class MyMetaObjectHandler implements MetaObjectHandler {
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
3、测试
void save() throws ParseException {
Student student = new Student();
student.setName("奥尼尔");
student.setScore(99d);
student.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2024-02-23"));
studentMapper.insert(student);
}
void update() {
Student student = studentMapper.selectById("1760860280444715012");
student.setScore(80d);
studentMapper.updateById(student);
@Version
标记乐观锁,通过 version 字段来保证数据的安全性,当修改数据时,会以 version 为条件,当条件成立才修改成功。
线程 1:update … set version = 2 where version = 1
线程 2:update … set version = 2 where version = 1
代码测试:
1、数据库表添加 version 字段,默认值为1
2、实体类添加 version 成员变量,并且添加 @Version
3、注册配置类
package com.ai.mybatisplus.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class MybatisPlusConfig {
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
@EnumValue
通用枚举类注解,将数据库字段映射成实体类的枚举成员变量
package com.ai.mybatisplus;
import com.baomidou.mybatisplus.annotation.EnumValue;
public enum EnumStatus {
WORK(1, "上班"),
REST(0, "休息");
private Integer code;
private String msg;
EnumStatus(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
在实体类添加字段
private EnumStatus status;
application.yml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-enums-package: com.ai.mybatisplus.enums
@TableLogic
映射逻辑删除
1、数据表添加 deleted 字段
2、实体类添加注解
private Integer deleted;
3、application.yml 添加配置
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
查询
// studentMapper.selectBatchIds(Arrays.asList(7, 8)).forEach(System.out::println);
// Map 只能做等值判断,逻辑判断用 Wrapper
// HashMap<String, Object> map = new HashMap<>();
// map.put("id", 7);
// studentMapper.selectByMap(map);
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("id", 3);
// System.out.println(studentMapper.selectCount(wrapper));
// 将查询的结果封装到Map中
// studentMapper.selectMaps(wrapper).forEach(System.out::println);
// 分页查询
// Page<Student> page = new Page<>(1, 2);
// Page<Student> result = studentMapper.selectPage(page, null);
// System.out.println(result.getSize());
// System.out.println(result.getTotal());
// result.getRecords().forEach(System.out::println);
// Page<Map<String, Object>> page = new Page<>(1, 2);
// Page<Map<String, Object>> result = studentMapper.selectMapsPage(page, null);
// result.getRecords().forEach(System.out::println);
// 拿到主键
// studentMapper.selectObjs(null).forEach(System.out::println);
// 查询一条数据
System.out.println(studentMapper.selectOne(wrapper));
- 分页查询
1、添加分页拦截器
package com.ai.mybatisplus.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class MybatisPlusConfig {
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 乐观锁
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 分页
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
2、测试
// 分页查询
Page<Student> page = new Page<>(1, 2);
Page<Student> result = studentMapper.selectPage(page, null);
System.out.println(result.getSize());
System.out.println(result.getTotal());
result.getRecords().forEach(System.out::println);
增加
Student student = new Student();
student.setName("奥尼尔");
student.setScore(99d);
student.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2024-02-23"));
studentMapper.insert(student);
删除
// studentMapper.deleteById(4L);
// HashMap<String, Object> map = new HashMap<>();
// map.put("id", 4);
// studentMapper.deleteByMap(map);
修改
// Student student = studentMapper.selectById("4");
// student.setName("麻子");
// studentMapper.updateById(student);
QueryWrapper<Student> wrapper = new QueryWrapper<>();
wrapper.eq("score", 90);
Student student = studentMapper.selectById(1);
student.setScore(96d);
studentMapper.update(student, wrapper);
自定义SQL、多表关联
productVo: 将两个表的信息整合到 vo 里,由于 vo 不能对应数据库的表,因此不能使用 @FieldValue() 等注解。
package com.ai.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
public class ProductVo {
private Integer category;
private Integer count;
private String description;
private Long studentId;
private String studentName;
}
studentMapper 添加自定义 SQL 语句,多表关联。
package com.ai.mybatisplus.mapper;
import com.ai.mybatisplus.entity.ProductVo;
import com.ai.mybatisplus.entity.Student;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface StudentMapper extends BaseMapper<Student> {
List<ProductVo> productList(Integer id);
}
MyBatisPlus 自动生成
根据数据表自动生成实体类、Mapper、Service、ServiceImpl、Controller
1、pom.xml 导入MyBatis Plus Generator
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1216271933@qq.com