通用CRUD大全(Mybatis-Plus为我们提供了哪些操作)
还有在mybatis中遇到列名和属性名不一致等等的情况,在mybatis中xml中声明解决,在mybatis-plus中也都有对应的解决。
1.插入操作
//插入一条记录
//参数entity是实体对象
int insert(T entity)
【1】设置id生成策略数据写入数据库,但是id并不是我们希望的自增长,而是随机生成了id的值写入到了数据库。
我们就要设置id生成策略来解决这个问题。
MP支持的id策略:
package com.baomidou.mybatisplus.annotation;
//生成ID类型的枚举类
public enum IdType {
//数据库id自增
AUTO(0),
//该类型为未设置为主键类型
NONE(1),
//用户输入ID,该类型可以通过自己注册自动填充插件来进行填充
INPUT(2),
//基于雪花算法生成id
ASSIGN_ID(3),
//根据uuid类生成的id
ASSIGN_UUID(4);
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
用法是在实体类的对象id属性上添加注解:
@TableId(type = IdType.AUTO)
private Long id;
补充:
【1】MyBatis-Plus的ASSIGN_ID的特点如下:
1. 基于雪花算法:ASSIGN_ID使用了雪花算法(Snowflake),这是一种分布式唯一ID生成算法。每个ID由以下几部分组成:时间戳、数据中心ID、机器ID和序列号。
2. 分布式唯一性:雪花算法生成的ID在分布式环境下具有全局唯一性,可以保证不同机器和不同时间生成的ID都是唯一的。
3. 自增序列号:ASSIGN_ID根据预设的数据中心ID和机器ID,以及当前的时间戳生成一个唯一的ID。在同一毫秒内,根据自增序列号的递增规则,保证同一台机器上生成的ID是递增的。
4. 高性能:由于雪花算法的简单性和高效性,ASSIGN_ID的生成速度非常快,对数据库的性能影响较小。
5. 无需数据库支持:ASSIGN_ID是在应用程序层生成的,不依赖于特定数据库的自增功能,因此可以跨多种数据库使用。
总的来说,MyBatis-Plus的ASSIGN_ID通过雪花算法生成分布式唯一ID,具有高性能、高可用性和跨数据库的特点,非常适合在分布式系统中使用。
【2】MyBatis-Plus的ASSIGN_UUID的特点如下:
ASSIGN_UUID 是 MyBatis-Plus 提供的主键生成策略之一。它的特点是可以在程序中直接赋值给实体类的 ID 属性,而不需要像自增 ID 一样需要插入数据库后才能获取。
ASSIGN_UUID 主键生成策略通过 Java 的 UUID 类生成唯一的字符串作为主键,保证主键的唯一性,同时也保障了安全性,因为 UUID 是由时间戳、MAC 地址等多个信息组合而成的,因此极难被猜测出来。
使用 ASSGIN_UUID 可以方便地实现主键自动生成,并且不需要依赖数据库的自增 ID,使得应用更加灵活。同时,由于使用 UUID 作为主键,降低了分布式系统下主键冲突的风险。
【2】@TableField
(1)对象中的属性名和字段名不一致的问题(非驼峰)
@TableField(value = "email") //解决数据库中字段名与属性不一致
private String mail;
//又比如如果属性是studentId,那对应表要是student_id,如果不是就得使用这个注解。
(2)对象中的属性字段在表中不存在的问题
@TableField(exist = false)
private String address; //在数据库表中是不存在的
(3)字段不加入查询字段
@TableField(exist = false)
private String address; //在数据库表中是不存在的
2.更新操作
在Mybatis-Plus中更新操作有2种,一种是根据id更新,另一种是根据条件更新。
【1】根据id更新
定义:
//根据ID修改
//@param entity 实体对象
int updateById(T entity);
使用:
//根据id更新,更新不为null的字段
userMapper.updateById(user);
【2】根据条件更新
定义:
//根据whereEntity条件,更新记录
//@param entity 实体对象(set条件值,可以为null)
//@param updatewrapper 实体对象封装操作类(可以为null,里面的entity用于生成where语句)
int update(T entity,Wrapper<T> updateWrapper);
使用:
例1:
User user=new User();
user.setAge(22);//更新的字段
//更新的条件
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.eq("id",6);
//执行更新操作
int result=this.userMapper.update(user,wrapper);
System.out.println("result = "+result);
例2:
//更新的条件及字段
updateWrapper<User> wrapper=new UpdateWrapper<>();
wrapper.eq("id",6).set("age",23);
//执行更新操作
int result=this.userMapper.update(null,wrapper);
System.out.println("result = "+result);
3.删除操作
1.根据id删除
【1】deleteById
定义:int deleteById(Serializable id);
int result=this.userMapper.deleteById(6L);//Long类型的6
System.out.println("result = "+result);
【2】deleteBatchIds
定义:int deleteBatchIds(Collection<? extends Serializable> idList);
//根据id集合批量删除
int result=this.userMapper.deleteBatchIds(Arrays.asList(1L,10L,20L));
2.根据条件删除
【1】deleteByMap
定义:int deleteByMap(Map<String,Object> columnMap);
Map<String,Object> columnMap=new HashMap<>();
columnMap.put("age",20);
columnMap.put("name","张三");
//将columnMap中的元素设置为删除的条件,多个之间为and关系
int result=this.userMapper.deleteByMap(columnMap);
System.out.println("result = "+result);
【2】delete
定义:int delete(Wrapper<T> wrapper);
User user=new User();
user.setAge(20);
user.setName("张三");
//将实体对象进行包装,包装为操作条件
QueryWrapper<User> wrapper =new QueryWrapper<>(User);
int result=this.userMapper.delete(wrapper);
4.查询操作
1.根据id查询单条数据
定义:T selectById(Serializable id);
//根据id查询数据
User user=this.userMapper.selectById(2L);
2.根据id集合批量查询
定义://根据ID批量查询
List<T> selectBatchIds(Collection<? extends Serializable> idList);
//根据id集合批量查询
List<User> users=this.userMapper.selectBatchIds(Arrays.asList(2L,3L,10L));
for(User user:users){
System.out.println(user);
}
3.根据条件查询单条数据
定义:T selectOne(wrapper<T> queryWrapper);
QueryWrapper<User> wrapper =new QueryWrapper<User>();
wrapper.eq("name","李四");
//根据条件查询一条数据,如果结果超过一条会报错
User user = this.userMapper.selectOne(wrapper);
4.根据条件查询多条数据
定义:List<T> selectList(wrapper<T> queryWrapper);
QueryWrapper<User> wrapper=new QueryWrapper<User>();
wrapper.gt("age",23);//年龄大于23岁
//根据条件查询数据
List<User> users=this.userMapper.selectList(wrapper);
5.根据条件查询总记录数
定义:Integer selectCount(Wrapper<T> queryWrapper);
QueryWrapper<User> wrapper=new QueryWrapper<User>();
wrapper.gt("age",23);//年龄大于23岁
//根据条件查询数据条数
Integer count=this.userMapper.selectCount(wrapper);
6.分页查询
定义:IPage<T> selectPage(IPage<T> page,Wrapper<T> queryWrapper);
例:
配置分页插件[一定要配置分页插件]:
@Configuration
@MapperScan("cn.itcast.mp.mapper")
public class MybatisPlusConfig {
//分页插件
@Bean
public PaginationInnerInterceptor paginationInnerInterceptor() {
return new PaginationInnerInterceptor();
}
}
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class TestMybatisSpringBoot {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectPage(){
QueryWrapper<User> wrapper=new QueryWrapper<User>();
wrapper.gt("age",20);
Page<User> page=new Page<>(1,1);
//根据条件查询数据
IPage<User> iPage=this.userMapper.selectPage(page,wrapper);
System.out.println("数据总条数:"+iPage.getTotal());
System.out.println("总页数:"+iPage.getPages());
List<User> users=iPage.getRecords();
for(User user:users){
System.out.println("user = "+user);
}
}
}