Spring Boot 使用 Mybatis plus
程序员文章站
2022-07-15 10:14:11
...
一、添加pom依赖(pom.xml)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
二、修改配置文件(application.yml)
spring:
datasource:
# 数据库链接URL
url: jdbc:mysql://localhost:3306/db_xxx
# 数据库用户名密码
username: xxx
password: xxx
# 数据源 ps:可不配置,使用默认数据源
type: com.alibaba.druid.pool.DruidDataSource
mybatis-plus:
# mapper文件的路径
mapper-locations: classpath:mapper/*xml
# 实例类的包路径
type-aliases-package: com.example.xx.pojo
configuration:
# 字段名映射为表字段大小写 eg: 实体类中有 userName 对应表中的 user_name 列
map-underscore-to-camel-case: true
三、创建实体类(User.java)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
// 对应数据库中的表名
@TableName(value = "user")
// 表示在json序列化时忽略 密码 字段
@JsonIgnoreProperties({"passWord"})
public class User implements Serializable {
// 标识id为表中主键,并且自增
@TableId(type = IdType.AUTO)
private Long id;
private String userName;
private String passWord;
private String phoneNumber;
private String realName;
private String email;
private String note;
// mybatis自动填充时间,FieldFill.INSERT 表示插入时更新该字段
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 表示插入、修改时更新该字段
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
实体类当中使用了Lombok插件,自行导入
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
四、编写mapper接口 (UserMapper.java)
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
UserMapper中不需要写任何代码,继承BaseMapper<T>就可继承常用API。泛型T为实体类。
源码如下:
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
* <p>这个 Mapper 支持 id 泛型</p>
*
* @author hubin
* @since 2016-01-23
*/
public interface BaseMapper<T> extends Mapper<T> {
/**
* 插入一条记录
*
* @param entity 实体对象
*/
int insert(T entity);
/**
* 根据 ID 删除
*
* @param id 主键ID
*/
int deleteById(Serializable id);
/**
* 根据 columnMap 条件,删除记录
*
* @param columnMap 表字段 map 对象
*/
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,删除记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 删除(根据ID 批量删除)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 根据 ID 修改
*
* @param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根据 whereEntity 条件,更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
/**
* 根据 ID 查询
*
* @param id 主键ID
*/
T selectById(Serializable id);
/**
* 查询(根据ID 批量查询)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 查询(根据 columnMap 条件)
*
* @param columnMap 表字段 map 对象
*/
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,查询一条记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询总记录数
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
从源码可以看到这个和JPA很类似,甚至比JPA更加强大,常用的方法有:
int insert(T entity); 插入一条记录
int deleteById(Serializable id); 根据 ID 删除一条记录
int deleteBatchIds(Collection<? extends Serializable> idList); 删除(根据ID 批量删除)
int updateById(T entity); 根据 ID 修改
T selectById(Serializable id); 根据 ID 查询
List<T> selectBatchIds(Collection<? extends Serializable> idList); 查询(根据ID 批量查询)
其中还有分页插件,非常的银杏
五、测试
@SpringBootTest
public class MybatisPlusTest {
@Resource
private UserMapper userMapper;
@Test
void test() {
User user = User.builder()
.userName("张三")
.passWord("passWord")
.id(999L)
.build();
userMapper.insert(user);
user.setPassWord("1234");
userMapper.updateById(user);
User user1 = userMapper.selectById(999L);
System.out.println("user = " + user);
userMapper.deleteById(999L);
System.out.println("userMapper.selectById(999L) = " + userMapper.selectById(999L));
}
}
运行结果如下
user = User(id=999, userName=张三, passWord=1234, phoneNumber=null, email=null, note=null, createTime=Sun Mar 21 00:23:33 CST 2021, updateTime=Sun Mar 21 00:23:33 CST 2021)
userMapper.selectById(999L) = null
以上为mybatisplus的基本使用,如有复杂业务,仍可用xml方式进行配置