package com.example.Demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.Demo.mapper")
public class MybatisPlusStudyApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusStudyApplication.class, args);
}
}
Mapper层:只需要继承接口
package com.example.Demo.mapper; import com.baomidou.mybatisplus.core.mapper.baseMapper; import com.example.Demo.pojo.User; import org.springframework.stereotype.Repository; @Repository public interface UserMapper extends baseMapper实体类:{ }
package com.example.Demo.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
测试:
package com.example.Demo;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.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 MybatisPlusStudyApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List users = userMapper.selectList(null);
users.forEach(System.out::println);
}
}
配置文件:
server.port=7099 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=root mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.global-config.db-config.id-type=auto mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0测试结果: 需要注意的一个问题: 注意:主启动类扫描所有接口 插入+主键生成策略: 一旦手动写id必须写setid
public enum IdType {
AUTO(0),//数据库ID自增
NONE(1),//该类型为未设置主键类型
INPUT(2),//用户输入ID
//该类型可以通过自己注册自动填充插件进行填充
//以下3种类型、只有当插入对象ID 为空,才自动填充。
ID_WORKER(3),//全局唯一ID (idWorker)
UUID(4),//全局唯一ID (UUID)
ID_WORKER_STR(5);//字符串全局唯一ID (idWorker 的字符串表示)
CRUD操作:
package com.example.Demo;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.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 MybatisPlusStudyApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List users = userMapper.selectList(null);
users.forEach(System.out::println);
}
@Test
public void testInstert(){
User user = new User();
user.setName("邓家佳");
user.setEmail("2534625115@qq.com");
user.setAge(3);
int result = userMapper.insert(user);
System.out.println(result);
System.out.println(user);
}
@Test
public void TestUpdate(){
User user = new User();
user.setId(9L);
user.setName("范涛之");
int i = userMapper.updateById(user);
System.out.println(i);
}
}
自动填充
创建时间 . 修改时间! 这些个操作都是自动化完成的,我们不希望手动更新! 阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化! 1:首先,新建字段写好注解:
package com.example.Demo.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.omg.CORBA.IDLType;
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;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
2:编写处理器:
package com.example.Demo.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 MyDataHandler implements metaObjectHandler {
// 插入时的填充策略
@Override
public void insertFill(metaObject metaObject) {
log.info("开始执行插入.........");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
// 更新时的填充策略
@Override
public void updateFill(metaObject metaObject) {
log.info("开始执行更新.........");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
乐观锁的处理:
1:数据库添加字段默认为1:
实体类增加字段:
3:配置乐观锁插件:
// 注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
测试:乐观锁成功:单一线程
测试:乐观锁失败:
@Test
public void TestClocker2() {
// 线程一:
//查询用户信息
User user = userMapper.selectById(5L);
user.setName("kuangshen111");
user.setEmail("124621515@qq.com");
// 线程二:模拟另外一个用户执行插队操作
User user2 = userMapper.selectById(5L);
user2.setName("kuangshen222");
user2.setEmail("124621515@qq.com");
// 自旋锁尝试多次提交
userMapper.updateById(user2); //如果没有乐观锁就回覆盖插队线程的值
}
查询操作:批量查询
@Test
public void TestSelect(){
List users = userMapper.selectBatchIds(Arrays.asList(5, 6, 7));
users.forEach(System.out::println);
}
查询:按条件:适用Map
@Test
public void testTJ(){
HashMap map = new HashMap<>();
// 自定义查询
map.put("name","邓家佳");
List users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
分页查询:
1:配置分页插件:
// 分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
return paginationInterceptor;
}
2:直接使用Page对象
@Test
public void TestPage(){
// 参数一:当前页 参数二:页面大小
Page page = new Page<>(1,4);
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
}
删除操作:根据ID删除
@Test
public void testDeleteById(){
userMapper.deleteById(12L);
}
public void testDeleteByBatchId(){
userMapper.deleteBatchIds(Arrays.asList(5L,8L,9L));
}
*/
public void testDeleteByMap(){
HashMap map = new HashMap<>();
map.put("name","哈哈哈");
userMapper.deleteByMap(map);
}
逻辑删除:
物理删除:从数据库中直接移除 逻辑删除: 在数据库中没有被移除,而是通过一个变量来让他失效! deleted=0=>deleted=1 1:数据库中增加字段:
2:实体类增加属性:
@TableLogic
private Integer deleted;
3:配置组件:
// 逻辑删除组件
@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测试: 性能分析插件 1:增加插件:
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
配置文件增加:spring.profiles.active=dev
条件构造器:Wrapper 六个测试
手写一些复杂sql
package com.example.Demo;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.Demo.mapper.UserMapper;
import com.example.Demo.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 TestWr(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.isNotNull("name")
.isNotNull("email")
.ge("age",12);
userMapper.selectList(wrapper).forEach(System.out::println); //和我们学习的map对比一下
}
@Test
void test2(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("name","范涛之");
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
@Test
void test3(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.between("age",20,30);
Integer count = userMapper.selectCount(wrapper);//查询结果数
System.out.println(count);
}
@Test
void test4(){
QueryWrapper wrapper = new QueryWrapper<>();
// 左和右:百分号在哪边 这个就相当于:t%也就是t开头
wrapper.notLike("name","范")
.likeRight("email","t");
List
代码自动生成器:
dao、pojo、service、controller都给我自己去编写完成! AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。 只需要改实体类名字 和包名 还有 数据库配置即可



