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<T> : 泛型指定的就是当前Mapper接口所操作的实体类类型 
* 
*/
public interface EmployeeMapper extends BaseMapper<Employee> {
  
}

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

全部方法

\color{red}{注意:}在applicationContext.xml文件中配置mapper接口扫描
添加配置

  <!--  配置 mybatis 扫描 mapper 接口的路径   -->  
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="com.neuedu.mp.mapper"></property>
  </bean>
测试通用插入操作

①指定主键策略


  /*
   * @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("mp_01@neusoft.com");
      employee.setGender(1);
      employee.setAge(23);
      
      // 向数据库中添加数据
      Integer result = employeeMapper.insert(employee);
      System.out.println(result);
      
  }

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

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

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

结果

数据库
  /**
   * 通用 插入操作
   */
  @Test
  public void testCommonInsert() {
      
      //初始化Employee对象
      Employee employee  = new Employee();
      employee.setLastName("MP_02");
      employee.setEmail("mp_02@neusoft.com");
      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("mp_03@neusoft.com");
      
      // 向数据库中添加数据
      Integer result = employeeMapper.insertAllColumn(employee);
      System.out.println(result); 
  }

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

通用更新操作

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

代码

结果

数据库

  /**
   * 通用 更新操作
   */
  @Test
  public void testCommonUpdate() {
      //初始化修改对象
      Employee employee = new Employee();
      employee.setId(7);
      employee.setLastName("MP_03");
      employee.setEmail("mp_03@neusoft.com");
      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<Integer> idList = new ArrayList<>();
      idList.add(4);
      idList.add(5);
      idList.add(6);
      idList.add(7);
      List<Employee> emps = employeeMapper.selectBatchIds(idList);
      // 打印查询的数据
      for (Employee employee : emps) {
          System.out.println(employee);
      }
  }

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

数据库

代码

结果

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

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

数据库

代码

结果

  /**
   * 通用 查询操作
   */
  @Test
  public void testCommonSelect() {
      // 分页查询
      List<Employee> 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<String,Object> columnMap = new HashMap<>();
      columnMap.put("last_name", "MP_01");
      columnMap.put("email", "mp_01@neusoft.com");
      
      Integer result = employeeMapper.deleteByMap(columnMap);
      System.out.println("result: " + result);
  }

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

数据库

代码

结果

数据库

  /**
   * 通用 删除操作
   */
  @Test
  public void testCommonDelete() {
      
      // 根据ID批量删除
      List<Integer> 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 。好了,接下来就学习这个内容,拭目以待吧!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容