查询:
/*
测试批量查询
*/
@Test
public void select(){
List<Long> list = new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(3L);
//查询集合
userMapper.selectBatchIds(list);
}
/*
测试条件查询
*/
@Test
public void map(){
HashMap<String, Object> map = new HashMap<>();
//自定义查询
map.put("name","张三");
List<User> list = userMapper.selectByMap(map);
for (User user : list) {
System.out.println(user);
}
}
分页查询:
分页在网站使用的十分之多!
1.原始的limit进行分页
2.pageHelper第三方插件
3.MP其实也内置了分页插件
如何使用:
1.配置拦截器
@MapperScan("com.demo.mapper")
@EnableTransactionManagement//自动管理事物
@Configuration//配置类
public class mybatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
2.直接使用Page对象即可
/*
测试分页查询
*/
@Test
public void pageTest(){
// 参数一:当前页 比如:第一页
// 参数二:当前页多少个 比如:第一页 显示3个值
Page<User> page = new Page<>(1,3);
userMapper.selectPage(page, null);
//获取值
List<User> records = page.getRecords();
for (User record : records) {
System.out.println(record);
}
//总页数
long total = page.getTotal();
System.out.println(total);
}
删除操作:
1.基本的删除操作
/*
测试删除
*/
@Test
public void delete(){
//通过id来删除
userMapper.deleteById(1442789975631347713L);
}
/*
测试批量删除
*/
@Test
public void deleteList(){
List<Long> list = new ArrayList<>();
list.add(11116L);
list.add(11117L);
list.add(11118L);
list.add(11119L);
list.add(11120L);
userMapper.deleteBatchIds(list);
}
/*
通过map删除
*/
@Test
public void maps(){
HashMap<String, Object> map = new HashMap<>();
map.put("name","张三");
userMapper.deleteByMap(map);
}
逻辑删除:
物理删除: 从数据库中直接移除
逻辑删除: 在数据库中没有被移除,而是通过变量来让他失效
例如:管理员可以查看被删除的记录!防止数据的丢失,类似于回收站
步骤:
1.数据库中增加字段:deleted
2.pojo类中添加 逻辑删除的注解:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@TableId(type = IdType.AUTO)
Long id;
String name;
Integer age;
String email;
//字段添加填充属性
@TableField(fill = FieldFill.UPDATE )
Date creatTime;
//添加乐观锁注解
@Version
Integer version;
//逻辑删除
@TableLogic
private Integer deleted;
}
3.配置逻辑删除的组件:
@MapperScan("com.demo.mapper")
@EnableTransactionManagement//自动管理事物
@Configuration//配置类
public class mybatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
//逻辑删除
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
}
在application.properties配置:
#配置逻辑删除 #logic-delete-value:删除后显示的值 #logic-not-delete-value:没删除的时候的默认值
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
测试:
查询看是否还有那个id:
会看出来 他会自动 在控制台上拼接 有逻辑删除的那个字段
也就是管理员为什么可以看到删除的记录
性能分析插件:
作用:性能分析拦截器,用于输出每条SQL语句以及执行的时间
我们在平时开发中,会遇到一些慢sql
MP也就会提供性能分析插件,如果超过这个时间那么就停止运行
1.导入插件
//SQL执行效率插件
@Bean
@Profile({"dev", "test"}) //设置dev(开发环境) test(测试环境)环境开启,保证我们的效率
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor=new PerformanceInterceptor();
//设置SQL执行的最大时间,超过了则这个SQL就不执行
performanceInterceptor.setMaxTime(100);
//是否设置SQL格式化
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
2.在application.properties里面配置环境:
环境一定要为测试环境或者开发环境
#配置dev、test 环境
spring.profiles.active=dev
3.测试查看
@Test
public void selectId(){
userMapper.selectById(1L);
}
结果:
使用性能分析插件,可以提高效率例如(开发中超过1秒的SQL可以查出来看看是否能进行优化 直接用sql执行的最大时间来设置)
条件构造器:
Wrapper:我们写一些复杂的sql就可以使用它来替代
@SpringBootTest
public class WrapperTest {
@Autowired
private UserMapper userMapper;
/*
查询name不为空的用户 并且邮箱不为空的用户,且年龄大于等于12
*/
@Test
void m1(){
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper
//不为空
.isNotNull("name")
.isNotNull("email")
//大于等于
.ge("age", 12);
List<User> list = userMapper.selectList(userQueryWrapper);
for (User user : list) {
System.out.println(user);
}
}
/*
查询name等于张三的
*/
@Test
void m2(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// eq:= 也就是=的意思
queryWrapper.eq("name", "张三");
User user = userMapper.selectOne(queryWrapper); //查询一个数据,出现多个结果使用List或者Map
System.out.println(user);
}
/*
查询年龄在 20——30之间的用户
多少个
*/
@Test
void m3(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//between: 哪里--哪里之间(区间)
wrapper.between("age", 20, 30);
//查询结果数
Integer integer = userMapper.selectCount(wrapper);
System.out.println(integer);
}