会当凌绝顶,一览众山小
| @Author:TTODS
MyBatisPlus框架系列文章目录:
-
MyBatisPlus Mapper层的CRUD(当前)
-
[MyBatisPlus之代码生成器(近期发布)]
前言
在<<Springboot整合Mybatisplus>>的例子中我们使用了UserMapper
的selectById
方法,但是我们并没有实现这个方法,也没有写xml文件。这是因为我们继承了mybatis-plus提供的通用Mapper接口BaseMapper<T>
.
Mybatis-plus通过BaseMapper<T>
接口提供了Mapper层基本的增删改查操作。本文我们继续来看一下这个BaseMapper<T>
提供了哪些CRUD方法,以及如何使用这些方法.
insert方法
-
insert
int insert(T entity);// 插入一条记录
@Test public void testInsert(){ // 新建一个对象 User user = new User(); user.setName("Frank"); user.setAge(35); user.setGender(1); user.setEmail("frank@gmail.com"); // 调用插入方法(执行出错请往下看) userMapper.insert(user); }
报错:Could not set property ‘id’ of ‘class com.example.pojo.User’ with value ‘1452179065226420225’
原因是我们没有为user对象设置id的值,虽然我们在数据库中设置了其为自增字段,但是Mybatis-plus不知道,所以 自作主张的设置了一个随机值,我们为User类中的id字段添加
@TableId
注解,并将其type属性设置为IdType.Auto
.告诉mybatis-plus这个字段是表的主键,且该主键设置了自增.@Data public class User { @TableId(type = IdType.AUTO) private Integer id; private String name; private Integer age; private Integer gender; private String email; }
再次运行测试代码,即可运行成功。
检查数据库,成功插入。
delete方法
int deleteById(Serializable id); //根据 ID 删除
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); //根据 columnMap 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); // 根据 entity 条件,删除记录
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 删除(根据ID 批量删除)
关于delete方法的使用请对照下文的select方法。
update方法
int updateById(@Param(Constants.ENTITY) T entity); // 根据 ID 修改
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); //根据 whereEntity 条件,更新记录
-
updateById
@Test public void testUpdateById(){ // 将id为1的用户年龄加1 User user = userMapper.selectById(1); Integer age = user.getAge(); user.setAge(age +1); userMapper.updateById(user); }
生成的sql语句及输出:
==> Preparing: SELECT id,name,age,gender,email FROM user WHERE id=? ==> Parameters: 1(Integer) <== Total: 1 ==> Preparing: UPDATE user SET name=?, age=?, gender=?, email=? WHERE id=? ==> Parameters: Alice(String), 16(Integer), 0(Integer), alice@gmail.com(String), 1(Integer) <== Updates: 1
查看数据库,修改成功。
-
update
@Test public void testUpdate(){ // 将id为1的用户年龄加1 User user = userMapper.selectById(1); UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.set("age",user.getAge()+1).eq("id",1); userMapper.update(null,wrapper); }
生成的sql语句及输出:
==> Preparing: SELECT id,name,age,gender,email FROM user WHERE id=? ==> Parameters: 1(Integer) <== Total: 1 ==> Preparing: UPDATE user SET age=? WHERE (id = ?) ==> Parameters: 17(Integer), 1(Integer) <== Updates: 1
查看数据库,修改成功。
关于Wrapper的更多信息请查阅官方文档
select方法
T selectById(Serializable id); //根据 ID 查询
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 查询(根据ID 批量查询)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); //查询(根据 columnMap 条件)
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); //根据 entity 条件,查询一条记录
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); //根据 Wrapper 条件,查询总记录数
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 根据 entity 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); //根据 Wrapper 条件,查询全部记录
/**
* 根据 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);
mybatis-plus提供的select操作可以分为几个大类:基于Id的、基于Map的、基于Wrapper条件的还有包含分页功能的。
基于id的select方法
-
selectById
@Test public void testSelectById(){ userMapper.selectById(1); System.out.println(userMapper); }
生成的sql语句及输出:
==> Preparing: SELECT id,name,age,gender,email FROM user WHERE id=? ==> Parameters: 1(Integer) <== Total: 1 User(id=1, name=Alice, age=15, gender=0, email=alice@gmail.com)
-
selectBatchIds
@Test public void selectBatchIds(){ List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3, 4)); for (User user : users) { System.out.println(user); } }
生成的sql语句及输出:
==> Preparing: SELECT id,name,age,gender,email FROM user WHERE id IN ( ? , ? , ? , ? ) ==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer) <== Total: 4 User(id=1, name=Alice, age=15, gender=0, email=alice@gmail.com) User(id=2, name=Bob, age=18, gender=1, email=bob@gmail.com) User(id=3, name=Colin, age=12, gender=1, email=colin@gmail.com) User(id=4, name=David, age=25, gender=1, email=david@gmail.com)
基于Map的select方法
作为参数的Map应该是一个<String,Object>
的Map,key
表示字段名,value
表示对应字段的值。Map将被拼接成形如
select field1,field2 ... from tableName where `key1`=value and `key2`=value2 ...
的sql语句。
-
selectByMap
@Test public void testSelectByMap(){ // 查询表中的性别为男(gender 字段为 1)的用户 HashMap<String, Object> conditions = new HashMap<>(); conditions.put("gender",1); List<User> users = userMapper.selectByMap(conditions); for (User user : users) { System.out.println(user); } }
生成的sql语句及输出:
==> Preparing: SELECT id,name,age,gender,email FROM user WHERE gender = ? ==> Parameters: 1(Integer) <== Total: 4 User(id=2, name=Bob, age=18, gender=1, email=bob@gmail.com) User(id=3, name=Colin, age=12, gender=1, email=colin@gmail.com) User(id=4, name=David, age=25, gender=1, email=david@gmail.com) User(id=6, name=Frank, age=35, gender=1, email=frank@gmail.com)
基于Wrapper的select方法
Wrapper
是mybatis-plus中非常强大的条件选择器,我们可以使用wrapper
来构造一些比较否则的sql语句。
-
selectList
@Test public void testSelectTestByQueryMapper(){ // 查询表中 年龄大于16岁的男性(gender字段为1)用户 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("gender",1).gt("age",16); List<User> users = userMapper.selectList(wrapper); for (User user : users) { System.out.println(user); } }
生成的sql语句及输出:
==> Preparing: SELECT id,name,age,gender,email FROM user WHERE (gender = ? AND age > ?) ==> Parameters: 1(Integer), 16(Integer) <== Total: 3 User(id=2, name=Bob, age=18, gender=1, email=bob@gmail.com) User(id=4, name=David, age=25, gender=1, email=david@gmail.com) User(id=6, name=Frank, age=35, gender=1, email=frank@gmail.com)
关于Wrapper的更多信息请查阅官方文档
包含分页功能的select
上一篇:Springboot整合MybatisPlus
下一篇:MyBatisPlus Service层的CRUD