1.简介

  • 什么是通用mapper

什么是通用mapper,用一句话概括就是,它就是一个辅助mybatis开发的组件,它不是替代mybatis,而是使mybatis更方便的开发。通用mapper提供极其方便的单表的增删改查,可以按照自己的需要使用通用方法,还能很方便开发自己的通用方法。

  • 为什么使用通用,apper

原生Mybatis痛点

  1. mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
  2. 需要自己实现sql分页,select * from table where . . . limit 1,3。自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
  3. 数据库可移植性差:如果项目更换数据库,比如oracle-->mysql,mapper.xml中的sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。
  4. 生成的代码量过大。
  5. 批量操作,批量插入,批量更新,需要自写。

2.SpringBoot项目中整合通用Mapper

  • 引入jar包
<!--        引入通用mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>



  • 启动类上加上@MapperScan扫描注解
@SpringBootApplication
@MapperScan("com.sangon.springdemo.mapper")
@EnableScheduling
public class TimedTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TimedTaskApplication.class, args);
    }
}





springboot的mapper怎么写_List


注意导入的包是tk.......

  • 实体类
@Data
@Table(name = "student")
public class Student {
    @Id
    private String id;
    private String name;
    private Integer age;
}


@Table注解

注解中的name属性绑定的是数据库中对应的表名称

@Id注解

在字段上加上此注解说明此字段为主键

  • 编写mapper
public interface StudentMapper extends Mapper<Student> {
}


新建接口StudentMapper继承Mapper<T>,泛型中就是Student实体类。

3.通用mapper的增删改查

  • 查询

controller层


@RequestMapping(value = "/getStudent", method = RequestMethod.GET)
    public Student getStudentById(@RequestParam String id){
        return timedTaskService.getStudentById(id);
    }


service层


/**
     * description: 根据主键id查询数据(使用通用mapper)
     *
     * @param id
     * @return com.sangon.springdemo.entity.Student
    */
    public Student getStudentById(String id);


impl:


@Autowired
    private StudentMapper studentMapper;

@Override
    public Student getStudentById(String id) {
        Student student = studentMapper.selectByPrimaryKey(id);
        return student;
    }


studentMapper.selectByPrimaryKey(id),根据主键id查询Student信息

  • 新增

controller层


@RequestMapping(value = "/insertStudent", method = RequestMethod.POST)
    public void insertStudent(@RequestParam String name, @RequestParam Integer age){
        timedTaskService.insertStudent(name, age);
    }


service层


/**
     * description: 插入学生信息
     *
     * @param name
     * @param age
     * @return void
    */
    public void insertStudent(String name, Integer age);


impl:


@Autowired
    private StudentMapper studentMapper;
@Override
    public void insertStudent(String name, Integer age) {
        Student student = new Student();
        student.setId(UUIDUtils.getUuid());
        student.setName(name);
        student.setAge(age);
        studentMapper.insert(student);
       //studentMapper.insertSelective(student);
    }


studentMapper.insert(student); 使用insert方法将学生信息插入数据

insert(): 插入

insertSelective(): 选择性插入

两个方法的区别:

使用插入时当字段值为空就将值为null插入数据,这个字段还是会参与插入

age字段为空,插入时的sql语句中该字段还是会参与


springboot的mapper怎么写_List_02


使用选择性插入时字段是不会参与插入的

age字段为空,插入时的sql语句中该字段是不会参与的


springboot的mapper怎么写_List_03


  • 修改

controller层


@RequestMapping(value = "/updateStudent", method = RequestMethod.PUT)
    public void updateStudent(@RequestBody Student student){
        timedTaskService.updateStudent(student);
    }


service层


/**
     * description: 修改学生信息
     *
     * @param student
     * @return void
    */
    public void updateStudent(Student student);


impl:


@Autowired
    private StudentMapper studentMapper;
   @Override
    public void updateStudent(Student student) {
        studentMapper.updateByPrimaryKey(student);
       //studentMapper.updateByPrimaryKeySelective(student);
    }


非选择性修改:updateByPrimaryKey(student);

如果student的值为null,表中的数据也会被修改为null。

选择性修改:updateByPrimaryKeySelective(student);

如果student的值为null,表中的数据不会被修改为null,保持不变。

  • 删除

controller层


@RequestMapping(value = "/deleteStudent", method = RequestMethod.DELETE)
    public void deleteStudent(@RequestParam String id, @RequestParam String name, @RequestParam Integer age){
        timedTaskService.deleteStudent(id, name, age);
    }


service层


/**
     * description: 删除学生信息数据
     *
     * @param id
     * @param name
     * @param age
     * @return void
    */
    public void deleteStudent(String id, String name, Integer age);


impl


@Override
    public void deleteStudent(String id, String name, Integer age) {
        //studentMapper.deleteByPrimaryKey(id);
        Student student = new Student();
        student.setName(name);
        student.setAge(age);
        studentMapper.delete(student);
    }


  1. 根据主键删除
studentMapper.deleteByPrimaryKey(id);

