当前位置:网站首页>MP框架基本操作(自用)
MP框架基本操作(自用)
2022-06-10 22:50:00 【m0_61499313】
目录
前置 条件
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置信息 yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mp_db?characterEncoding=utf-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
启动类
@SpringBootApplication
@MapperScan("com.mapper")
public class SGApplication {
public static void main(String[] args) {
SpringApplication.run(SGApplication.class);
}
}
映射 问题
规则 表名
可以在实体类的类名上加上@TableName注解进行标识
如果表名是tb_user,而实体类名是User则可以使用以下写法。
@TableName("tb_user")
public class User {
//....
}规则 主键
例如:
我们要设置主键自动增长则可以设置如下
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@TableId(type = IdType.AUTO)
private Long id;
//.....
}
AUTO
数据库ID自增,依赖于数据库。该类型请确保数据库设置了 ID自增 否则无效
NONE
未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键全局策略是基于雪花算法的自增ID)
INPUT
需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null。
ASSIGN_ID
当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法
ASSIGN_UUID
当实体类的主键属性为空时,才会自动填充,使用UUID
设置字段映射关系
如果表中一个列名叫 address而 实体类中的属性名为addressStr则可以使用如下方式进行配置。
@TableField("address")
private String addressStr;MP 中 默认驼峰命名,userName --- user_name(数据库里)
基础使用
基础查询 没有 条件
XXXXXMapper.selectList(null)添加
Domain domain =new domain();
domain.set字段("");
XXmapper.insert(domain)删除
1 直接 根据id 删除
XXmapper.deteteByid(X);
2 创建 数组 删除
List<Integer> ids = new ArrayList<>();
ids.add(5);
ids.add(6);
ids.add(7);
int i = userMapper.deleteBatchIds(ids);
System.out.println(i);
Map<String, Object> map = new HashMap<>();
map.put("name","提姆");
map.put("age",22);
int i = userMapper.deleteByMap(map);
System.out.println(i);
}
修改
domain do = new domaim();
do.setid();
do.set字段();
mapper.update(do)条件选择器

