MP的BaseMapper接口
我们的UserMapper之所以有那么多现成的方法,得益于继承了MP的BaseMapper接口。该接口的方法如下:
可以看到,基本我们常用的增删改查都在这个接口中定义了。这里可以看看MP的架构来帮助理解为什么继承了接口就能有一堆好用的方法了。
主要看左侧这块,MP会扫描Entity类,通过反射提取,能分析出表和相对应的字段值,然后改造成增删改查的sql语句,注入到Mybatis的中完成最终的sql操作。
这里可以把MP想象成一个AOP,当执行insert,update,delete,select方法时,切面发现你要执行相应的sql语句,然后分析entity类,把它拼接成要执行的sql语句交给mybatis来执行;然后还能把mybatis执行的结果通过AOP方式再转换成想要的最终结果。
基本的增删改查测试
这里先不测试Warpper【包装器】相关的方法。单独放到后面章节来测试。
1.插入方法
就一个插入方法。这个插入方法,比以前用到的框架有个好的地方,就是表的id字段名不用再叫id了。比如可以叫userid,orderid等都是可以的。而且插入后都能回填回来的。
@Test
public void testInsert() {
User user = new User();
user.setName("李四");
user.setAge(24);
user.setEmail("[email protected]");
user.setAddress("北京海淀");
int result = this.userMapper.insert(user);
System.out.println("打印插入结果===>" + result);
System.out.println("打印插入后user的id值===>" + user.getId());
}
//sql语句
==> Preparing: INSERT INTO user ( name, age, email, address ) VALUES ( ?, ?, ?, ? )
==> Parameters: 李四(String), 24(Integer), lisi@163.com(String), 北京海淀(String)
2.删除方法
@Test
public void testDelete() {
//通过id删除记录
this.userMapper.deleteById(1);
//通过id删除记录,传入对象方式
User user = new User();
user.setId(2L);
this.userMapper.deleteById(user);
//批量删除id的方式
List<Long> idList = Arrays.asList(1L, 2L);
this.userMapper.deleteBatchIds(idList);
//通过map条件删除记录
Map<String,Object> condition = new HashMap<>();
condition.put("name","李四");
condition.put("age", 24);
this.userMapper.deleteByMap(condition);
}
//sql语句
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 1(Integer)
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 2(Long)
==> Preparing: DELETE FROM user WHERE id IN ( ? , ? )
==> Parameters: 1(Long), 2(Long)
==> Preparing: DELETE FROM user WHERE name = ? AND age = ?
==> Parameters: 李四(String), 24(Integer)
3.修改方法
因为上面删除了所有记录,再测试该方法前,加入了张三、李四两条记录

@Test
public void testUpdate() {
//通过id来修改,传入对象方式
User user = new User();
user.setId(3L);
user.setName("李四222");
user.setAddress("北京海淀222");
this.userMapper.updateById(user);
}
//sql语句
==> Preparing: UPDATE user SET name=?, address=? WHERE id=?
==> Parameters: 李四222(String), 北京海淀222(String), 3(Long)
4.查询方法
@Test
public void testSearch() {
//通过id查询
User user = this.userMapper.selectById(3L);
System.out.println(user);
//通过id进行批量查询
List<User> users = this.userMapper.selectBatchIds(Arrays.asList(3L, 4L));
users.forEach(System.out::println);
//通过map条件进行查询
Map<String, Object> condition = new HashMap<>();
condition.put("name", "张三");
condition.put("email", "[email protected]");
users = this.userMapper.selectByMap(condition);
users.forEach(System.out::println);
}
//sql语句
==> Preparing: SELECT id,name,age,email,address,createtime,updatetime FROM user WHERE id=?
==> Parameters: 3(Long)
==> Preparing: SELECT id,name,age,email,address,createtime,updatetime FROM user WHERE id IN ( ? , ? )
==> Parameters: 3(Long), 4(Long)
==> Preparing: SELECT id,name,age,email,address,createtime,updatetime FROM user WHERE name = ? AND email = ?
==> Parameters: 张三(String), zhangsan@163.com(String)