2.根据非主键删除

studentMapper.delete(student);

其中属性之间使用and连接,比如上述例子中,删除数据时必须同时满足name和age两个字段时这个数据才会被删掉。

4.通用Mapper高阶使用example

通用Mapper中的方法解析

方法

功能说明

List select(T var1);

根据实体中参数查询返回满足条件的集合数据

T selectByPrimaryKey(Object var1);

根据主键id查询返回该主键的数据

List selectByExample(Object var1);

按条件查询

List selectAll();

查询所有数据返回数据的集合

List selectByExampleAndRowBounds(Object var1, RowBounds var2);

根据Example类型参数条件和分页参数查询数据

List selectByRowBounds(T var1, RowBounds var2);

根据参数条件和分页参数查询数据

int selectCount(T var1);

根据筛选条件查询匹配的数据的条数

int selectCountByExample(Object var1);

根据Example筛选条件查询匹配的数据的条数

T selectOne(T var1);

根据筛选条件查询唯一的数据并返回

T selectOneByExample(Object var1);

根据Example筛选条件查询唯一的数据并返回

int insert(T var1);

插入数据

int insertSelective(T var1);

选择性插入数据

int updateByPrimaryKey(T var1);

根据主键修改数据

int updateByPrimaryKeySelective(T var1);

根据主键选择性修改数据

int updateByExample(@Param("record") T var1, @Param("example") Object var2);

根据Example参数修改数据

int updateByExampleSelective(@Param("record") T var1, @Param("example") Object var2);

根据Example参数选择性修改数据

int delete(T var1);

删除数据,里面参数会使用and进行拼接

int deleteByExample(Object var1);

根据参数删除数据

int deleteByPrimaryKey(Object var1);

根据主键删除数据

方法

说明

example.setOrderByClause(“字段名 ASC”);

添加升序排列条件,DESC为降序

example.setDistinct(false)

去除重复,boolean型,true为选择不重复的记录。

criteria.andXxxIsNull

添加字段xxx为null的条件

criteria.andXxxIsNotNull

添加字段xxx不为null的条件

criteria.andXxxEqualTo(value)

添加xxx字段等于value条件

criteria.andXxxNotEqualTo(value)

添加xxx字段不等于value条件

criteria.andXxxGreaterThan(value)

添加xxx字段大于value条件

criteria.andXxxGreaterThanOrEqualTo(value)

添加xxx字段大于等于value条件

criteria.andXxxLessThan(value)

添加xxx字段小于value条件

criteria.andXxxLessThanOrEqualTo(value)

添加xxx字段小于等于value条件

criteria.andXxxIn(List<?>)

添加xxx字段值在List<?>条件

criteria.andXxxNotIn(List<?>)

添加xxx字段值不在List<?>条件

criteria.andXxxLike(“%”+value+”%”)

添加xxx字段值为value的模糊查询条件

criteria.andXxxNotLike(“%”+value+”%”)

添加xxx字段值不为value的模糊查询条件

criteria.andXxxBetween(value1,value2)

添加xxx字段值在value1和value2之间条件

criteria.andXxxNotBetween(value1,value2)

添加xxx字段值不在value1和value2之间条件

5.使用案例


@Override
    public void parse() {
        Example example = new Example(Student.class);
        Example.Criteria criteria = example.createCriteria();
        // 添加筛选条件 年龄大于等于45
        criteria.andGreaterThanOrEqualTo("age", "45");
        // 添加分页筛选条件
        RowBounds rowBounds = new RowBounds(0, 5);
        List<Student> studentList = studentMapper.selectByExampleAndRowBounds(example, rowBounds);
        for (Student student : studentList) {
            System.out.println("name:" + student.getName());
        }


查出的数据就为年龄大于等于45的前五条数据。


@Override
    public void parse() {
        Example example = new Example(Student.class);
        Example.Criteria criteria = example.createCriteria();
        // 添加查询条件  根据id为f4ba6717fe054c5cbe1730aed4d64d51进行查询
        criteria.andEqualTo("id", "f4ba6717fe054c5cbe1730aed4d64d51");
        // 查询唯一的数据
        Student student = studentMapper.selectOneByExample(example);
        System.out.println("name:" + student.getName());
    }


查出唯一一条数据,如果根据筛选条件查出的数据不是唯一的,则会报错


@Override
    public void parse() {
        Example example = new Example(Student.class);
        Example.Criteria criteria = example.createCriteria();
        // 创建筛选条件,查询年龄在25到50之间的数据
        criteria.andBetween("age", 25, 50);
        List<Student> studentList = studentMapper.selectByExample(example);
        for (Student student : studentList) {
            System.out.println("name:" + student.getName());
        }
    }


筛选的条件为根据字段age进行筛选,筛选出年龄在25-50之间的数据

6.寄语

之前在项目中使用过通用mapper,已经有些时间了,这里做了一下总结,欢迎小伙伴们进行指正。

不积硅步无以至千里,不积小流无以成江河