MyBatis-Plus

本文介绍了MyBatis-Plus的特性,包括无侵入、损耗小、强大的CRUD操作、Lambda形式调用等。通过快速开始部分展示了如何在SpringBoot项目中配置并使用MyBatis-Plus,包括实体类、Mapper接口、配置文件以及测试代码。此外,还详细解释了分页查询的实现。最后,给出了业务层的处理示例,包括Service接口、实现类和测试类。
摘要由CSDN通过智能技术生成

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

基本特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

快速开始

1.新建Maven工程,导入相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 父依赖  -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>BootMP</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <!--  mysql驱动  -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!--   连接池     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>
        <!--  junit测试  -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--  boot测试框架  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--   boot框架     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
        <!--  mybatis-plus依赖       -->
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

    </dependencies>


</project>

2.配置文件application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/MyBatisPlus?characterEncoding=utf-8
    username: root
    password: qwer6666
    type: com.alibaba.druid.pool.DruidDataSource
    maxActive: 50
    maxWait: 2000
    minIdle: 10


mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-aliases-package: com.project.bean

3.编写代码

编写实体类,并添加注解,使字段名与数据库表对应列对应。若数据库表中没有实体类中属性对应的列,则在该属性名上使用@TableField(exist = false)。

@TableName("t_man")     //当前实体对应的数据库表名称
public class ManBean {
     // TableId注解 指定属性对应主键的列
    // type = IdType.AUTO使用数据库主键自动增长策略
    @TableId(value = "pk_manid", type = IdType.AUTO)
    private Integer id;

    // 普通属性,书写数据库表对应的列
    @TableField("f_name")
    private String name;
    @TableField("f_tel")
    private String tel;

    public Integer getId() {
        return id;
    }

    public ManBean(String name, String tel) {
        this.name = name;
        this.tel = tel;
    }

    public ManBean() {
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    @Override
    public String toString() {
        return "ManBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", tel='" + tel + '\'' +
                '}';
    }
}

编写Mapper类或DAO类

/*
持久接口 
1、继承BaseMapper接口
2、书写该接口对应的实体类类名
3、加上@Repository  表示该接口为持久层组件
 */
@Repository
public interface ManDao extends BaseMapper<ManBean> {
//此时接口中已经包含单表的基本增删改查的实现
    
}

新建 Spring Boot 启动类

@SpringBootApplication
@MapperScan("com.project.dao")
public class MainServer {

    public static void main(String[] args) {
        SpringApplication.run(MainServer.class,args);
    }
}

添加测试类,进行功能测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainServer.class)
public class TestManDao {
    @Resource
    private ManDao manDao;

    @Test
    public void testAll() {
//        增加
//        ManBean bean = new ManBean("周瑜", "143123141");
//        int info =  manDao.insert(bean);
//        System.out.println(info);
//        System.out.println(bean);
//        删除
//        manDao.deleteById(4);
//        查询  
//        System.out.println(manDao.selectById(5));
//        修改
//        ManBean manBean =new ManBean();
//        manBean.setId(3);
//        manBean.setName("貂蝉");
//        manBean.setTel("213114555");
//        manDao.updateById(manBean);

//        selectList
//        null--查询所有
//        List<ManBean> list =manDao.selectList(null);

//        查询姓名为吕布的公民
//        QueryWrapper<ManBean> wrapper = new QueryWrapper<>();
//        利用wrapper对象 指定条件  eq表示是否相等
//        wrapper.eq("f_name", "吕布");
//        wrapper.eq("f_tel", "1234143");

//        wrapper.like("f_name","吕");
//        wrapper.like("f_tel","1");
//
//        List<ManBean> list = manDao.selectList(wrapper);
//        for (ManBean manBean : list) {
//            System.out.println(manBean);
//        }
        

    }
}

项目结构:

 

分页查询

Mybatis-Plus中内置了分页插件,配置分页类组件即可:

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor interceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

测试分页:

 Page<UserBean> page = new Page<>(1, 4);

 userDao.selectPage(page, null);    
 System.out.println("当前页数据"+page.getRecords());
 System.out.println("总页数"+page.getPages());
 System.out.println("总记录数"+page.getTotal());
 System.out.println("下一页?"+page.hasNext());
 System.out.println("上一页?"+page.hasPrevious());

    wrapper.like("f_username","王");
    wrapper.eq("f_gender","女");
    wrapper.eq("f_symbol","游客");
    userDao.selectPage(page,wrapper);
    System.out.println(page.getRecords());

业务层的处理:

1.业务接口:

/*
自定义用户业务接口
1、继承IService接口
注意:通用service接口与通用mapper接口不一样,
通用mapper接口不需要提供实现类,就已经包含所有的数据库操作方法
但通用service接口必须要提供实现类
 */
public interface UserService extends IService<UserBean> {

    List<UserBean> findByItem(String name, LocalDate start, LocalDate end);

    IPage<UserBean> cutByItem(int pageNo, int pageSize, String name);

}

2.业务接口实现类

/*
自定义接口的实现类
注意:必须继承mybatis-plus提供的ServiceImpl实现类,并加入泛型<持久层接口,实体Bean>
此时,该实现类中就包含继承的单表crud操作
 */

@Service
@Transactional
public class UserServiceImp extends ServiceImpl<UserDao, UserBean> implements UserService {

