mybatis-plus处理sql的crud操作

使用mybatis-plus,集成了mybatis和hibrate的操作实现数据的crud操作,可以不用创建多个mapper文件的方式,同时不同传统的dao的方式拼接sql语句的方式实现:
mybatis plus是一款专门针对于传统MyBatis开发中sql需要手动进行映射配置繁琐缺点的一款框架技术,这款框架技术提供了十分丰富的api供开发者们使用,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

Mybatis plus到底有多方便呢,我们闲话不多说,直接上手代码实例来进行演示:
为了方便测试,我们首先在数据库里面搭建相关的数据表信息

CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `teacher_name` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `teacher_pwd` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=gbk;

该表对应的实体类:

package com.sise.model;

import com.baomidou.mybatisplus.annotations.TableName;

/**
 * @author idea
 * @data 2019/5/24
 */
@TableName(value = "teacher")
public class Teacher {
    private int id;

    private String teacherName;

    private String teacherPwd;

    public int getId() {
        return id;
    }


    public Teacher() {
    }

    public Teacher(int id) {
        this.id = id;
    }

    public Teacher setId(int id) {
        this.id = id;
        return this;
    }

    public String getTeacherName() {
        return teacherName;
    }

    public Teacher setTeacherName(String teacherName) {
        this.teacherName = teacherName;
        return this;
    }

    public String getTeacherPwd() {
        return teacherPwd;
    }

    public Teacher setTeacherPwd(String teacherPwd) {
        this.teacherPwd = teacherPwd;
        return this;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", teacherName='" + teacherName + '\'' +
                ", teacherPwd='" + teacherPwd + '\'' +
                '}';
    }
}

通常我们在开发的时候都会自定义一个Dao层,mybatis plus里面提供了一个叫做BaseMapper的接口,内部已经提供了相当多的crud操作函数的封装。可以来仔细查看一下该接口的内容:
同时也可以使用mybatis提供的IService接口直接调用,原理同样,具体使用如下:

package com.baomidou.mybatisplus.mapper;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

/**
 * 

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

*

* 这个 Mapper 支持 id 泛型 *

* * @author hubin * @Date 2016-01-23 */ public interface BaseMapper { /** *

* 插入一条记录 *

* * @param entity 实体对象 * @return int */ Integer insert(T entity); /** *

* 插入一条记录 *

* * @param entity 实体对象 * @return int */ Integer insertAllColumn(T entity); /** *

* 根据 ID 删除 *

* * @param id 主键ID * @return int */ Integer deleteById(Serializable id); /** *

* 根据 columnMap 条件,删除记录 *

* * @param columnMap 表字段 map 对象 * @return int */ Integer deleteByMap(@Param("cm") Map columnMap); /** *

* 根据 entity 条件,删除记录 *

* * @param wrapper 实体对象封装操作类(可以为 null) * @return int */ Integer delete(@Param("ew") Wrapper wrapper); /** *

* 删除(根据ID 批量删除) *

* * @param idList 主键ID列表 * @return int */ Integer deleteBatchIds(@Param("coll") Collection idList); /** *

* 根据 ID 修改 *

* * @param entity 实体对象 * @return int */ Integer updateById(@Param("et") T entity); /** *

* 根据 ID 修改 *

* * @param entity 实体对象 * @return int */ Integer updateAllColumnById(@Param("et") T entity); /** *

* 根据 whereEntity 条件,更新记录 *

* * @param entity 实体对象 * @param wrapper 实体对象封装操作类(可以为 null) * @return */ Integer update(@Param("et") T entity, @Param("ew") Wrapper wrapper); /** *

* 根据 whereEntity 条件,更新记录 *

* * @param setStr set字符串 * @param wrapper 实体对象封装操作类(可以为 null) * @return */ Integer updateForSet(@Param("setStr") String setStr, @Param("ew") Wrapper wrapper); /** *

* 根据 ID 查询 *

* * @param id 主键ID * @return T */ T selectById(Serializable id); /** *

* 查询(根据ID 批量查询) *

* * @param idList 主键ID列表 * @return List */ List selectBatchIds(@Param("coll") Collection idList); /** *

* 查询(根据 columnMap 条件) *

* * @param columnMap 表字段 map 对象 * @return List */ List selectByMap(@Param("cm") Map columnMap); /** *

* 根据 entity 条件,查询一条记录 *

* * @param entity 实体对象 * @return T */ T selectOne(@Param("ew") T entity); /** *

* 根据 Wrapper 条件,查询总记录数 *

* * @param wrapper 实体对象 * @return int */ Integer selectCount(@Param("ew") Wrapper wrapper); /** *

* 根据 entity 条件,查询全部记录 *

* * @param wrapper 实体对象封装操作类(可以为 null) * @return List */ List selectList(@Param("ew") Wrapper wrapper); /** *

* 根据 Wrapper 条件,查询全部记录 *

* * @param wrapper 实体对象封装操作类(可以为 null) * @return List */ List> selectMaps(@Param("ew") Wrapper wrapper); /** *

* 根据 Wrapper 条件,查询全部记录 * 注意: 只返回第一个字段的值 *

* * @param wrapper 实体对象封装操作类(可以为 null) * @return List */ List selectObjs(@Param("ew") Wrapper wrapper); /** *

* 根据 entity 条件,查询全部记录(并翻页) *

* * @param rowBounds 分页查询条件(可以为 RowBounds.DEFAULT) * @param wrapper 实体对象封装操作类(可以为 null) * @return List */ List selectPage(RowBounds rowBounds, @Param("ew") Wrapper wrapper); /** *

* 根据 Wrapper 条件,查询全部记录(并翻页) *

* * @param rowBounds 分页查询条件(可以为 RowBounds.DEFAULT) * @param wrapper 实体对象封装操作类 * @return List> */ List> selectMapsPage(RowBounds rowBounds, @Param("ew") Wrapper wrapper); }

