Mybatis-plus的学习笔记

本文介绍MyBatis Plus的快速入门,包括依赖添加、数据源配置、基本代码操作等,并详细讲解了常用注解如@TableName、@TableId、@TableField等的功能与使用方法。

操作:
增:批量添加
删:条件删除
查:查询单个,查询多个,分页查询
改:

视频参考来源:https://www.bilibili.com/video/BV1yA411t782?p=8&t=407

1、添加依赖:

	    <!--springboot继承mybatis-plus的依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.2</version>
		</dependency>
		
		<!-- mysql驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<!--lombok用来简化实体类-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

2、配置数据源

#数据库连接配置
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus_study?useSSL=true&useUnicode=true&characterEncoding=utf-8
#因为我的mysql使用的是8版本,所以这里要使用com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3、代码操作

(1) mapper层定义接口,继承mybatis-plus的BaseMapper接口;里面需要传递一个实体类型(这里是自定义的实体类EquipmentPushEntity);mapper接口要使用@mapper注解;也可以不写,在启动类上使用@MapperScan(basePackages = {“org.springblade.dataparse.mapper”})或者@MapperScan(“org.springblade.dataparse.mapper”)扫描指定包下的mapper接口,让springIoc帮我们创建代理对象,并进行管理。

//mapper层
@Mapper
public interface EquipmentPushMapper extends BaseMapper<EquipmentPushEntity> {

}

//实体类
@Data
@TableName("t_device_push")
public class EquipmentPushEntity {
	@TableId(value = "id", type = IdType.AUTO)
	@JsonSerialize(using = ToStringSerializer.class)
	private Integer id;

	private Integer deviceId;
}

(2)在需要使用的地方,一般是service层,自动注入mapper对象,便可使用BaseMapper中提供的方法;

	//示例
	
	@Autowired
	private EquipmentPushMapper equipmentPushMapper;

	@Override
	public List<EquipmentPushEntity> getAlreadySendEquipments(List<Integer> equipments) {
		//selectList() 方法的参数为 MP 内置的条件构造器 Wrapper,不填写就是无任何条件
		return equipmentPushMapper.selectList(null);
	}

4、注解学习

  • @TableName(“t_device_push”):默认情况下,mybatis-plus是使用实体类的类名作为表名去操作,如果类名与数据库表名不一致,可通过@TableName注解去映射数据库中表名。
  • @TableId(value = “id”, type = IdType.AUTO):设置主键映射,value映射主键字段名,type设置主键类型,主键的生成策略;
	AUTO(0),
    NONE(1),//默认
    INPUT(2),
    ASSIGN_ID(3),
    ASSIGN_UUID(4),

	//已弃用
    /** @deprecated */
    @Deprecated
    ID_WORKER(3),
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3),
    /** @deprecated */
    @Deprecated
    UUID(4);
描述
AUTO数据库自增
NONEMP set 主键,雪花算法实现
INPUT需要开发者手动赋值
ASSIGN_IDMP分配ID, 主键类型可以使Long,Integer,String
ASSIGN_UUID分配UUID,主键类型只能是String

INPUT 如果开发者没有手动赋值,则数据库通过自增的方式给主键赋值,但传递的参数以及返回的主键为null;如果开发者手动赋值,则存入该值。
ASSIGN_ID 跟NONE一样,自动赋值,雪花算法实现

  • @TableField(value = “name”):映射非主键字段,value映射字段名

  • @TableField(exist= false):表示是否为数据库字段false,如果实体类中的成员变量在数据库中没有对应的字段,则可以使用exist,VO、DTO中用的比较多。

  • @TableField(value = “name”,select = false):select表示是否查询该字段

  • @TableField(fill = FieldFill.INSERT):fill表示是否自动填充,将对象存入数据库的时候,由Mybatis Plus自动给某些字段赋值,例如:create_time、update_time;然后创建自定义处理器,帮助我们去set这些值。

//实体类
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

}

//配置类,MetaObjectHandler 是由MP提供的处理器接口
@Configuration
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}
  • @Version:标记乐观锁,通过version字段来保证数据的安全性,当修改数据的时候,会以version作为条件,当条件成立的时候才会执行。
    (这部分还有待学习,并发)

  • @EnumValue:通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量

//实体类
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    private SexEnum sex;//注意此处要跟数据库的字段名一致

}

//枚举类
public enum SexEnum {

    MAN(0,"男生"),
    WOMEN(1,"女生");

    SexEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @EnumValue //0-男生,1-女生
    private int code;
    private String msg;
}

application.properties

#配合枚举类的扫描包所在地址
mybatis-plus.type-enums-package=com.james.mpdemo.enums

测试:

	//查询User表所有数据
	@Test
	public void testSelectList() {
		System.out.println(("----- selectAll method test ------"));
		//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
		//所以不填写就是无任何条件
		List<User> users = userMapper.selectList(null);
		System.out.println(users);
	}

在这里插入图片描述
亦可以通过实现接口的方式,不使用@EnumValue注解

public enum SexEnum implements IEnum<Integer> {

    MAN(0,"男生"),
    WOMEN(1,"女生");

    SexEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    private int code;
    private String msg;

    @Override
    public Integer getValue() {
        return this.code;
    }
}
  • @TableLogic:映射逻辑删除
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    private SexEnum sex;
    @TableLogic	//
    private Integer deleted;

}

application.properties

#配置删除时值为1,没有被删除时值为0
mybatis-plus.global-config.db-config.logic-delete-value=1;
mybatis-plus.global-config.db-config.logic-not-delete-value=0;

测试:

	//删除操作
	@Test
	public void testDelete(){
		int result = userMapper.deleteById(1);
		System.out.println(result);

	}

5、多表查询

(mybatis-plus并没有提供多表查询的可用方法,它是针对于某个表进行的sql语句自动编写,因此我们需要自定义多表查询语句)

实体类Vo:

	@Data
	public class ProductVo {
	
	   private Integer id;
	   private String productName;
	   private Integer userId;
	   private String userName;
	}

数据库表结构:
在这里插入图片描述
mapper层(使用注解方式,不需要新建XXXmapper.xml):

@Repository
public interface UserMapper extends BaseMapper<User> {

    @Select("select p.*,u.name user_name from product p, user u where p.user_id = u.id and u.id=#{id};")
    List<ProductVo> productList(Integer id);
}

测试:

	//查询操作
	@Test
	public void testSelect3(){
		List<ProductVo> productVoList = userMapper.productList(2);
		productVoList.forEach(System.out::println);

	}

测试结果:
在这里插入图片描述

6、Mybatis Plus自动生成

根据数据库表自动生成实体类、Mapper、Service、ServiceImpl、Controller
(1)pom.xml导入Mybatis Plus Generator

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-generator</artifactId>
			<version>3.4.1</version>
		</dependency>

		<dependency>
			<groupId>org.apache.velocity</groupId>
			<artifactId>velocity</artifactId>
			<version>1.7</version>
		</dependency>

Velocity(默认)、Freemarker、Beet

2、书写启动类


mysql关于时间的处理:
日期(年月日)输出:

		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.apply("DATE_FORMAT(create_time,'%Y-%m-%d') = {0}", "2021-07-27");
		
		//SELECT id,name,age,create_time,update_time,sex FROM user WHERE (DATE_FORMAT(create_time,'%Y-%m-%d') = ?)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值