   /* @Override
    public List<UserBean> findByItem(String name, LocalDate start, LocalDate end) {
//        方案1   不写xml文件
        QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
        if (name != null && !name.equals("")) {
            wrapper.like("f_username", name);
        }

        if (start != null) {
            wrapper.ge("f_birth", start);
        }
        if (end != null) {
            wrapper.le("f_birth", end);
        }

        List<UserBean> list = this.list(wrapper);
        return list;
    }*/


    @Override
    public List<UserBean> findByItem(String name, LocalDate start, LocalDate end) {

        List<UserBean> list = this.baseMapper.findByItem(name, start, end);
        return list;
    }

   /* @Override
    public IPage<UserBean> cutByItem(int pageNo, int pageSize, String name) {
        IPage<UserBean> page = new Page<>(pageNo,pageSize);
        QueryWrapper  wrapper = new QueryWrapper();
        if (name != null && !name.equals("")) {
            wrapper.like("f_username", name);
        }

//        通用service提供的分页查询
//        IPage<UserBean> iPage = this.page(page,wrapper);
//        通用mapper提供的分页查询
        IPage<UserBean> iPage = this.baseMapper.selectPage(page,wrapper);
        return iPage;
    }*/

    @Override
    public IPage<UserBean> cutByItem(int pageNo, int pageSize, String name) {
        Page<UserBean> page = new Page<>(pageNo,pageSize);

        IPage<UserBean> iPage = this.baseMapper.cutByItem(page,name);
        return iPage;
    }

}

3.Service功能测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainServer.class)
public class TestService {
    @Resource
    private UserService service;
    @Resource
    private StudentService studentService;
    @Resource
    private TeacherService teacherService;

    @Test
    public void testService() {
        UserBean userBean = new UserBean("修改", "女",
                LocalDate.parse("1111-03-13"), "890", "会员");
//        通用service接口 save插入数据
//        service.save(userBean);
//        List<UserBean> list = new ArrayList<>();
//        list.add( new UserBean("杨坷1", "男",
//        LocalDate.parse("1882-03-13"), "112", "用户"));
//
//        list.add( new UserBean("杨坷2", "男",
//                LocalDate.parse("1882-03-13"), "112", "用户"));
//
//        list.add( new UserBean("杨坷3", "男",
//                LocalDate.parse("1882-03-13"), "112", "用户"));
//
//        service.saveBatch(list);

//        修改update
//        根据id修改
//        userBean.setId(18);
//        service.updateById(userBean);
//       根据条件修改
//        QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
//        wrapper.eq("f_username","测试修改");
//
//        service.update(userBean,wrapper);

//删除
//        service.removeById(19);
//        wrapper.like("f_username", "坷");
//        service.remove(wrapper);

//查询
//        System.out.println(service.getById(13));
//        wrapper.eq("f_username","全冠清");

//        System.out.println(service.getOne(wrapper));

//        查询集合
//
//        wrapper.eq("f_gender","女");
//        wrapper.eq("f_symbol","会员");
//
//        List<UserBean> list =service.list(wrapper);
//        System.out.println(list);

//        wrapper.eq("f_gender","女");
//        IPage<UserBean> page = service.page(new Page<>(2,3),wrapper);
//
//        System.out.println(page.getRecords());


//        List<UserBean> list = service.findByItem("王",LocalDate.parse("1111-01-01"),null);
//        for (UserBean user :list){
//            System.out.println(user);
//        }

//        IPage<UserBean> page = service.cutByItem(2,2,"王");
//        System.out.println(page.getRecords());

//        StudentBean stu = new StudentBean("金刚狼", LocalDate.parse("1982-02-17"), "男");
//        studentService.save(stu);
//        List<StudentBean> list = new ArrayList<>();
//        list.add(new StudentBean("金刚", LocalDate.parse("1989-05-22"), "男"));
//        list.add(new StudentBean("金贞恩", LocalDate.parse("1992-01-26"), "男"));
//        list.add(new StudentBean("王四喜", LocalDate.parse("2008-10-11"), "女"));
//        studentService.saveBatch(list);
//        stu.setsId(2);
//        studentService.updateById(stu);

//        QueryWrapper<StudentBean> wrapper = new QueryWrapper<>();
//        wrapper.eq("f_sname", "王四");
//        studentService.update(stu, wrapper);
//        wrapper.eq("f_sname", "刘三");
//        studentService.remove(wrapper);

//        studentService.removeById(4);

//        System.out.println(studentService.getById(5));

//        wrapper.like("f_sname","四");
//        wrapper.like("f_sname","张三");
//
//        System.out.println(studentService.getOne(wrapper));
//        List<StudentBean> list = studentService.list(wrapper);
//        System.out.println(list);

        TeacherBean teacherBean = new TeacherBean("李老师", 29, "成华区");
//        teacherService.save(teacherBean);
//        List<TeacherBean> list = new ArrayList<>();
//        list.add(new TeacherBean("刘老师", 29, "锦江区"));
//        list.add(new TeacherBean("李老师", 34, "武侯区"));
//        list.add(new TeacherBean("赵老师", 26, "成华区"));
//        list.add(new TeacherBean("王老师", 40, "武侯区"));
//
//        teacherService.saveBatch(list);

//        Integer[] stuIdArray = {1,6,9};

//        teacherService.addRelation(4,stuIdArray);

//        System.out.println(teacherService.getTeacherIncludesStu(1));

//        System.out.println(teacherService.cutByItem(1, 2, "李").getRecords());

//        teacherService.replace(2,5);

//        Integer[] array = {6,7};
//        studentService.addRelation(10,array);

//        System.out.println(studentService.getStuIncludesTeacher(1));

        studentService.delStu(3);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值