建立数据库表,以及插入原始数据
CREATE DATABASE mybatis_plus; USE mybatis_plus; DROP TABLE IF EXISTS USER; CREATE TABLE USER ( id BIGINT(20) NOT NULL COMMENT '主键ID', username VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) ); INSERT INTO USER (id, username, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');此时连接数据库,我们的环境和数据就搭建完成了
User类
package com.heng.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @AllArgsConstructor @Data @NoArgsConstructor public class User { private long id; private String username; private Integer age; private String email; }UserMapper
package com.heng.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.heng.pojo.User; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; //在原来的UserMapper接口实现基本的BaseMapper @Mapper//代表这是一个mapper类 @Repository//代表的是调用dao层 public interface UserMapper extends BaseMapper<User>{ //在这个接口类里面,所有的数据库的增删改查都已经写好了,只需要调用即可。 }和原来的不同,在使用mybatis_plus时,我们就不需要写原来的方法名,和一大堆的配置了,在这里已经实现了。
为了学起来方便,直接在测试类实现
package com.heng; import com.heng.mapper.UserMapper; import com.heng.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest class Springboot08MybatisApplicationTests { @Autowired private UserMapper userMapper; @Test void contextLoads() { //这里的wrapper是一个条件构造器,在后面会有解释 //查询全部用户就不需要条件,所以写为null List<User> users=userMapper.selectList(null); users.forEach(System.out::println); } }这时候就可以查询出全部用户了‘
从这里可以看出,明显比之前的更加方便了。
**为了看出执行过程,我们需要在配置文件中加入
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl这样就可以看出执行过程了
看日志输出
这时的id已经变成了一长串数字。这就是我们的雪花算法
平时我们用uuid 还有redis等都可以用于id自增。
我们需要在实体类上的主键上加
@TableId(type = IdType.AUTO)然后数据库里面的字段一定要是自增。
mybatis_plus里面的sql都是可以自动动态拼接的
@Test void update(){ User user = new User(); user.setId(5L); user.setUsername("冰淇淋"); user.setAge(16); int i=userMapper.updateById(user); System.out.println(i); }自动填充就是创建时间、修改时间这些操作都是自动化完成的,不需要手动更新。
乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。
在数据库中增加一个version字段,设置默认值为1
然后在实体类里面增加
@Version//乐观锁 private Integer version接着我们注册乐观锁组件
package com.heng.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @MapperScan("com.heng.mapper") @Configuration public class MybatisplusConfig { @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }编写测试类
@Test //测试乐观锁 void testOptimistic(){ //查询用户信息 User user = userMapper.selectById(1L); //修改用户信息 user.setUsername("呐喊要减肥"); user.setEmail("789798@qq.com"); //更新 userMapper.updateById(user);通过日志查看version的变化
这时在数据库中的version字段变为2了
查询多个用户
@Test //查询多个用户 void testSelectList(){ List<User> userList = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); userList.forEach(System.out::println); }条件查询
@Test //条件查询 void SelectBybacthId(){ Map<String,Object> map = new HashMap<>(); map.put("username","呐喊要减肥"); map.put("age",18); List<User> userList = userMapper.selectByMap(map); userList.forEach(System.out::println); }10、分页查询
在配置类上面注册
//分页插件 @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); }编写测试类
@Test //分页查询 void testPage(){ //参数一:当前页数 //参数二:页面大小 Page<User> page = new Page<>(1,5); userMapper.selectPage(page,null); page.getRecords().forEach(System.out::println); System.out.println(page.getTotal()); }查看日志输出
可以看出也是用limit进行分页的
另外page里面还有查询总页数,是否有一页,是否有上一页
其实删除测试和查询差不多的,都是删除一个,批量删除。
在这里重点就是使用逻辑删除,逻辑删除实际上并没有删除,而是在对于用户来说是删除了,对于管理员来说就是没有删除,这就是逻辑删除。
我们平常所用的删除是物理删除,这个是直接从数据库中直接移除的。
首先在数据库中增加一个deleted字段,默认值为0。然后再实体类中增加
@TableLogic//逻辑删除 private Integer deleted;接着在配置类里面注册
//逻辑删除插件 @Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); }接着还要再配置文件中
#逻辑删除 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0编写测试类
@Test //测试删除 void deleted(){ userMapper.deleteById(1L); }通过日志我们可以看出
虽然是删除操作,却是更新路线,在数据库中的deleted中也由0–》1
如果再查询该用户就已经查不到了,因为会自动过滤被逻辑删除的字段。
属性有很多,不懂的可以去看下官方文档,在这里只测试几个。
编写测试类
package com.heng; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.heng.mapper.UserMapper; import com.heng.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import java.util.Map; @SpringBootTest public class WrapperTest { @Autowired private UserMapper userMapper; @Test void contextLoads() { //查询name不为空,并且邮箱不为空的用户,并且年龄大于等于20 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper .isNotNull("username") .isNotNull("email") .ge("age",20); userMapper.selectList(wrapper).forEach(System.out::println); } @Test void selectByOne(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("username","Tom"); //查询一个使用selectOne,多个使用list或者Map User user = userMapper.selectOne(wrapper); System.out.println(user); } @Test void test1(){ //查询年龄在20-30之间的用户 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.between("age",20,30); //查询结果数 Integer integer = userMapper.selectCount(wrapper); System.out.println(integer); } @Test void test2(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper //名字里面不包含j的用户,这个好像还会识别中文名的拼音 .notLike("username","j") //右边以t开始的email .likeRight("email","t"); List<Map<String,Object>> maps =userMapper.selectMaps(wrapper); for (Map<String,Object> map : maps) { System.out.println(map); } } }