mybatis-plus
mybatis-puls
-
快速上手
-
导入依赖 注意,我所使用的是3.0.5版本,便于理解原理
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>
-
创建mybatis_plus数据库,导入表User
DROP TABLE IF EXISTS USER; CREATE TABLE USER ( id BIGINT(20) NOT NULL COMMENT '主键ID', NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) ); DELETE FROM USER; INSERT INTO USER (id, NAME, 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');
-
配置数据源
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=ture&characterEncoding=utf-8&serverTimezone=GMT%2B8 driver-class-name: com.mysql.cj.jdbc.Driver
-
编写实体类
package com.lix.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data//使用了Lombok简化代码 @NoArgsConstructor @AllArgsConstructor public class User { private long id; private String name; private int age; private String email; }
-
编写mapper接口
package com.lix.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lix.pojo.User; import org.springframework.stereotype.Repository; @Repository//标识这是一个dao层 public interface UserMapper extends BaseMapper<User> {//mapper接口继承BaseMapper即可 }
-
在主启动类上添加MapperScan扫描mapper包
package com.lix; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.lix.mapper")//自动扫描mapper包 public class MybatisPlusApplication { public static void main(String[] args) { SpringApplication.run(MybatisPlusApplication.class, args); } }
-
编写测试类测试mybatis-plus
package com.lix; import com.lix.mapper.UserMapper; import com.lix.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 MybatisPlusApplicationTests { @Autowired private UserMapper userMapper; @Test void contextLoads() { List<User> users = userMapper.selectList(null); users.forEach(System.out::println); } }
-
可以看到程序输出了user表信息
-
到此,小功告成
-
-
使用了mybatis-plus之后,我们所有的sql几乎都被它去写了,想要看到sql语句就要添加一个日志,也很简单,只需要在配置文件中加入日志配置就好了,小功告成
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl//这是一个将日志控制台输出的配置
-
插入和更新以及gmt_creat、gmt_modified
-
数据库中新增字段gmt_creat、gmt_modified(datetime)
-
插入操作
//测试insert方法 @Test void userInsert(){ User users = new User(); users.setName("lix"); users.setAge(3); users.setEmail("58007765@qq.com"); System.out.println(userMapper.insert(users)); System.out.println(users); }
-
更新操作
//测试update方法 @Test void userUpdate(){ User users = new User(); users.setId(6L); users.setName("lxf"); System.out.println(userMapper.updateById(users)); }
-
自动填充gmt_creat、gmt_modified
-
首先需要在数据库表对应的字段名上添加
@TableField
@TableField(fill = FieldFill.INSERT) private Date gmtCreat; @TableField(fill = FieldFill.INSERT_UPDATE) private Date gmtModified;
-
其次我们需要实现MetaObjectHandler类来指定需要填充的列
package com.lix.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler {//实现MetaObjectHandler,重写insertFill,updateFill方法 @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("gmtCreat",new Date(),metaObject);//gmtCreat列填充 this.setFieldValByName("gmtModified",new Date(),metaObject);//gmtModified列填充 } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("gmtModified",new Date(),metaObject);//gmtModified列填充 } }
-
最后,测试类测试inser、update方法,查看数据库是否填充成功
-
小功告成
-
-
-
乐观锁
-
首先在数据库中增加version字段
-
在对应的实体类属性version上增加
@version
注解@Version private Integer version;
-
创建一个MybatisplusConfig配置类,编写相应配置
package com.lix.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; @MapperScan("com.lix.mapper")//要在那个包下扫描mapper接口 @Configuration//标注这是一个配置类,被IOC托管 @EnableTransactionManagement//开启事务的支持 public class MybatisPlusConfig { //配置乐观锁需要先注册下面这个Bean @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } }
-
最后,测试类中测试更新方法,
//测试@version @Test void userUpdate1(){//模拟单线程 User users = userMapper.selectById(6L); users.setName("l"); System.out.println(userMapper.updateById(users)); }
-
会发现动态SQL被拼接为带version=?的语句,至此,乐观锁上锁成功,小功告成
UPDATE user SET name=?, age=?, email=?, version=?, gmt_modified=? WHERE id=? AND version=?
-
-
分页查询
-
首先要在配置类mybatisplusconfig中加入如下配置
@Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }
-
然后直接在测试类中使用
@Test void userSelect3() { Page<User> page = new Page<>(1,5); IPage<User> iPage = userMapper.selectPage(page, null); iPage.getRecords(); }
-
小功告成
-
-
wrapper-条件查询构造器(多多练习即可)
@Test void selectLikeRight(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.likeRight("name","l"); userMapper.selectList(wrapper).forEach(System.out::println); } @Test void selectAllEq(){ val wrapper = new QueryWrapper<User>(); wrapper.eq("name","lix") .ge("age",3) .between("age","10","20");
-
alleq({id:1,name:"lix",age:null},true)
-
eq =
-
ne !=
-
gt >
-
ge >=
-
lt <
-
le <=
-
between [val1,val2]
-
notBetween
-
like 包含某一个字符
-
notLike 不包含某一个字符
-
likeLeft 以char结尾
-
likeRight 以char开头
-
isNull
-
isNotNull
in("age",{1,2,3})
......
-
小功告成
-
本文来自博客园,作者:六爻呈乾,转载请注明原文链接:https://www.cnblogs.com/ilycq/articles/15245240.html