Mybatis的升级版
首先说一下这个Mybatis-plus他自己集成了所有的CRUD方法,所以我们先简单的写一个小测试:
启动类:
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<User> {
}
实体类:
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<User> 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<User> 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);
}
}
自动填充
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<User> users = userMapper.selectBatchIds(Arrays.asList(5, 6, 7));
users.forEach(System.out::println);
}
查询:按条件:适用Map
/**
* 条件查询
*/
@Test
public void testTJ(){
HashMap<String, Object> map = new HashMap<>();
// 自定义查询
map.put("name","邓家佳");
List<User> 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<User> page = new Page<>(1,4);
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
}
删除操作:根据ID删除
/**
* 删除操作:
*/
@Test
public void testDeleteById(){
userMapper.deleteById(12L);
}
/**
* 批量删除通过id
*/
public void testDeleteByBatchId(){
userMapper.deleteBatchIds(Arrays.asList(5L,8L,9L));
}
/**
* 条件删除
*/
*/
public void testDeleteByMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("name","哈哈哈");
userMapper.deleteByMap(map);
}
逻辑删除:
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:增加插件:
/**
* SQL 执行性能分析插件
* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
*/
@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;
/**
* 测试一:查询name不为空并且邮箱不为空的用户 ,同时年龄大于等于12岁
*/
@Test
void TestWr(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name")
.isNotNull("email")
.ge("age",12);
userMapper.selectList(wrapper).forEach(System.out::println); //和我们学习的map对比一下
}
/**
* 测试二:名字等于范涛之的
*/
@Test
void test2(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","范涛之");
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
/**
* 测试三:查询年龄在20-30岁之间的用户
*/
@Test
void test3(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age",20,30);
Integer count = userMapper.selectCount(wrapper);//查询结果数
System.out.println(count);
}
/**
* 测试四:模糊查询:名字里面不包含范的
*/
@Test
void test4(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 左和右:百分号在哪边 这个就相当于:t%也就是t开头
wrapper.notLike("name","范")
.likeRight("email","t");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
/**
* 测试五:子查询
*/
@Test
void test5(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
// id在子查询中查出来
wrapper.inSql("id","select id from user where id<3");
List<Object> objects = userMapper.selectObjs(wrapper);
objects.forEach(System.out::println);
}
/**
* 测试六:排序:通过id进行排序
*/
@Test
void test6(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
// id在子查询中查出来
wrapper.orderByDesc("id");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
}
代码自动生成器:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81002.html