mybatis plus 常用方法

快速了解:

本文介绍mybatis plus插件的基本使用方法
在这里插入图片描述

  • 快速开始
  • 常用注解介绍
  • CRUD
  • 分页查询
  • 逆向工程自动生成器

一. 快速开始

1.新建一个springboot项目,勾选如下依赖

在这里插入图片描述

2.导入mybatis plus的依赖

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.0</version>
</dependency>

//建议引入连接池
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.23</version>
</dependency>

3.配置数据库连接

spring:
  datasource:         #配置数据库
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/mybatis_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456

4.创建实体类

  • User
    在这里插入图片描述
package com.lin.entity;
import ...
@Data                       ///lombok
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)    //链式调用
public class User {
    
    
    int id;
    String username;
    String password;
}

5.创建Dao接口,继承BaseMapper获得CRUD方法

  • 使用mybatis plus 增强类BaseMapper<?>进行增强,Dao会继承BaseMappser中的所有CRUD方法
  • 记得在springboot中注册,@Repository
  • 记得要在入口类中添加扫描@MapperScan(“com.lin.dao”),或者用Mapper进行单个类的扫描
  • 不需要mapper.xml文件,只需要继承方法即可
package com.lin.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lin.entity.User;
import org.springframework.stereotype.Repository;

//使用mybatis plus 增强类BaseMapper<?>进行增强,Dao会继承BaseMappser中的所有CRUD方法
@Repository
public interface UserDao extends BaseMapper<User> {
    
    

}
  • 在springboot的入口类中添加mapper扫描
package com.lin;
import ...

@SpringBootApplication
@MapperScan("com.lin.dao")		//扫描包
public class MybatisPlus01Application {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(MybatisPlus01Application.class, args);
    }
}

6 .调用接口,进行测试

  • 在测试类中调用接口
@SpringBootTest
class MybatisPlus01ApplicationTests {
    
    
    @Autowired
    private UserDao userDao;
    @Test
    void testUserDao() {
    
    
        List<User> users=userDao.selectList(null);//无条件查询表
        users.forEach(user -> System.out.println(user));        //打印
    }
}
  • 测试结果
User(id=1, username=AA, password=A123)
User(id=2, username=BB, password=B123)
User(id=3, username=CC, password=C123)
User(id=4, username=EE, password=E1243)

二. 常用注解:

mybatis plus中常用的接口有

@TableName

  • 用于将实体对象与数据库表明进行映射(默认是将类名作为表明)
  • 修饰范围:作用在类上
  • 常见属性:value=表名,resultMap=xml 中 resultMap 的 id
    在这里插入图片描述

@TableId

  • 主键注解,指定主键以及主键的自增方式
  • 作用范围:类属性成员上
  • 属性value:主键字段名
  • 属性:type
@Data                       ///lombok
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)    //链式调用
@TableName(value = "t_user")
public class User {
    
    
    //设置id为主键,并且采用自增的方式增长
    @TableId(value = "id",type = IdType.AUTO)
    int id;
    String username;
    String password;
}

@TableField

  • 描述:字段注解(非主键),用于指定属性和数据库中的字段的映射关系
  • 作用范围:类属性成员上
  • 属性value:指定某个属性对应数据库中的哪个字段
  • 属性exit=boolean,表示某个属性是否映射到数据库
package com.lin.entity;

import ...
@Data                       ///lombok
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)    //链式调用
@TableName(value = "t_user")
public class User {
    
    
    //设置id为主键,并且采用自增的方式增长
    @TableId(value = "id",type = IdType.AUTO)
    int id;
    String username;
    //指定pwd->password
    @TableField(value = "password")
    String pwd;
    //指定num不映射任何字段
    @TableField(exist = false)
    Integer num;
}

三. CRUD

