尚医通学习
作者:互联网
1、MyBatis-Plus实现数据库crud
1)、MyBatis-Plus是什么?
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2)、MyBatis-Plus入门案例:
创建数据库 mybatis_plus:
create database mybatis-plus
创建表:
CREATE TABLE USER
(
id BIGINT(20)NOT NULL COMMENT '主键ID',
NAME VARCHAR(30)NULL DEFAULT NULL COMMENT '姓名',
age INT(11)NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50)NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
插入数据:
INSERT INTO user (id, name, age, email)VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
创建springboot工程
导入相关依赖(统一使用springboot 2.2.1 版本)
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
创建实体类 User:
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
创建Mapper接口继承BaseMapper:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wyf.demomptest.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
配置文件:application.properties
# 应用名称
spring.application.name=demomptest
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=13527343138
主启动类:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.wyf.demomptest.mapper")
//由于BaseMapper是动态生成的对象,而动态生成的对象是默认找不到的,所以需要扫描进来
public class DemomptestApplication {
public static void main(String[] args) {
SpringApplication.run(DemomptestApplication.class, args);
}
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemomptestApplicationTests {
@Autowired
private UserMapper mapper;
//这里会爆红是因为UserMapper 找不到对象,因为UserMapper 是动态生成的
//在接口UserMapper上加一个注解@Repository即可
@Test
public void findAll(){
List<User> users = mapper.selectList(null);
for (User user:users){
System.out.println(user);
}
}
}
测试结果:
查看sql输出日志:在配置文件中加
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
在此测试查看控制台输出
添加操作:
@Test
public void testAdd(){
User user=new User(null,"lucy",20,"123456@qq.com");
int insert = mapper.insert(user);
System.out.println(insert);
}
测试结果:
表中数据:
发现我们插入数据的时候并没有设置主键id,但是表中自己生成了主键id,这是由于MyBatis-Plus的主键策略。
MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)
@TableId(type = IdType.ASSIGN_ID)
private String id;
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
修改操作:
@Test
public void testUpdate(){
User user=new User(1457681848516091905L,"王大锤",22,"456798@qq.com");
int i = mapper.updateById(user);
System.out.println(i);
}
测试结果:
多个id批量查询
//多个id批量查询
@Test
public void testSelect(){
//selectBatchIds 里面放入集合
List<User> users = mapper.selectBatchIds(Arrays.asList(1, 2, 3));
for (User user:users){
System.out.println(user);
}
}
测试结果:
简单条件查询
//简单条件查询
@Test
public void testSelect2(){
Map<String,Object> map=new HashMap<>();
map.put("name","Jack");
map.put("age",20);
List<User> users = mapper.selectByMap(map);
for (User user:users){
System.out.println(user);
}
}
测试结果:
分页查询:
配置分页插件
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
编写分页代码:创建page对象,传入两个参数(当前页和每页记录数),然后调用MyBatis-Plus的方法实现分页
//分页查询
@Test
public void testSelectPage(){
Page<User> page=new Page<>(1,3);
Page<User> userPage = mapper.selectPage(page, null);
//返回对象得到分页所有数据
long pages = userPage.getPages();//总页数
System.out.println(pages);
long current = userPage.getCurrent();//当前页
System.out.println(current);
List<User> records = userPage.getRecords();//查询数据集合
System.out.println(records);
long total = userPage.getTotal();//总记录数
System.out.println(total);
boolean hasNext = userPage.hasNext();//是否有后一页
System.out.println(hasNext);
boolean hasPrevious = userPage.hasPrevious();//是否有前一页
System.out.println(hasPrevious);
}
测试结果:
3)、MyBatis-Plus自动填充(?)
准备工作:在表中添加两个datetime类型的新字段:
在表对应的实体类上添加对应的属性:
private Date createTime; //create_time
private Date updateTime; //update_time
在实体类要进行自动填充的属性加上注解,指定是添加的时候有值,还是修改的时候有值
@TableField(fill = FieldFill.INSERT)
private Date createTime; //create_time
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time
创建一个类实现接口,实现接口的两个方法,一个方法添加执行,一个方法修改执行,设置添加什么值。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//mp执行添加操作的时候,这个方法就执行了
@Override
public void insertFill(MetaObject metaObject) {
//三个值,第一个是添加时要执行的属性名字,第二个是对应的值,第三个是MetaObject对象
this.setFieldValByName("crateTime",new Date(),metaObject);
}
//mp执行修改操作的时候,这个方法就执行了
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
4)、乐观锁(?)
主要适用场景:
当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁实现方式:
取出记录时,获取当前version。更新时,带上这个version,执行更新时, set version = newVersion where version = oldVersion,如果version不对,就更新失败,接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:
在表中添加字段作为版本号,在表对应实体类添加版本号属性
配置乐观锁的插件
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.wyf.demomptest.mapper") //这时候可以将主启动类中的MapperScan注解加到这里来
public class MpConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
标签:尚医通,学习,user,org,println,import,com,public 来源: https://blog.csdn.net/qq_51058681/article/details/121214023