mybatis-plus插件的使用
这里只介绍简单使用, 更多详细信息请参考:
官方手册离线版: [点击下载]
入门程序
1. 导入依赖
mybatis 和 mybatis-plus不能同时存在
maven地址:https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter
2. pojo对象
主要注解:
@TableName("表明")
将对象与表明关联, 参数为数据库表名
@TableId()
定义主键信息, 参数为枚举类型IdType
@TableField("")
标识字段与属性的映射关系(驼峰命名), 如果名字相同则可以省略
@Data
@TableName("user") // 将对象与表明关联, 参数为数据库表名
@Accessors(chain = true)
public class User {
@TableId(type = IdType.AUTO) // 定义主键信息
private Integer id;
@TableField(value = "name") // 标识字段与属性的关联关系
private String name;
private Integer age;
private String sex;
}
3. dao接口, 继承BaseMapper接口
如果启动类上有了mapper的自动扫描注解, 例如@MapperScan("com.jt.demo.mapper")
, 可不写@Mapper
注解
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
4. YML的配置
其中数据源的配置是必不可少的, 其他可不写(看需求)
mybatis的配置前缀改为mybatis-plus, 如下:
spring:
datasource:
# driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: 123456
#切换为Mybatisplus的配置
mybatis-plus:
# 定义别名包
type-aliases-package: com.jt.demo.pojo
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#引入sql日志输出
logging:
level:
com.jt.demo.mapper: debug
5. 测试
@Autowired
private UserMapper userMapper;
@Test
public void select() {
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
结果: 查询到了所有的user
核心API
insert
返回值 | 方法 | 说明 |
---|---|---|
int | insert(T entity); |
插入一条记录 |
delete
返回值 | 方法 | 说明 |
---|---|---|
int | deleteById(Serializable id); |
根据 ID 删除 |
int | deleteByMap(Map<String, Object> columnMap); |
根据 columnMap 条件,删除记录 |
int | delete(Wrapper<T> wrapper); |
根据 entity 条件,删除记录 wrapper为实体对象封装操作类 (可以为 null) |
int | deleteBatchIds(Collection idList); |
删除(根据ID 批量删除) 参数为集合 idList 主键ID列表 (不能为 null 以及 empty) |
update
返回值 | 方法 | 说明 |
---|---|---|
int | updateById( T entity); |
根据 ID 修改 |
int | update(@Param(T entity, Wrapper<T> updateWrapper); |
根据 whereEntity 条件, 更新记录 updateWrapper为 实体对象封装操作类 (可以为 null,里面的 entity 用于生成 where 语句) |
select
返回值 | 方法 | 说明 |
---|---|---|
T (泛型) | selectById(Serializable id); |
根据 ID 查询 |
List |
selectBatchIds(Collection idList); |
查询 (根据ID 批量查询) 参数为一个集合类型 |
List |
selectByMap(Map<String, Object> columnMap); |
查询( 根据 columnMap 条件) |
T (泛型) | selectOne(Wrapper<T> queryWrapper); |
根据 entity 条件, 查询一条记录 queryWrapper为实体对象 封装操作类 (可以为 null) |
Integer | selectCount(Wrapper<T> queryWrapper); |
根据 Wrapper 条件, 查询总记录数 |
List |
selectList(Wrapper<T> queryWrapper); |
根据 Wrapper条件, 查询全部记录 |
List<Map<String, Object>> | selectMaps(Wrapper<T> queryWrapper); |
根据 Wrapper 条件, 查询全部记录 |
List | selectObjs(Wrapper<T> queryWrapper); |
根据 Wrapper 条件, 查询全部记录 注意: 只返回第一个字段的值 |
IPage |
selectPage(IPage<T> page,Wrapper<T> queryWrapper); |
根据 entity 条件, 查询全部记录(并翻页) |
IPage<Map<String, Object>> | selectMapsPage(IPage<T> page,Wrapper<T> queryWrapper); |
根据 Wrapper 条件,查询全部记录(并翻页) page为分页查询条件 queryWrapper为实体对象封装操作类 |
案例
用户入库操作
注意事项: MP操作时, 将对象中不为null的数据,当做执行要素
@Test
public void insert() {
User user = new User();
user.setName("特朗普");
user.setAge(60);
user.setSex("男");
int rows = userMapper.insert(user);
System.out.println(rows);
}
条件查询1
查询name="特朗普"的用户
@Test
public void select01() {
// 定义条件构造器 动态拼接where条件之后的数据
User user = new User();
user.setName("特朗普");
// where name = "xxxx"
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
条件查询2
查询sex="女" age > 200 的用户
@Test
public void select02() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sex", "女");
queryWrapper.gt("age", 200);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
条件查询3
查询name中包含"精"的用户 like
@Test
public void select03() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "精"); // "%精%" 包含精
// queryWrapper.likeLeft("name", "精"); // "%精" 以精字结尾
// queryWrapper.likeRight("name", "精"); // "%精" 以精字开头
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
条件查询4
查询age位于 18-30之间, 并且要求性别 "男"
@Test
public void select04() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 18, 35).eq("sex", "男");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
条件查询5
查询name不为空, 并且根据age降序排序,如果age相同则按照sex排序
@Test
public void select05() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNotNull("name").orderByDesc("age", "sex");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
条件查询6
批量查询数据 要求查询id = 1, 3, 5, 8
@Test
public void select07() {
// 1. idList 自己进行封装
// List<Integer> idList = new ArrayList<>();
// idList.add(1);
// idList.add(3);
// idList.add(5);
// idList.add(8);
// 2. Id的信息一般都是由前端进行传递, 所以一般都是竖着格式
// 一般在定义数组格式时, 最好采用对象类型
Integer[] ids = { 1, 3, 5, 8 };
// 将数组转为集合
List<Integer> idList = Arrays.asList(ids);
List<User> userList = userMapper.selectBatchIds(idList); // in 语法
System.out.println(userList);
}
条件查询7
查询记录总数 name不为空的记录总数
@Test
public void select08() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNotNull("name");
int count = userMapper.selectCount(queryWrapper);
System.out.println(count);
}
条件查询8
查询记录总数 name不为空的记录总数
@Test
public void delete() {
userMapper.deleteById(null);
}
条件查询9
根据id查询
@Test
public void select06() {
// 根据主键进行查询 返回值结果单个对象
User user = userMapper.selectById(1);
System.out.println(user);
}
根据id修改
@Test
public void update01() {
// 根据主键更新, 要求对象中必须传递主键的信息
User user = new User();
user.setId(53);
user.setName("奥巴马");
user.setAge(66);
user.setSex("男");
userMapper.updateById(user);
}
根据条件修改
将name=null的用户信息name改为="测试案例" sex="男" age=1
@Test
public void update02() {
User user = new User();
user.setName("测试案例");
user.setSex("男");
user.setAge(1);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.isNull("name");
userMapper.update(user, updateWrapper);
}