package com.lin;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.lin.entity.User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lin.dao.UserDao;
import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.management.Query;
import java.sql.Wrapper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class MybatisPlus01ApplicationTests {
    
    

    @Autowired
    private UserDao userDao;

    @Test
    void testUserDao() {
    
    
        List<User> users=userDao.selectList(null);//无条件查询表
        users.forEach(user -> System.out.println(user));        //打印
    }
    @Test
    void testInsert(){
    
    
        // 插入一条记录
        User user = new User(10,"qdl","123456");
        System.out.println(userDao.insert(user));
    }
    //Id删除
    @Test
    void testDeletById(){
    
    
        userDao.deleteById(121);
    }
    //批量删除
    @Test
    void deleteBatchIds(){
    
    
        List<Integer> list = new ArrayList<>();
        list.add(121);
        list.add(122);
        list.add(123);
        userDao.deleteBatchIds(list);
    }
    //集合指定某字段的值,将包含这个字段值的记录删除
    @Test
    void deleteByMap(){
    
    
        Map<String,Object> map=new HashMap<>();
        map.put("username","linxiaode");
        userDao.deleteByMap(map);
    }

    //条件删除,删除密码为123456的记录
    @Test
    void deletequeryWrapper(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("password","123456");
        userDao.delete(queryWrapper);
    }

    //修改
    @Test
    void update(){
    
    
        User user=new User();
        user.setId(1);
        user.setUsername("linxiaode");
        //根据id标识,设置usrname,但是password为空,pwd不进行修改
        userDao.updateById(user);
    }

    //条件批量修改
    //id大于等于4记录修改密码
    @Test
    void updateQ(){
    
    
        User user = new User();
        user.setPassword("11111111");
        QueryWrapper<User> updateWrapper=new QueryWrapper<> ();
        updateWrapper.ge("id",4);
        //condition属性表示条件构造器是否生效,设置为false则不生效;注意如果没有设置条件,默认全部修改
        userDao.update(user,updateWrapper);
    }

    //查询select
    //全查询
    @Test
    void selectListNull(){
    
    
        List<User> users=userDao.selectList(null);
        users.forEach(user -> System.out.println(user));
    }
    @Test
    void selecyById(){
    
    
        User user = userDao.selectById("1");
        System.out.println(user);
    }
    @Test
    void testselectOne(){
    
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",2);//注意,条件必须要保证查询结果唯一
        User user = userDao.selectOne(queryWrapper);
        System.out.println(user);
    }
    @Test
    void testselectBatchIds(){
    
    
        ArrayList<Integer> idList = new ArrayList<>();
        idList.add(1);
        idList.add(2);
        idList.add(3);
        List<User> users = userDao.selectBatchIds(idList);
        users.forEach(user -> System.out.println(user));
    }

    @Test
    void testselectByMap(){
    
    
        HashMap<String , Object> map = new HashMap<>();
        map.put("username","AA");
        List<User> users=userDao.selectByMap(map);
        users.forEach(user -> System.out.println(user));
    }

    //模糊查询,通过条件选择器like设置,调用selectList方法
    @Test
    void testSelectLike(){
    
    

        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.like("password","0");

        List<User>users = userDao.selectList(queryWrapper);
        users.forEach(user -> System.out.println(user));
    }
    //可以条件查询
    @Test
    void testCount(){
    
    
        int num=userDao.selectCount(null);
        System.out.println(num);
    }
}

四. 分页查询

对于分页查询,mybatis plus提供了相应的接口,但是调用接口之前,要先引入配置类(以下介绍的springboot的方式)

  • 在com.lin目录下新建config目录
  • 目录下新配置类:
//Spring boot方式
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
    
    

    @Bean
    public PaginationInterceptor paginationInterceptor() {
    
    
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}
  • 分页如下:
//无条件分页查询
//注意分页是从1开始的
@Test
void testPage(){
    
    
    IPage<User> page=new Page<>(1,2);
    page=userDao.selectPage(page,null);
    page.getRecords().forEach(user -> System.out.println(user));
}

//有条件分页查询
@Test
void testPageQ(){
    
    
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("id",2);
    IPage<User> page=new Page<>(1,4);
    page=userDao.selectPage(page,queryWrapper);
    page.getRecords().forEach(user -> System.out.println(user));
}

五. 代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

  • 新建一个代码生成类

在这里插入图片描述

package com.lin;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;


// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
    
    

    public static void main(String[] args) {
    
    
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_db?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("12345678");
        mpg.setDataSource(dsc);                                 //设置数据源配置

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");    //获取当前项目的根目录
        gc.setOutputDir(projectPath + "/src/main/java");        //设置输出文件夹
        gc.setAuthor("qdl");                                    //设置作者信息
        gc.setOpen(false);                                      //生成之后是否打开文件夹
        gc.setServiceName("%sService");                         //设置service接口不包含I开头
        mpg.setGlobalConfig(gc);                                //设置全局配置


        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.lin");                //设置java目录下的输出包位置
        pc.setModuleName("mybatisPlus");            //设置包名
        pc.setEntity("entity");                 //设置实体类
        pc.setMapper("mapper");                 //设置mapper接口
        pc.setService("service");               //service
        pc.setServiceImpl("service.impl");      //设置service实现类
        pc.setController("controller");         //controller层
        mpg.setPackageInfo(pc);                 //设置包配置

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);                      //开启_转驼峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);                //开启_转驼峰命名
        //strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategy.setEntityLombokModel(true);                                        //lombok
        strategy.setRestControllerStyle(true);                                      //RestController
        strategy.setSuperEntityColumns("id");                                       //实体公共字段
        String[] tables={
    
    "user","teacher","student","blog"};                               //设置输入表
        strategy.setInclude(tables);                                                //多个表名
        strategy.setControllerMappingHyphenStyle(true);                             //是否生成实体时,生成字段注解
        strategy.setTablePrefix(pc.getModuleName() + "_");                          //字段前缀


        mpg.setStrategy(strategy);  //执行
        mpg.execute();
    }

}
  • 一键生成
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/108239396