image.png
image.png
插入记录代码

package com.itheima.test;

import com.itheima.dao.UserMapper;
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class TestMybatisPlus02 {

  1. @Autowired<br /> private UserMapper userMapper;
  2. /**<br /> * 添加:<br /> * 在添加数据信息时,如果没有提供id的值,则id由MybatisPlus自动维护<br /> * 添加成功后,会自动将新增的数据的id回填到当前对象中.<br /> */<br /> @Test<br /> public void testInsert(){<br /> //User user = new User();<br /> //user.setUserName("damimi");<br /> //user.setAge(18);<br /> //user.setName("大幂幂");<br /> //user.setPassword("666");<br /> //user.setEmail("damimi@qq.com");<br /> // 使用java的构建者模式,帮我们创建对象<br /> User user = User.builder()<br /> .userName("liuyan")<br /> .age(38)<br /> .name("柳岩")<br /> .email("liuyan@itcast.cn")<br /> .password("123")<br /> .build();<br /> int i = userMapper.insert(user);<br /> if (i>0) {<br /> System.out.println("添加成功");<br /> }<br /> System.out.println(user);<br /> }<br />}

image.png
主键生成策略:
是指为数据库生成主键的方式,我们前面学的数据库主键自增也是一种生成主键的策略,当然除了数据库服务端帮助我们维护主键之外,客户端也可以对主键值进行生成维护。

MP主键生成策略示例:
package com.itheima.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
// @TableName: 指定当前对象对应的数据库表
@TableName(“tb_user”)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {

  1. /**<br /> * @TableId: 指定当前表的主键<br /> * value: 建立数据库主键字段与实体字段的对应关系<br /> * type: 设置主键生成策略,<br /> * 默认情况下使用雪花算法<br /> * IdType.AUTO:使用数据库的主键自增<br /> */<br /> @TableId(type = IdType.AUTO)<br /> private Long id;<br /> private String userName;<br /> private String password;<br /> private String name;<br /> private Integer age;<br /> private String email;<br />}

image.png
image.png

package com.itheima.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
// @TableName: 指定当前对象对应的数据库表
@TableName(“tb_user”)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {

  1. /**<br /> * @TableId: 指定当前表的主键<br /> * value: 建立数据库主键字段与实体字段的对应关系<br /> * type: 设置主键生成策略,<br /> * IdType.NONE/ASSIGN_ID:默认情况下使用雪花算法<br /> * IdType.AUTO:使用数据库的主键自增<br /> * ASSIGN_UUID:使用UUID生成一个全局唯一字符串<br /> */<br /> @TableId(type = IdType.AUTO)<br /> private Long id;<br /> private String userName;<br /> private String password;<br /> // 建立数据库字段与实体字段的对应关系 @TableField("与数据库字段名对应")<br /> @TableField("t_name")<br /> private String name;<br /> private Integer age;<br /> // 忽略此字段<br /> @TableField(exist = false)<br /> private String email;<br />}

@Test
public void test04(){
// 创建用户对象
User user = User.builder()
//.id(666L) // 当设置id时,则使用设置的值
.userName(“damimi”)
.name(“大幂幂999”)
.age(18)
.email(“damimi@qq.com”)
.password(“666”)
.build();
int i = userMapper.insert(user);
if (i>0){
System.out.println(“添加成功…”);
}
}
image.png

image.png

/
根据id删除
/
@Test
public void testDelete1(){
int i = userMapper.deleteById(1448842113843228674L);
if (i>0) {
System.out.println(“删除成功”);
}
}
/

批量删除
/
@Test
public void testDelete2(){
ArrayList list = new ArrayList<>();
list.add(1448841494474530818L);
list.add(1448839707025780737L);
int i = userMapper.deleteBatchIds(list);
if (i>0) {
System.out.println(“删除成功”);
}
}

  1. /**<br /> * 根据条件删除<br /> */<br /> @Test<br /> public void testDelete3(){<br /> // 将删除的条件设置到map集合中<br /> Map<String, Object> map = new HashMap<>();<br /> // map的键为数据库字段名<br /> //map.put("id",1448832902639939586L);<br /> map.put("user_name","damimi");<br /> int i = userMapper.deleteByMap(map);<br /> if (i>0) {<br /> System.out.println("删除成功");<br /> }<br /> }

image.png
/*
修改用户信息
*/
@Test
public void testUpdate(){
// 构建修改后的数据信息
User user = User.builder()
.id(2L)
.userName(“liuyan”)
.password(“6669”)
.name(“柳岩”)
.age(18)
.email(“liuyan@qq.com”)
.build();
int i = userMapper.updateById(user);
System.out.println(i>0?”修改成功”:”修改失败”);
}

image.png

MP实现分页查询

1.配置分页拦截器
package com.itheima.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/*
@Description:
@Version: V1.0
/
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,-1不受限制
paginationInterceptor.setMaxLimit(-1L);
interceptor.addInnerInterceptor(paginationInterceptor);
return interceptor;
}
}

查询测试
package com.itheima;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class UserMapperQueryTest {

  1. @Autowired<br /> private UserMapper userMapper;
  2. /**<br /> * 分页查询<br /> */<br /> @Test<br /> public void testPage(){<br /> // 创建分页对象<br /> IPage<User> page = new Page<>(2, 3);<br /> IPage<User> userPage = userMapper.selectPage(page, null);<br /> System.out.println(page==userPage);
  3. // 获取分页数据信息<br /> List<User> userList = page.getRecords();<br /> for (User user : userList) {<br /> System.out.println(user);<br /> }<br /> // 当前页<br /> long current = page.getCurrent();<br /> // 每页显示条数<br /> long size = page.getSize();<br /> // 总条数<br /> long total = page.getTotal();<br /> // 总页数<br /> long pages = page.getPages();<br /> System.out.println(current);<br /> System.out.println(size);<br /> System.out.println(total);<br /> System.out.println(pages);<br /> }<br />}

image.png
image.png

查询测试
/*
查询用户中姓名包含”伤”,密码为”123456”,且年龄为19或者25或者29,查询结果按照年龄降序排序;
*/
@Test
public void testFind1(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like(“user_name”,”伤”)
.eq(“password”,”123456”)
.in(“age”,19,25,29)
.orderByDesc(“age”);
// 查询所有
//List list = userMapper.selectList(null);
List list = userMapper.selectList(wrapper);
for (User user : list) {
System.out.println(user);
}
}

image.png

/*
查询用户名为”liuyan”或者年龄大于23的用户信息;
*/
@Test
public void testFind2(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq(“user_name”,”liuyan”)
.or()
.gt(“age”,23);
// 查询所有
//List list = userMapper.selectList(null);
List list = userMapper.selectList(wrapper);
for (User user : list) {
System.out.println(user);
}
}

image.png

/*
模糊查询
*/
@Test
public void testFind3(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like(“user_name”,”伤”);
// 查询所有
//List list = userMapper.selectList(null);
List list = userMapper.selectList(wrapper);
for (User user : list) {
System.out.println(user);
}
}

image.png
测试代码
/*
排序查询
*/
@Test
public void testFind4(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.orderByAsc(“age”).orderByDesc(“id”);
// 查询所有
//List list = userMapper.selectList(null);
List list = userMapper.selectList(wrapper);
for (User user : list) {
System.out.println(user);
}
}

image.png
/*
指定查询字段
*/
@Test
public void testFind5(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.orderByAsc(“age”).orderByDesc(“id”).select(“id”,”user_name”,”age”);
// 查询所有
//List list = userMapper.selectList(null);
List list = userMapper.selectList(wrapper);
for (User user : list) {
System.out.println(user);
}
}

image.png

/*
分页查询
*/
@Test
public void testFind6(){
// 创建分页对象
IPage page = new Page<>(1, 3);
// 拼接分页条件
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like(“user_name”,”伤”);
userMapper.selectPage(page, wrapper);

  1. // 获取分页数据信息<br /> List<User> userList = page.getRecords();<br /> for (User user : userList) {<br /> System.out.println(user);<br /> }<br /> // 当前页<br /> long current = page.getCurrent();<br /> // 每页显示条数<br /> long size = page.getSize();<br /> // 总条数<br /> long total = page.getTotal();<br /> // 总页数<br /> long pages = page.getPages();<br /> System.out.println(current);<br /> System.out.println(size);<br /> System.out.println(total);<br /> System.out.println(pages);<br /> }

image.png

@Test
public void testFind7(){
// 存在硬编码问题,扩展维护成本高
/QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like(“user_name”,”伤”)
.eq(“password”,”123456”)
.in(“age”,19,25,29)
.orderByDesc(“age”);
/
// 创建LambdaQueryWrapper对象
// User::getUserName: 动态读取实体中成员属性的名称.
//LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
wrapper.like(User::getUserName,”伤”)
.eq(User::getPassword,”123456”)
.in(User::getAge,19,25,29)
.orderByDesc(User::getAge);
// 查询所有
//List list = userMapper.selectList(null);
List list = userMapper.selectList(wrapper);
for (User user : list) {
System.out.println(user);
}
}

image.png

/*
根据条件删除
*/
@Test
public void deleteTest1(){
LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate();
wrapper.eq(User::getId,1437238496724000769L);
int i = userMapper.delete(wrapper);
System.out.println(i);
}

image.png

/*
根据条件删除
*/
@Test
public void updateTest2(){
User user = User.builder()
.userName(“liuyan”)
.password(“6669”)
.name(“柳岩”)
.age(18)
.email(“liuyan@qq.com”).address(“上海”)
.build();
// 封装修改条件
LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate();
wrapper.eq(User::getId,1437234959319408644L)
.eq(User::getAge,18);
int i = userMapper.update(user, wrapper);
System.out.println(i);
}

MP封装Service

image.png

image.png
image.png
image.png

package com.itheima;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.omg.PortableInterceptor.USER_EXCEPTION;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/*
@Description
@Created by itheima
/
@SpringBootTest
public class MpTestService {
@Autowired
private UserService userService;

  1. /**<br /> * @Description 测试查询操作 根据id查询<br /> */<br /> @Test<br /> public void test1(){<br /> User user = userService.getById(3l);<br /> System.out.println(user);<br /> }
  2. /**<br /> * @Description 测试条件查询,且仅返回一个<br /> * getOne:sql查询的结果必须为1条或者没有,否则报错 !!!!<br /> */<br /> @Test<br /> public void test2(){<br /> LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class);<br /> wrapper.gt(User::getAge,20);<br /> User one = userService.getOne(wrapper);<br /> System.out.println(one);<br /> }
  3. /**<br /> * @Description 根据条件批量查询<br /> */<br /> @Test<br /> public void test3(){<br /> LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class);<br /> wrapper.gt(User::getAge,20);<br /> List<User> list = userService.list(wrapper);<br /> System.out.println(list);<br /> }
  4. /**<br /> * @Description 根据条件批量查询并分页<br /> */<br /> @Test<br /> public void test4(){<br /> LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class);<br /> wrapper.gt(User::getAge,20);<br /> //构建分页对象<br /> IPage<User> page=new Page<>(2,3);<br /> userService.page(page,wrapper);<br /> System.out.println(page.getRecords());<br /> System.out.println(page.getPages());<br /> System.out.println(page.getTotal());<br /> }
  5. /**<br /> * @Description 测试服务层save保存单条操作<br /> */<br /> @Test<br /> public void test5(){<br /> User user1 = User.builder().name("wangwu").userName("laowang4").<br /> email("444@163.com").age(20).password("333").build();<br /> boolean isSuccess = userService.save(user1);<br /> System.out.println(isSuccess?"保存成功":"保存失败");<br /> }
  6. /**<br /> * @Description 测试服务层批量保存<br /> */<br /> @Test<br /> public void test6(){<br /> User user2 = User.builder().name("wangwu2").userName("laowang2").<br /> email("444@163.com").age(20).password("333").build();<br /> User user3 = User.builder().name("wangwu3").userName("laowang3").<br /> email("444@163.com").age(20).password("333").build();<br /> boolean isSuccess = userService.saveBatch(Arrays.asList(user2, user3));<br /> System.out.println(isSuccess?"保存成功":"保存失败");<br /> }<br /> <br /> /**<br /> * @Description 根据id删除操作<br /> */<br /> @Test<br /> public void test7(){<br /> boolean isSuccess = userService.removeById(17l);<br /> System.out.println(isSuccess?"保存成功":"保存失败");<br /> }
  7. /**<br /> * @Description 根据条件批量删除<br /> */<br /> @Test<br /> public void test8(){<br /> LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class);<br /> wrapper.gt(User::getId,12)<br /> .gt(User::getAge,20);<br /> boolean remove = userService.remove(wrapper);<br /> System.out.println(remove);<br /> }
  8. /**<br /> * @Description 测试根据id更新数据<br /> */<br /> @Test<br /> public void test9(){<br /> //UPDATE tb_user SET password=?, t_name=? WHERE id=?<br /> User user2 = User.builder().name("wangwu2").password("333").id(3l).build();<br /> boolean success = userService.updateById(user2);<br /> System.out.println(success);
  9. }
  10. /**<br /> * @Description 测试根据条件批量更新<br /> */<br /> @Test<br /> public void test10(){<br /> LambdaUpdateWrapper<User> wrapper = Wrappers.lambdaUpdate(User.class);<br /> //UPDATE tb_user SET age=? WHERE (id IN (?,?,?))<br /> wrapper.in(User::getId,Arrays.asList(1l,3l,5l)).set(User::getAge,40);<br /> boolean update = userService.update(wrapper);<br /> System.out.println(userService);
  11. }<br />}<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26700116/1656160706199-012897ee-f474-48a2-af8f-4f2a0744dcbb.png#clientId=uf82d1173-7ab8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=303&id=ue741138c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=303&originWidth=767&originalType=binary&ratio=1&rotation=0&showTitle=false&size=36714&status=done&style=none&taskId=u2bec1c56-1d5a-44f0-a4ac-0f06187058e&title=&width=767)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26700116/1656160727449-fd46d72f-b2b6-439b-b7e7-5180cc78ead7.png#clientId=uf82d1173-7ab8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=482&id=u6203e50d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=482&originWidth=287&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15292&status=done&style=none&taskId=u7f263dfa-e58b-4db2-b329-7c2b2732a16&title=&width=287)

编写MyMetaObjectHandler

package cn.itcast.mp.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

  1. @Override<br /> public void insertFill(MetaObject metaObject) {<br /> Object password = getFieldValByName("password", metaObject);<br /> if(null == password){<br /> //字段为空,可以进行填充<br /> setFieldValByName("password", "123456", metaObject);<br /> }<br /> }
  2. @Override<br /> public void updateFill(MetaObject metaObject) {
  3. }<br />}

测试
@Test
public void testQueryUesrById() {
User user1 = User.builder().age(18)
.email(“aa@itheima.com”)
.name(“小明”)
.password(“1234”)
.age(18)
.build();
userMapper.insert(user1);
}