目录
一、mybatis-plus环境搭建
springboot+mybatis-plus
1、mybatis-plus-boot-starter
2、application.yml 配置文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/yan9
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
type-aliases-package: com.hl.mybatisplus.entity
mapper-locations: classpath*:/com/hl/mybatisplus/mapper/*.xml
logging:
level:
com.hl.mybatisplus.mapper: debug
3、创建Service接口
extends IService<Message>
创建ServiceImpl实现类
extends ServiceImpl<MessageMapper, Message>
implements MessageService
创建Mapper接口
extends BaseMapper<Message>
4、使用mybatis-plus提供的增删改查方法
package com.hl.mybatisplus;
import com.hl.mybatisplus.entity.Message;
import com.hl.mybatisplus.mapper.MessageMapper;
import com.hl.mybatisplus.service.MessageService;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
@MapperScan(basePackages = "com.hl.mybatisplus.mapper")
class MybatisPlusApplicationTests {
@Autowired
private MessageService messageService;
@Autowired
private MessageMapper messageMapper;
@Test
void contextLoads() {
List<Message> list = messageService.list();
System.out.println(list);
List<Message> list2 = messageMapper.selectList(null);
System.out.println(list);
}
}
二、了解mybatis-plus提供的各种增删改查方法
package com.hl.mybatisplus;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hl.mybatisplus.entity.Message;
import com.hl.mybatisplus.mapper.MessageMapper;
import com.hl.mybatisplus.service.MessageService;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.*;
@SpringBootTest
@MapperScan(basePackages = "com.hl.mybatisplus.mapper")
class MybatisPlusApplicationTests {
@Autowired
private MessageService messageService;
@Autowired
private MessageMapper messageMapper;
@Test
void contextLoads() {
List<Message> list = messageService.list();
System.out.println(list);
List<Message> list2 = messageMapper.selectList(null);
System.out.println(list2);
}
@Test
public void save(){
Message message = new Message();
message.setMsg("hello ...1");
message.setStatus(0);
message.setUserId(1);
message.setType1("异常类型通知1");
message.setCreateTime(new Date());
Message message2 = new Message();
message2.setMsg("hello ...2");
message2.setStatus(0);
message2.setUserId(1);
message2.setType1("异常类型通知2");
message2.setCreateTime(new Date());
// boolean flag = messageService.save(message);
List<Message> list = new ArrayList<>();
list.add(message);
list.add(message2);
boolean flag = messageService.saveBatch(list);
System.out.println("新增状态:"+flag);
}
@Test
public void saveOrUpdate(){
Message message = new Message();
message.setMsg("hello ...4");
message.setStatus(0);
message.setUserId(1);
message.setType1("异常类型通知4");
message.setCreateTime(new Date());
message.setId(8);
//id存在为更新 id不存在为新增
boolean flag = messageService.saveOrUpdate(message);
// messageService.saveOrUpdateBatch(null);
System.out.println("新增或者更新:"+flag);
}
@Test
public void delete(){
messageService.removeById(-1971798015);
// messageService.removeByIds(null);
}
@Test
public void query(){
QueryWrapper wraper = new QueryWrapper();
wraper.ge("id",2);
wraper.like("type","通知");
wraper.orderByDesc("id");
// wraper.select("id","type");
wraper.select("type","count(id)");
wraper.groupBy("type");
messageService.list(wraper);
Map map = new HashMap();
map.put("id",1);
map.put("type",2);
messageService.listByMap(map);
QueryWrapper wraper2 = new QueryWrapper();
wraper2.eq("id",1);
Message message = messageService.getOne(wraper2);
}
}
三、自定义方法
public interface MessageMapper extends BaseMapper<Message> {
@Select("select * from message where msg like concat('%',msg,'%')")
public List<Message> queryByMsg(String msg);
public Message findById(Integer id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatisplus.mapper.MessageMapper">
<resultMap id="BaseResultMap" type="com.hl.mybatisplus.entity.Message">
<id property="id" column="id" />
<result property="type" column="type" />
<result property="msg" column="msg" />
<result property="createTime" column="create_time" />
<result property="userId" column="user_id" />
<result property="status" column="status" />
</resultMap>
<sql id="Base_Column_List">
id,type,msg,create_time,user_id,status
</sql>
<!-- public Message findById(Integer id);-->
<select id="findById" resultType="Message">
select * from message where id = #{id}
</select>
</mapper>
四、mysql乐观锁
1、数据库表中添加版本号字段 version
2、该字段默认初始值为0
3、实体类中添加版本号字段 并使用@Version注解
/*
版本号字段 用于乐观锁
*/
@Version
private Integer version;
4、执行更新操作 version自动加1
@Test
public void version(){
Message message = messageMapper.findById(1);
message.setCreateTime(new Date());
message.setMsg("hello 11111111 ");
messageMapper.updateById(message);
}
5、测试乐观锁
使用数据时不加锁,当更新时,判断版本号是否一致,一致了,更新,不一致不更新。
加断点,手动更新version测试。
package com.hl.mybatisplus;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan(basePackages = "com.hl.mybatisplus.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
@Bean
public MybatisPlusInterceptor myBatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件
return interceptor;
}
}
五、逻辑删除
物理删除:直接从数据库表中删除数据
逻辑删除:更新状态位为删除状态,并非真的删除。