下载地址
天翼云盘下载链接
天翼云盘下载上传不限速,真的特别好用。不知道是不是只有电信用户能用。
百度网盘下载链接
提取码:84pi
1.创建springboot项目(Spring Initializer快速创建)
添加依赖
引入 Spring Boot Starter 父工程
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/>
</parent>
引入 spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、lombok、mysql、druid,junit
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
2.配置文件,数据库等
这里我使用的是application.yml,数据库的名字叫mybatisplus
server:
port: 8080
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/mybatisplus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: 123456
# 配置日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
创建数据库
创建表和数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`age` int(11) NULL DEFAULT NULL COMMENT '年龄',
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`version` int(10) NULL DEFAULT 1 COMMENT '乐观锁',
`deleted` int(1) NULL DEFAULT 0 COMMENT '是否被删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES (1, 'Jone', 18, '[email protected]', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 1);
INSERT INTO `user` VALUES (2, 'Jack', 20, '[email protected]', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);
INSERT INTO `user` VALUES (3, 'Tom', 28, '[email protected]', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);
INSERT INTO `user` VALUES (4, 'Sandy', 21, '[email protected]', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);
INSERT INTO `user` VALUES (5, 'Billie', 24, '[email protected]', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);
SET FOREIGN_KEY_CHECKS = 1;
3.配置,策略,实体类
如果有注解不认识的地方,可以百度一下,lombok这个插件很方便的。
(1).创建实体类
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.AUTO)//主键自增
private Long id;//对应数据库中的主键
private String name;
private Integer age;
private String email;
@TableLogic
private Integer deleted;//逻辑删除
@Version
private Integer version;//乐观锁
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
@AllArgsConstructor------全参构造
@NoArgsConstructor-----无参构造
@Data-----get、set、equals、hashCode、canEqual、toString方法
点击查看注解官方解释
@TableLogic-----表字段逻辑处理注解(逻辑删除)
@Version-----乐观锁注解
@TableId(type = IdType.AUTO)
@TableField-----字段注解
这个注解的idType点进去查看源码,可以发现是一个枚举类,视情况选择。
(2).创建mapper(继承baseMapper,泛型填写对应的实体类)
public interface UserMapper extends BaseMapper<User> {
}
(3).创建填充策略
为@tableField创建填充策略
原理:
(1).实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
(2).注解填充字段 @TableField(… fill = FieldFill.INSERT) 生成器策略部分也可以配置
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 {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill....");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill....");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
注意事项:
填充原理是直接给entity的属性设置值!!! 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null。
MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充。
字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段。
填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入。
要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法。
不需要根据任何来区分可以使用父类的fillStrategy方法。
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
(4).配置类
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
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.qwl.mybatisplus.mapper")//扫描包
@Configuration//配置类
public class MybatisPlusConfig {
//注册乐观锁插件
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//分页插件
@Bean
public PaginationInnerInterceptor paginationInnerInterceptor(){
return new PaginationInnerInterceptor();
}
}
@MapperScan(“com.qwl.mybatisplus.mapper”)----扫描mapper
@EnableTransactionManagement-----添加事务
4.增删改查
使用springboot的测试类进行增删改查
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
class MybatisplusApplicationTests {
@Resource
private UserMapper userMapper;
}
查询
查询全部
/**
* 查询全部
*/
@Test
void queryAll() {
List<User> list = userMapper.selectList(null);
System.out.println(list);
}
查询-根据id批量查询
/**
*id批量查询
*/
@Test
public void testSelectBacthIds(){
List<User> list = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
list.forEach(System.out::println);
}
查询-根据map查询
/**
* map查询
*/
@Test
public void testSelectByMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("name","jack");
List<User> list = userMapper.selectByMap(map);
list.forEach(System.out::println);
}
查询-分页查询
/**
*分页查询
*/
@Test
public void testSelectPage(){
Page<User> page = new Page<>(2,2);//(pageNumber,pageSize)
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
}
查询-wrapper查询
查询name不为空的,并且邮箱不为空的用户,年龄大于21的。(isNotNull–非空 ,ge—大于)
/**
* 查询 isNotNull--非空 ge---大于
*/
@Test
void queryIsNotNull() {
//查询name不为空的,并且邮箱不为空的用户,年龄大于21的
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.isNotNull("name")
.isNotNull("email")
.ge("age",21);
userMapper.selectList(wrapper).forEach(System.out::println);
}
查询 eq(等于)
/**
* 查询 eq
*/
@Test
void queryEq() {
//查询name为tom的
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","Tom");
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
查询 between and
/**
* 查询 between and
*/
@Test
void queryBetweenAnd() {
//查询年纪为21~30的
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age",21,30);
Integer count = userMapper.selectCount(wrapper);
System.out.println(count);
}
模糊查询 notLike–not like %x% like–%x% likeRight–x% likeLeft–%x
/**
* 模糊查询 notLike--not like %x% like--%x% likeRight--x% likeLeft--%x
*/
@Test
void queryLike() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.notLike("name","m")
.likeRight("email","t");
userMapper.selectMaps(wrapper).forEach(System.out::println);
}
连接查询
/**
* 连接查询
*/
@Test
void queryQueryConnect() {
//id在子查询中查出
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.inSql("id","select id from user where id<4");
List<Object> list = userMapper.selectObjs(wrapper);
list.forEach(System.out::println);
}
查询排序
/**
* 查询排序
*/
@Test
void queryOrderBy() {
//通过id进行排序
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
List<User> list = userMapper.selectList(wrapper);
list.forEach(System.out::println);
}
新增
主键自增,创建时间修改时间自动插入
/**
*插入
*/
@Test
public void testInsert(){
User user = new User();
user.setName("qwl");
user.setAge(18);
user.setEmail("[email protected]");
userMapper.insert(user); //自动生成id
System.out.println(user.getId());
}
修改
修改–乐观锁(修改成功)
/**
*修改---乐观锁
*/
@Test
public void testUpdate(){
User user = userMapper.selectById(8L);
user.setName("鹿小葵加油222");
user.setAge(88);
userMapper.updateById(user);
}
修改–乐观锁(修改失败)
/**
*修改--乐观锁(修改失败)
*/
@Test
public void testOptimisticLocker(){
//线程1
User u1 = userMapper.selectById(8L);
u1.setName("鹿小葵加92号油");
u1.setAge(666);
//线程2
User u2 = userMapper.selectById(8L);
u2.setName("鹿小葵加95号油");
u2.setAge(666);
userMapper.updateById(u2);
userMapper.updateById(u1);//更改失败,乐观锁
}
删除
数据库有"deleted"字段,采用的是逻辑删除。(0代表未删除,1代表已删除)
删除-map删除
/**
* map删除
*/
@Test
public void testDeleteByMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("id",8L);
userMapper.deleteByMap(map);
}
删除-根据idList批量删除
/**
* 根据idList批量删除
*/
@Test
public void testDeleteBatchIds(){
userMapper.deleteBatchIds(Arrays.asList(5L,4L));
}
删除-根据id删除
/**
* 根据id删除
*/
@Test
public void testDeleteById(){
userMapper.deleteById(1);
}