MP入门 HelloWorld

完整的项目结构
通用 CRUD 场景设定
  • 提出问题:
    假设我们已存在一张 tbl_employee 表,且已有对应的实体类 Employee,实现 tbl_employee 表的 CRUD 操作我们需要做什么呢?
  • 实现方式:
    (1)基于 Mybatis
    需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法 ;
    提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句。
    (2)基于 MP
    只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口。
    这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件。
准备具体的Mapper接口

package com.neuedu.mp.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.neuedu.mp.beans.Employee;
/**
* Mapper接口
*     
* 基于Mybatis:  
*                  在Mapper接口中编写CRUD相关的方法  
*                  提供Mapper接口所对应的SQL映射文件 
*                  以及方法对应的SQL语句. 
* 
* 基于MP:  
*            让XxxMapper接口继承 BaseMapper接口即可.
*           BaseMapper : 泛型指定的就是当前Mapper接口所操作的实体类类型 
* 
*/
public interface EmployeeMapper extends BaseMapper {
  
}

BaseMapper:继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能。

全部方法

在applicationContext.xml文件中配置mapper接口扫描
添加配置

    
  
      
  
测试通用插入操作

①指定主键策略


  /*
   * @TableId:
   *   value: 指定表中的主键列的列名, 如果实体属性名与列名一致,可以省略不指定. 
   *   type: 指定主键策略. 
   */
  @TableId(value="id" , type=IdType.AUTO)

MP支持以下4中主键策略,可根据需求自行选用:

序号 描述
1 IdType.AUTO 数据库ID自增
2 IdType.INPUT 用户输入ID
3 IdType.ID_WORKER 全局唯一ID,内容为空自动填充(默认配置)
4 IdType.UUID 全局唯一ID,内容为空自动填充

②实体类类名和数据库表表名映射关联


// MybatisPlus会默认使用实体类的类名到数据中找对应的表.
@TableName(value="tbl_employee")

表名注解 @TableName

序号 描述
1 value 表名( 默认空 )
2 resultMap xml 字段映射 resultMap ID

③在测试类中获取EmployeeMapper接口代理实现类


  // 获取EmployeeMapper接口代理实现类
  private EmployeeMapper employeeMapper 
      = iocContext.getBean("employeeMapper", EmployeeMapper.class);

④测试通用插入操作insert方法

代码

结果

数据库

  /**
   * 通用 插入操作
   */
  @Test
  public void testCommonInsert() {
      
      //初始化Employee对象
      Employee employee  = new Employee();
      employee.setLastName("MP_01");
      employee.setEmail("[email protected]");
      employee.setGender(1);
      employee.setAge(23);
      
      // 向数据库中添加数据
      Integer result = employeeMapper.insert(employee);
      System.out.println(result);
      
  }

insert方法在插入时, 会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中。

⑤测试插入操作返回主键值(支持主键自增的数据库插入数据获取主键值)

  • Mybatis: 需要通过 useGeneratedKeys 以及 keyProperty 来设置
  • MP: 自动将主键值回写到实体类中
代码

结果

数据库
  /**
   * 通用 插入操作
   */
  @Test
  public void testCommonInsert() {
      
      //初始化Employee对象
      Employee employee  = new Employee();
      employee.setLastName("MP_02");
      employee.setEmail("[email protected]");
      employee.setGender(0);
      employee.setAge(42);
      
      // 向数据库中添加数据
      Integer result = employeeMapper.insert(employee);
      System.out.println(result);
      
      //获取当前数据在数据库中的主键值
      Integer key = employee.getId();
      System.out.println("key:" + key);   
  }

⑥测试通用插入操作insertAllColumn方法

代码

结果

数据库

  /**
   * 通用 插入操作
   */
  @Test
  public void testCommonInsert() {
      
      //初始化Employee对象
      Employee employee  = new Employee();
      employee.setLastName("MP_03");
      employee.setEmail("[email protected]");
      
      // 向数据库中添加数据
      Integer result = employeeMapper.insertAllColumn(employee);
      System.out.println(result); 
  }

insertAllColumn方法在插入时, 不管属性是否非空, 属性所对应的字段都会出现到SQL语句中。

通用更新操作

①测试通用更新操作updateById方法

代码

结果

数据库

  /**
   * 通用 更新操作
   */
  @Test
  public void testCommonUpdate() {
      //初始化修改对象
      Employee employee = new Employee();
      employee.setId(7);
      employee.setLastName("MP_03");
      employee.setEmail("[email protected]");
      employee.setGender(0);
      employee.setAge(33);
      
      // 更新ID为7的雇员的性别:null->0,Age->33
      Integer result = employeeMapper.updateById(employee);
      System.out.println("result: " + result);
  }

