Java--MybatisPlus日志;CRUD用法;Active Record(AR)
Posted MinggeQingchun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java--MybatisPlus日志;CRUD用法;Active Record(AR)相关的知识,希望对你有一定的参考价值。
阅读前可先参考
https://blog.csdn.net/MinggeQingchun/article/details/126521908
一、配置Mybatis-Plus控制台输出日志
在application.yml 配置文件中添加如下配置
#Mybatis-Plus输出日志
mybatis-plus:
configuration:
# 日志输出到控制台
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
查看控制台如下:
注:此配置只是将日志输出到控制台
二、CRUD用法
CRUD的操作是来自BaseMapper中的方法。BaseMapper 中共有19 个方法,CRUD操作都有多个不同参数的方法。继承BaseMapper就可以使用其中的方法
BaseMapper方法列表:
public interface BaseMapper<T> extends Mapper<T>
int insert(T entity);
int deleteById(Serializable id);
int deleteById(T entity);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> queryWrapper);
int deleteBatchIds(@Param("coll") Collection<?> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
default T selectOne(@Param("ew") Wrapper<T> queryWrapper)
List<T> ts = this.selectList(queryWrapper);
if (CollectionUtils.isNotEmpty(ts))
if (ts.size() != 1)
throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records", new Object[0]);
else
return ts.get(0);
else
return null;
default boolean exists(Wrapper<T> queryWrapper)
Long count = this.selectCount(queryWrapper);
return null != count && count > 0L;
Long selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param("ew") Wrapper<T> queryWrapper);
1、insert操作
insert()返回 int 值,表示数据插入成功的行数;且插入成功后可以获取到主键ID
@Test
void testInsert()
User user = new User();
user.setName("wangwu");
user.setEmail("wangwu@163.com");
user.setAge(18);
//调用UserMapper的方法, 也就是父接口BaseMapper中的提供的方法
//INSERT INTO user ( name, email, age ) VALUES ( ?, ?, ? )
int rows = userMapper.insert(user);
//插入成功后会拿到主键ID
int userId = user.getId();
System.out.println("insert 的结果:" + rows + "----userId:" + userId);
2、update操作
@Test
void testUpdate()
User user = new User();
user.setName("zhangsan22");
user.setId(1);
//UPDATE user SET name=? WHERE id=?
int rows = userMapper.updateById(user);
System.out.println("update 的结果:" + rows);
注:
字段值为 null 不进行更新
实体类中如果是Java的基本数据类型,即使不进行传参更新操作,也会将其更新为默认值,如 age = 0
private int age; // 0
因此,可以将基本数据类型更改为包装类型,可以判断是否为null
//实体类属性,推荐使用包装类型, 可以判断是否为 null
private Integer age; // 0
3、select操作
(1)SelectById();根据主键ID查询
//select
@Test
void testSelectById()
//SELECT id,name,email,age FROM user WHERE id=?
User user = userMapper.selectById(6);
System.out.println("testSelectById 的结果:" + user);
查询结果为空,不会报错
(2)selectBatchIds 根据主键ID批量查询
//select
@Test
void testSelectBatchIds()
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
//SELECT id,name,email,age FROM user WHERE id IN ( ? , ? )
List<User> userList = userMapper.selectBatchIds(ids);
System.out.println("testSelectBatchIds 的结果:" + userList.size());
(3)selectByMap() 根据Map查询
//select
@Test
void testSelectByMap()
Map<String ,Object> map = new HashMap<>();
//注:map中存放的 key 必须是数据库中对应的 列名字段,不然报错
map.put("name","zhangsan");
map.put("age",20);
//SELECT id,name,email,age FROM user WHERE name = ? AND age = ?
List<User> userList = userMapper.selectByMap(map);
System.out.println("testSelectBatchIds 的结果:" + userList.size());
注:map中存放的 key 必须是数据库中对应的 列名字段,不然报错
4、delete操作
(1)deleteById();根据主键ID删除
//delete
@Test
void testDeleteById()
//DELETE FROM user WHERE id=?
int rows = userMapper.deleteById(6);
System.out.println("testDeleteById 的结果:" + rows);
(2)deleteBatchIds();批量删除
//delete
@Test
void testDeleteBatchIds()
List<Integer> ids = new ArrayList<>();
ids.add(6);
ids.add(8);
//DELETE FROM user WHERE id IN ( ? , ? )
int rows = userMapper.deleteBatchIds(ids);
System.out.println("testDeleteBatchIds 的结果:" + rows);
(3)deleteByMap():根据map删除
//delete
@Test
void testDeleteByMap()
Map<String ,Object> map = new HashMap<>();
//注:map中存放的 key 必须是数据库中对应的 列名字段,不然报错
//SELECT id,name,email,age FROM user WHERE name = ? AND age = ?
map.put("name","zhangsan");
map.put("age",28);
//DELETE FROM user WHERE name = ? AND age = ?
int rows = userMapper.deleteByMap(map);
System.out.println("testDeleteByMap 的结果:" + rows);
三、Active Record(AR)
AR模式是一种活动记录,领域模型模式
特点是一个模型类,对应关系型数据库中的一个表
模型类的一个实例,对应表中的一行记录
简单来说就是通过实体类对象,对表进行增删改查操作,方便开发
1、新建一张 dept 表
DROP TABLE IF EXISTS dept;
CREATE TABLE dept(
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name varchar(50) NULL DEFAULT NULL COMMENT '部门',
mobile varchar(50) NULL DEFAULT NULL COMMENT '电话',
manager int(11) NULL DEFAULT NULL COMMENT '主管ID',
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
ENGINE=InnoDB使用InnoDB引擎,InnoDB,是mysql的数据库引擎之一,为MySQL AB发布binary的标准之一
DEFAULT CHARSET=utf8 数据库默认编码为utf-8
2、新建 entity 实体类
/**
* 使用AR,要求实体类需要继承MP中的Model
* Model中提供了对数据库的CRUD的操作
*/
@Data
public class Dept extends Model<Dept>
//定义属性, 属性名和表的列名一样
//uuid
@TableId(value = "id",type = IdType.AUTO)
private String id;
private String name;
private String mobile;
private Integer manager;
注:
使用AR,实体类需要继承Mybatis-Plus中的Model,Model中提供了对数据库的CRUD的操作
3、 mapper类
/**
* DeptMapper是不需要使用的,MP需要使用DeptMapper获取到数据库的表的信息
* 如果不定义DeptMapper, MP会报错, 找不到表的定义信息
*/
public interface DeptMapper extends BaseMapper<Dept>
注:
DeptMapper是不需要使用的,MP需要使用DeptMapper获取到数据库的表的信息
如果不定义DeptMapper, MP会报错, 找不到表的定义信息
com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: com.company.entity.Dept Not Found TableInfoCache.
1、AR之insert
@Test
public void testARInsert()
Dept dept = new Dept();
dept.setName("人资行政部");
dept.setMobile("021-45646546");
dept.setManager(1);
//INSERT INTO dept ( name, mobile, manager ) VALUES ( ?, ?, ? )
boolean result = dept.insert();
System.out.println("testARInsert 的结果:" + result);
2、AR之update
字段值为 null 不进行更新
@Test
public void testARUpdate()
Dept dept = new Dept();
dept.setName("人资部");
dept.setId(1);
//UPDATE dept SET name=? WHERE id=?
boolean result = dept.updateById();
System.out.println("testARUpdate 的结果:" + result);
3、AR之select
@Test
public void testASelectById()
Dept dept = new Dept();
dept.setId(1);
//SELECT id,name,mobile,manager FROM dept WHERE id=?
Dept selectDept = dept.selectById();
System.out.println("testASelectById 的结果:" + selectDept);
对象封装主键ID,调用selectById()方法无参数;
没有查到结果,返回 null;
不传主键ID,报错如下
com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: selectById primaryKey is null.
或者对象不封装主键ID,selectById(1)中传参
@Test
public void testASelectById1()
Dept dept = new Dept();
//SELECT id,name,mobile,manager FROM dept WHERE id=?
Dept selectDept = dept.selectById(1);
System.out.println("testASelectById1 的结果:" + selectDept);
4、AR之delete
@Test
public void testARDelete()
Dept dept = new Dept();
//DELETE FROM dept WHERE id=?
boolean result = dept.deleteById(1);
System.out.println("testARDelete 的结果:" + result);
以上是关于Java--MybatisPlus日志;CRUD用法;Active Record(AR)的主要内容,如果未能解决你的问题,请参考以下文章
第120天学习打卡(MyBatisPlus 概述 特性 入门 配置日志 CRUD扩展 乐观锁)
Java--MybatisPlus入门;与Mybatis区别;简单使用
Java--MybatisPlus Wrapper构造器;分页;MP代码生成器
JavaLearn#(26)MyBatis基础:认识框架MyBatis环境搭建基本CRUD配置文件日志管理别名属性文件ThreadLocal保存sqlSession本地DTD模板
JavaLearn#(26)MyBatis基础:认识框架MyBatis环境搭建基本CRUD配置文件日志管理别名属性文件ThreadLocal保存sqlSession本地DTD模板