这些内置的功能都是已经提前自定义好了的,因此对于一些常用的简单的sql我们可以避免使用手动拼接的方式来实现,大大提升了开发人员的开发效率,结合文章上边所说的教师对象,我们自定义一个Mapper接口用于实现crud的操作
package com.sise.dao;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.sise.model.Teacher;
import org.apache.ibatis.annotations.Mapper;

/**

  • @author idea
  • @data 2019/5/24
    */
    @Mapper
    public interface TeacherMapper extends BaseMapper {
    }
    为了方便测试,我直接选择了在controller里面引用dao函数的功能。

1.提前定义好的插入功能:

BaseMapper里面封装了已经定义好的insert语句,能够方便我们直接调用,无须自己手动编写sql

@GetMapping(value = "/insert")
    public void insert(){
        Teacher  teacher=new Teacher();
        teacher.setTeacherName(createRandomStr(6));
        teacher.setTeacherPwd(createRandomStr(6));
        teacherMapper.insert(teacher);
    }

2.提前定义好的删除功能

BaseMapper里面提供有已经定义好的delete功能,

@GetMapping(value = "/delete")
    public void delete(){
        Teacher  teacher=new Teacher();
        teacher.setId(11);
        EntityWrapper entityWrapper=new EntityWrapper(teacher);
        teacherMapper.delete(entityWrapper);
    }

3.提前定义好的更新功能

BaseMapper里面定义了相关的update功能,但是在进行update的时候有个地方需要注意,来看看下边这段代码先

 @GetMapping(value = "/update")
    public void update(){
        //update的判断条件
        EntityWrapper entityWrapper=new EntityWrapper(new Teacher(1));
        //更新之后的对象
        Teacher teacher=new Teacher();
        teacher.setTeacherPwd("new-pwd");
        teacherMapper.update(teacher,entityWrapper);
    }

mybatis-plus里面提供了一个叫做EntityWrapper的对象封装操作类,通过传入相关的Entity来判断传入的查询参数,这里的使用让我回想起了以前用hibernate的那种味道,不得不说这种功能的设计确实帮开发者的开发效率提升了很多。

以前写更新语句的时候,经常是需要在xml里面进行非常多繁琐耗时的sql拼接工作,现在mybatis-plus通过EntityWrapper这个封装类,大大节省了相应时间。

4.根据指定id进行查询

mybatis-plus也默认提供了关键字查询的功能,可以将查询参数通过对象Entity的形式注入,非常方便。

ps:mybatis-plus已经默认带有了sql注入的预防功能,因此这点可以放心使用。

  @GetMapping(value = "/selectAllById")
    public Teacher selectByTeacherName(int id){
        return teacherMapper.selectOne(new Teacher(id));
    }

5.使用Map来进行多关键字的查询

有些时候,除了使用查询时候使用Entity关键字来进行查询之外,还可以通过使用Map的形式来进行多关键字的搜索实现,相关代码如下所示:

  @GetMapping(value = "/selectAllByMap")
    public List selectAllByEntity(String name){
        Map hashMap=new HashMap<>();
        hashMap.put("teacher_name",name);
        return teacherMapper.selectByMap(hashMap);
    }

6.分页查询

在实际开发中,分页查询功能一直是非常普遍需要运用到的一点,在mybatis-plus里面,他提供了一个叫做Page的类供我们使用,相应的代码如下所示:

 @GetMapping(value = "/selectAllInPage")
    public List selectAllInPage(int pageNumber,int pageSize){
        Page page =new Page<>(pageNumber,pageSize);
        EntityWrapper entityWrapper = new EntityWrapper<>();
        entityWrapper.ge("id", 1);
        return teacherMapper.selectPage(page,entityWrapper);
    }

7.复杂条件查询

针对于比较复杂的多条件查询,mybatis-plus内部提供的EntityWrapper支持有许多丰富的查询api功能供我们使用。

为了方便理解,下边通过实际的代码案例来进行解释

allEq查询(相当于条件全部都要求满足的情况)

 @GetMapping(value = "/selectAllByWrapper1")
    public  List selectAllByWrapper1(){
        Map map=new HashMap<>();
        map.put("teacher_name","name");
        map.put("teacher_pwd","pwd");
        EntityWrapper entity=new EntityWrapper();
        entity.allEq(map);
        return teacherMapper.selectList(entity);
    }
@GetMapping(value = "/selectAllByWrapper4")
    public  List selectAllByWrapper4(){
        EntityWrapper entity=new EntityWrapper();
        entity.gt("id","0");
        entity.le("id",11);
        entity.ne("teacher_name","null_name");
        entity.like("teacher_name","tt");
        entity.notLike("teacher_pwd","sadas");
        entity.orderBy("id");
        return teacherMapper.selectList(entity);
    }

在使用的过程中,mybatis-plus还能兼容原有mybatis的xml和注解模式的sql拼写功能。

mybatis-plus这种集mybatis与hibernate的优点一起的框架。提供了hibernate的单表CRUD操作的方便同时,又保留了mybatis的特性。

你可能感兴趣的:(mybatis-plus处理sql的crud操作)