②测试通用更新操作updateAllColumnById方法

代码

结果

数据库

  /**
   * 通用 更新操作
   */
  @Test
  public void testCommonUpdate() {
      //初始化修改对象
      Employee employee = new Employee();
      employee.setId(7);
      employee.setLastName("MP_03");
      employee.setEmail("mp_03@东软.com");
      employee.setGender(1);
      
      // 更新ID为7的雇员的性别:Email->mp_03@东软.com,Gender->0,并且不写Age属性
      Integer result = employeeMapper.updateAllColumnById(employee);
      System.out.println("result: " + result);
  }
通用查询操作

①测试通用查询操作selectById方法

数据库

代码

结果

  /**
   * 通用 查询操作
   */
  @Test
  public void testCommonSelect() {
      // 通过id查询
      Employee employee = employeeMapper.selectById(7);
      System.out.println(employee);
  }

②测试通用查询操作selectOne方法

数据库

代码

结果

  /**
   * 通用 查询操作
   */
  @Test
  public void testCommonSelect() {
      // 通过多个列进行查询: id  +  lastName
      Employee  employee = new Employee();
      employee.setId(6);
      employee.setLastName("MP_02");
      
      Employee result = employeeMapper.selectOne(employee);
      System.out.println("result: " +result);
  }

③测试通用查询操作selectBatchIds方法

数据库

代码

结果

  /**
   * 通用 查询操作
   */
  @Test
  public void testCommonSelect() {
      // 通过多个id进行查询   
      List idList = new ArrayList<>();
      idList.add(4);
      idList.add(5);
      idList.add(6);
      idList.add(7);
      List emps = employeeMapper.selectBatchIds(idList);
      // 打印查询的数据
      for (Employee employee : emps) {
          System.out.println(employee);
      }
  }

④测试通用查询操作selectByMap方法

数据库

代码

结果

  /**
   * 通用 查询操作
   */
  @Test
  public void testCommonSelect() {
      // 通过Map封装条件查询
      Map columnMap = new HashMap<>();
      columnMap.put("last_name", "Tom");
      columnMap.put("gender", 1);
      
      List emps = employeeMapper.selectByMap(columnMap);
      for (Employee employee : emps) {
          System.out.println(employee);
      }
  }

⑤测试通用查询操作selectPage方法

数据库

代码

结果

  /**
   * 通用 查询操作
   */
  @Test
  public void testCommonSelect() {
      // 分页查询
      List emps = employeeMapper.selectPage(new Page<>(3, 2), null);
      for (Employee employee : emps) {
          System.out.println(employee);
      }
  }
通用删除操作

①测试通用删除操作deleteById方法

数据库

代码

结果

数据库

  /**
   * 通用 删除操作
   */
  @Test
  public void testCommonDelete() {
      // 根据id进行删除
      Integer result = employeeMapper.deleteById(7);
      System.out.println("result: " + result);
  }

②测试通用删除操作deleteByMap方法

数据库

代码

结果

数据库

  /**
   * 通用 删除操作
   */
  @Test
  public void testCommonDelete() {
      
      // 根据 多个 条件进行删除
      Map columnMap = new HashMap<>();
      columnMap.put("last_name", "MP_01");
      columnMap.put("email", "[email protected]");
      
      Integer result = employeeMapper.deleteByMap(columnMap);
      System.out.println("result: " + result);
  }

③测试通用删除操作deleteBatchIds方法

数据库

代码

结果

数据库

  /**
   * 通用 删除操作
   */
  @Test
  public void testCommonDelete() {
      
      // 根据ID批量删除
      List idList = new ArrayList<>();
      idList.add(1);
      idList.add(2);
      idList.add(6);
      Integer result = employeeMapper.deleteBatchIds(idList);
      System.out.println("result: " + result );
  }
通用 CRUD 操作小结

以上就是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方便的实现单一、批量、分页等操作。极大的减少开发负担,难道这就是 MP 的强大之处了吗?

  • 提出需求:
    现有一个需求,我们需要分页查询 tbl_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?
    MyBatis :需要在 SQL 映射文件中编写带条件查询的 SQL,并基于 PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。普通的 Mapper 能够解决这类痛点吗?
    MP:依旧不用编写 SQL 语句, MP 提供了功能强大的条件构造器 EntityWrapper 。好了,接下来就学习这个内容,拭目以待吧!

你可能感兴趣的:(MP入门 HelloWorld)