MyBtisPlus快速入门

由来
在这里插入图片描述

一、创建一个简单的数据库表

1.1创建数据表

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
);

1.2插入数据

INSERT INTO `user` (`id`, `name`, `age`, `email`) VALUES
(1, 'tom', 7, '123@qq.com'),
(2, 'air', 6, '123@qq.com') ;

二、创建SpringBoot工程

2.1创建项目

2.2引入依赖

lombook需要手IDEA手动下载插件才能使用

         <!--lombook简化实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybaits-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

2.3配置数据库信息

在application.properties中MySQL添加数据库相关的配置信息

springboot 2.0(内置jdbc5的驱动)

#mysql 数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus_demo?characterEncoding=utf-8&userSSL=false
spring.datasource.username=root
spring.datasource.password=123456

SpringBoot2.1及以上(内置jdbc8驱动)

注意:driver和url的变化

#mysql 数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus_demo?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

三、编写代码

3.1添加实体类

@Data
@Accessors(chain = true)    //链式编程
public class User {
    private Long id;
    private String name;
    private int age;
    private String email;
}

3.2添加mapper

创建包mapper编写Mapper接口:UserMapper.java BaseMapper<实体类对象>

@Repository
public interface UserMapper extends BaseMapper<User> {
}
3.2.1@Repository和@Mapper的区别
1、使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。

2、@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
3.2.2 中文注释

下载BaseMapepr源码,就有中文注释了
在这里插入图片描述
在这里插入图片描述

3.3启动类

启动类加上@MapperScan(“mapper包的路径”)

为什么?

​ 因为UserMapper接口要动态生成实现类对象,而动态生成对象默认找不到,需要要加这个mapper扫描注解

@SpringBootApplication
@MapperScan("com.example.mp_demo.mapper")
public class MpDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MpDemoApplication.class, args);
    }
}

3.3测试

这里就直接在test测试

	@Autowired
    private UserMapper userMapper;

    @Test
    void findAll() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }

得到输出结果
在这里插入图片描述

3.4小结

发现是不是特别方别,相比mybatis

1.没有写sql语句

2.没有写xml配置文件

只是让接口继承BaseMapper,调用方法,虽然没有sql语句,但是底层肯定有sql语句生成

3.5查看sql输出日志

application.properties配置文件中添加配置

#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

执行代码,控制台就会输出sql语句
在这里插入图片描述

四、主键

4.1主键生成策略

首先写一个添加的方法,参数不写id,MyBatisPlus会默认生成一个19位的id

	@Test
    void add() {
        User user = new User();
        user.setName("sir").setAge(3).setEmail("2913@qq.com");
        userMapper.insert(user);
    }

在这里插入图片描述

4.2主键自增

实体类

	@TableId
	private Long brandId;

配置文件

# sql映射文件位置
mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto

五、自动填充和乐观锁

5.1自动填充

在这里插入图片描述

5.1.2数据库修改

在user表中添加datetime类型的新字段 create_time、update_time

在这里插入图片描述

5.1.3实体类添加对应的属性

在实体类上加上新的字段,并添加自动填充的注解

@Data
@Accessors(chain = true)    //链式编程
public class User {
  private Long id;
  private String name;
  private int age;
  private String email;

  @TableField(fill = FieldFill.INSERT)	// 添加的时候执行
  private Date createTime;    //和数据库字段名字对应,驼峰命名
  @TableField(fill = FieldFill.INSERT_UPDATE)	//修改的时候执行
  private Date updateTime;
}
5.1.4 实现元对象处理器接口

创建handler包MyMetaObjectHandler类,实现MetaObjectHandler,实现接口的中的两个方法

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    // MybatisPlus执行添加操作,这个方法执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    // MybatisPlus执行添加操作执行修改操作,这个方法执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}
5.1.5 测试

插入或更新一条数据,查看是否自动填充

    @Test
    void update(){
        User user = new User();
        user.setName("sir3").setAge(3).setEmail("2913@qq.com").setId(1388691933268787201L);
        userMapper.updateById(user);
    }

在这里插入图片描述

5.2乐观锁

5.2.1使用场景

在这里插入图片描述
张三跟李四同时操作一条数据,张三拿到一条数据是5000,更新成9000,李四这时候就应该拿到的数据是9000,修改

在这里插入图片描述

5.2.2解决方案

每次更新把版本号更新,修改之前和版本号作比较,相同的话就更新,不相同不更新
在这里插入图片描述
在这里插入图片描述
比如抢票。

5.2.3乐观锁实现流程
5.2.3.1修改实体类,和数据库表中

在实体类添加@Version注解

@Data
@Accessors(chain = true)    //链式编程
public class User {
    private Long id;
    private String name;
    private int age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;    //和数据库字段名字对应,驼峰命名
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @Version
    private Integer version;
}

在数据表中添加字段
在这里插入图片描述

5.2.3.2注册乐观锁插件

在MyBatisPlusConfig中注册Bean