QueryWrapper
常用条件
eq:equals,等于
gt:greater than ,大于 >
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相当于SQL中的BETWEEN
like:模糊匹配。like(“name”,“黄”),相当于SQL的name like ‘%黄%’
likeRight:模糊匹配右半边。likeRight(“name”,“黄”),相当于SQL的name like ‘黄%’
likeLeft:模糊匹配左半边。likeLeft(“name”,“黄”),相当于SQL的name like ‘%黄’
notLike:notLike(“name”,“黄”),相当于SQL的name not like ‘%黄%’
isNull
isNotNull
and:SQL连接符AND
or:SQL连接符OR
in: in(“age",{1,2,3})相当于 age in(1,2,3)
groupBy: groupBy(“id”,“name”)相当于 group by id,name
orderByAsc :orderByAsc(“id”,“name”)相当于 order by id ASC,name ASC
orderByDesc :orderByDesc (“id”,“name”)相当于 order by id DESC,name DESC
基本使用
QueryWrapper wrapper = new QueryWrapper();
wrapper.gt("XXX",XX);
wrapper.eq("address","狐山");
List<XXX> XXXX = XXXMapper.selectList(wrapper);
UpdateWrapper
基本使用
UpdateWrapper<XXX> updateWrapper = new UpdateWrapper<>();
updateWrapper.gt("id",1); 更新的范围
updateWrapper.set("age",99); 修改的数据
XXXXMapper.update(null,updateWrapper);
自定义方法(mapper 接口)
public interface UserMapper extends BaseMapper<User> {
User findMyUser(Long id);
}
XML 对应
<?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.sangeng.mapper.UserMapper">
<select id="findMyUser" resultType="com.sangeng.domian.User">
select * from user where id = #{id}
</select>
</mapper>
分页查询
准备 分页 插件
@Configuration
public class PageConfig {
/**
* 3.4.0之前的版本
* @return
*/
/* @Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}*/
/**
* 3.4.0之后版本
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
单表查询
public void testPage(){
IPage<XXX> page = new Page<>();
//设置每页条数
page.setSize(2);
//设置查询第几页
page.setCurrent(1);
userMapper.selectPage(page, null);
System.out.println(page.getRecords());//获取当前页的数据
System.out.println(page.getTotal());//获取总记录数
System.out.println(page.getCurrent());//当前页码
}多表查询
查询 A B 两个 表格 的 时候
补充一下 使用 mapper 中 对应的 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Orders {
//省略无关代码
private String userName;
} IPage<XXX> findAllOrders(Page<XXXX> XXXX);
public void testOrdersPage(){
Page<Orders> page = new Page<>();
//设置每页大小
page.setSize(2);
//设置当前页码
page.setCurrent(2);
ordersMapper.findAllOrders(page);
System.out.println(page.getRecords());
System.out.println(page.getTotal());
}
Service
改造前
public interface UserService {
List<User> list();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> list() {
return userMapper.selectList(null);
}
}
改造后
相比较之前 接口 会自带一些方法,基本的查询增删改查直接调用接口就可以完成。
public interface UserService extends IService<User> {
}@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}
@Autowired
private UserService userService;
@Test
public void testSeervice(){
List<User> list = userService.list();
System.out.println(list);
}
自定义方法
相比较mapper 接口里面的使用 ,没有什么区别
public interface UserService extends IService<User> {
User test();
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
@Autowired
private OrdersMapper ordersMapper;
@Override
public User test() {
UserMapper userMapper = getBaseMapper();
List<Orders> orders = ordersMapper.selectList(null);
User user = userMapper.selectById(3);
//查询用户对于的订单
QueryWrapper<Orders> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",3);
List<Orders> ordersList = ordersMapper.selectList(wrapper);
return user;
}
}
自动填充
使用 tablefield(fill = fiedfill.insert_update)
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
自定义填充处理器 MetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
// "字段",数据类型,value
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
逻辑删除
配置
yml
mybatis-plus:
global-config:
db-config:
logic-delete-field: delFlag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
删除后 delflag 的 默认值 会发生变化
结果

边栏推荐
- 【 pygame Games 】 don't find, Leisure Games Theme come 丨 Bubble Dragon applet - - Leisure Games Development recommendation
- Difference between oscilloscope and spectrum analyzer
- Leetcode-209 minimum length subarray
- 2022 college entrance examination quantitative paper | please answer the questions for quantitative candidates
- Typecho website speed optimization - Xingze V Club
- IGBT与三代半导体SiC双脉冲测试方案
- Openresty installation
- Self made app connected to onenet --- realize data monitoring and distribution control (mqtt)
- [pyGame games] interesting puzzle game: how many hamsters can you play? (source code attached)
- csdn每日一练——有序表的折半查找
猜你喜欢

Why is the website snapshot hijacked and tampered with

It is said that the verification code is a barrier in the crawler. I can break through it with only five lines of code.

【自动回复小脚本】新年快乐,每一个字都是我亲自手打的,不是转发哦~

LabVIEW phase locked loop (PLL)

【Pygame小游戏】首月破亿下载 一款高度融合了「超休闲游戏特性」的佳作~

【Turtle表白合集】“海底月是天上月,眼前人是心上人。”余生多喜乐,长平安~(附3款源码)

LabVIEW获取IMAQ Get Last Event坐标

In the month of safety production, Huangpu launched a publicity campaign for gas safety in shops

LabVIEW或MAX下的VISA测试面板中串口无法工作

csdn每日一练——有序表的折半查找
随机推荐
It is said that the verification code is a barrier in the crawler. I can break through it with only five lines of code.
Kubernetes 基本介绍及核心组件
Is the financial management of qiniu school reliable and safe
关于优化API接口响应速度
IGBT and third generation semiconductor SiC double pulse test scheme
Create millisecond time id in LabVIEW
LabVIEW获取IMAQ Get Last Event坐标
Openresty installation
Compared with the "South-to-North Water Transfer", what will the "east to west" of the fire bring to cloud computing?
【AI出牌器】第一次见这么“刺激”的斗地主,胜率高的关键因素竟是......
C language file operation
Method of converting file to multipartfile
[MVC&Core]ASP.NET Core MVC 视图传值入门
Basic introduction and core components of kubernetes
What is the workflow of dry goods MapReduce?
[pyGame games] here it is. This Gobang game is super A. share it with your friends~
30 | how to reset the consumer group displacement?
Hyperleger fabric installation
LabVIEW error "memory full - Application stopped on node"
[pyGame collection] please check the game guide through childhood: are there any games you have played? (attach five source codes for self access)