如果是普通项目在xml中加个bean就可以了

创建config包MyConfig类

@MapperScan("com.example.mp_demo.mapper")
@Configuration
public class MyConfig{
    /**
     * 乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

然后给实体类的version添加自动填充,使添加数据version有默认值

@Data
@Accessors(chain = true)    //链式编程
public class User {
    private Long id;
    private String name;
    private int age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;    //和数据库字段名字对应,驼峰命名
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @Version
    @TableField(fill = FieldFill.INSERT)    //添加数据,版本默认为1
    private Integer version;
}
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    // MybatisPlus执行添加操作,这个方法执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("version", 1, metaObject);	// 乐观锁
    }

    // MybatisPlus执行添加操作执行修改操作,这个方法执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}
5.2.3.3测试

因为是并发效果,不好测试,所以就看更新数据,这个version由1变2

先添加一条数据,version自动填充为1

在修改数据,version变成2

六、条件查询

6.1通过多个id批量查询

	@Test
    void select1(){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        List<User> users = userMapper.selectBatchIds(list);
        System.out.println(users);
    }

简单来写就是

Arrays.asList该方法是将数组转化成List集合的方法

	@Test
    void select1(){
        // 传入一个list集合
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        System.out.println(users);
    }

6.2简单条件查询

传入一个map,key为字段名,value是要查询的值

	@Test
    void select2(){
        Map<String, Object> map = new HashMap<>();
        map.put("name","sir1");
        map.put("age",3);
        List<User> users = userMapper.selectByMap(map);
        System.out.println(users);
    }

6.3 分页查询

6.3.1配置分页插件

在配置类中写分页插件

@MapperScan("com.example.mp_demo.mapper")
@Configuration
public class MyConfig{
    /**
     * 乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }

    /**
     * 分页查询
     */
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}
6.3.2编写分页代码
1. 插件page对象,传入两个参数
   - 当前页
   - 每页显示记录数
2. 调用MyBatisPlus的方法实现分页
    @Test
    void selectPage() {
        Page<User> userPage = new Page(1, 2);
        // 返回对象得到分页所有数据
        Page<User> page = userMapper.selectPage(userPage, null);
        long pages = page.getPages();// 总页数
        long current = page.getCurrent();// 当前页
        List<User> records = page.getRecords();// 当前页的数据集合
        long total = page.getTotal();   // 表中总记录数
        boolean b = page.hasNext(); // 当前页是否有下一页
        boolean b1 = page.hasPrevious();    // 当前页是否有上一页
    }

七、删除和逻辑删除

7.1删除,批量删除,条件删除

删除此处略,查看源码即可一通百通

7.2逻辑删除

在表中添加字段,作为逻辑删除的标志,每次删除时候,修改标志位

0: 没删除

1: 删除

7.2.0更改默认删除0和1(可选)

在application配置文件中,可配置删除和不删除的数字

# 删除
mybatis-plus.global-config.db-config.logic-delete-value=1   
# 未删除
mybatis-plus.global-config.db-config.logic-not-delete-value=0
7.2.1数据库修改

表中添加delete标志字段

7.2.2修改实体类

实体类增加逻辑删除的属性、注解

 	@TableLogic
    @TableField(fill = FieldFill.INSERT)    // 自动填充,添加数据默认为0,没删除
    private Integer deleted;

在配置类添加,自动填充

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    // MybatisPlus执行添加操作,这个方法执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);   // 创建时间
        this.setFieldValByName("updateTime", new Date(), metaObject);   // 更新时间
        this.setFieldValByName("version", 1, metaObject);   // 版本
        this.setFieldValByName("deleted", 0, metaObject);   // 逻辑删除,0没有删除
    }

    // MybatisPlus执行添加操作执行修改操作,这个方法执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

7.2.3测试

根据id删除测试,deleted字段是否为1

	@Test
    void deleteById(){
        int i = userMapper.deleteById(1L);
    }

八、条件构造器和常用接口

8.1wapper 介绍

在这里插入图片描述

8.2测试用例

8.2.1 ge、gt、le、lt、isNull、isNotNull
ge大于等于>=
gt大于>
le小于等于<=
lt小于<
eq等于=
isNulNULL 值查询
isNotNullIS NOT NULL
ne就是 not equal不等于
    @Test
    void testSelect(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.ge("age",3);    // 年龄大于等于21
        List<User> users = userMapper.selectList(wrapper);
        System.out.println(users);
    }
8.2.2 between、notBetween

between 区间范围 notBetween 不是这个区间范围

	@Test
    void testSelect(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age",3,8); // 查询年龄3-8岁之间的
        List<User> users = userMapper.selectList(wrapper);
        System.out.println(users);
    }
8.2.3 like、notLike、linkLeft、likeRight

8.2.4 orderBy、orderByDesc、orderByAsc
    @Test
    public void testSelectMaps(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("id");  // 根据id降序
        List<User> users = userMapper.selectList(wrapper);
        System.out.println(users);
    }
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值