关于java:mybatisPlus

66次阅读

共计 5430 个字符,预计需要花费 14 分钟才能阅读完成。

1. 先理解一下 Mybatis_Plus:

Mybatis_plus(MP): 是一个 Mybatis 的加强工具, 在 Mybatis 的根底上只做加强不扭转,为简化开发,提高效率。(是一个插件)
官网:https://baomidou.com/
作者:Mybatis-Plus 是由 baomidou 组织开发并且开源的,目前组织大概有 30 万人左右

1.2 个性:

    1. 无侵入:只做加强不做扭转,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会主动注入根本 CURD,性能根本无损耗,间接面向对象操作
  • 弱小的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过大量配置即可实现单表大部分 CRUD 操作,更有弱小的条件结构器,满足各类应用需要
  • 反对 Lambda 模式调用:通过 Lambda 表达式,不便的编写各类查问条件,无需再放心字段写错
  • 反对主键主动生成:反对多达 4 种主键策略(内含分布式惟一 ID 生成器 – Sequence),可自在配置,完满解决主键问题
  • 反对 ActiveRecord 模式:反对 ActiveRecord 模式调用,实体类只需继承 Model 类即可进行弱小的 CRUD 操作
  • 内置代码生成器:采纳代码或者 Maven 插件可疾速生成 Mapper、Model、Service、Controller 层代码,反对模板引擎,更有超多自定义配置等您来应用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关怀具体操作,配置好插件之后,写分页等同于一般 List 查问
  • 分页插件反对多种数据库:反对 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能剖析插件:可输入 SQL 语句以及其执行工夫,倡议开发测试时启用该性能,能疾速揪出慢查问
  • 内置全局拦挡插件:提供全表 delete、update 操作智能剖析阻断,也可自定义拦挡规定,预防误操作
  • 等,具体请看 mybatis-Plus 官网

    反对数据库

    MySQL,Oracle 等,目前只用到这两个数据库
    架构

    2 疾速开始

    2.1:创立工程

    关上 idea
    第一步

    创立完了点 NEXT
    第二步

    第三步

    第四步

    留神:创立 springboot 工程须要联网,不联网创立不胜利,
    创立完了后是这个界面

    2.2. 规范数据层 crud 性能

    该工程须要应用 mysql,在 pom.xml 文件导入一下依赖包

<dependencies>
        <dependency>
         <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
</dependencies>

导入依赖后:
配置文件 application.yml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mp
    username: root
    password: root

再进行写实体类和 mapper 类
实体:

//getset 办法能够应用 @Data 注解  
  private int id;
// 该注解映射数据库的字段
@TableField(value = "user_name")
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
// 比方在实体类中有一个属性为 remark,然而在数据库中没有这个字段,然而在执行插入操作时给实体类的 remark 属性赋值了,那么能够通过在实体类的 remark 属性上增加。false 示意存在,true 示意存在
@TableField(exist = false)
private Integer remark

mapper:

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
// 这里继承了 BaseMapper 外面的办法

再进行测试:

@Autowired
private UserMapper usermapper;
// 查问全副
@Test
void  text01(){List<User>  userList =usermapper.selectList(null);// 这里为空是因为没有条件。System.out.println(userList);
}
// 依据 id 查问
@Test
void text02(){User userById =usermapper.selectById(1);
}
// 减少数据
@Test
void text03(){User user =new User();
user.setId(1);
user.setUserName("zhangsan");
user.setpassword("zhangsan");
user.setName("张三");user.setAge(18);
user.setEmail("zhangsan@qq.com");
System.out.println(usermapper.insert(user));
}
// 批改
@Test
void text04(){User user = new User();
user.setId(1);
user.setUserName("lisi");
user.setpassword("lisi");
user.setName("李四");
user.setAge(20);
user.setEmail("lisi@qq.com");
System.our.println(usermapper.updateById);
}
// 删除
@Test
void text05(){System.out.println(usermapper.deleteById(1))
}
// 分页查问
@Test
void text06(){Ipage page =new Page(1,2);
usermapper.selectPage(page,null);
System.out.println("以后是第几页"+page.getCurrent());
System.out.println("当前页显示多少条数据"+page.getSize());
System.out.println("一共多少页"+page.getPages());
System.out.println("一共多少条数据"+page.getTotal);
System.out.println("数据"+page.getRecords);
}
// 新建一个类 myconfig
// 测试之前须要增加拦截器,不增加拦截器则是查问全副的 sql 语句,分页查问是原有的根底时上加了一个性能
@Configuration// 须要增加一个注解,不然加载不到
public class myconfig{
@Bean
public MybatisPlusInterceptor mp(){
// 定义拦截器
    MybatisPlusInterceptor mp =new MybatisPlusInterceptor();
// 分页的拦截器是 PageinationInnerInterceptor,mp.addInnerInterceptor (new PageinationInnerInterceptor());
// 将分页拦截器封装到大的拦截器外面
return mp;
    }
}
如果你想看执行的 sql 语句须要在配置文件配置日志
敲个 log 就能显示进去了
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.3:DQL 查问

2.3.1 条件查问

Mybatis-Plus 条件查问有三种写法:
倡议应用第三种

// 第一种:QueryWrapper 格局条件查问。是以字符串模式容易出错。@Test
void text(){QueryWrapper qw=new QueryWrapper();
//lt 是小于。字段,条件
qw.lt("age",18);
System.out.println(userMapper.selectList(qw));
}
// 第二种:lambda 格局条件查问
@Test
void text(){
// 须要增加泛型
QueryWrapper<User> qw =new QueryWrapper<User>();
qw.lambda().lt(User::getAge,18);
System.out.println(userMapper.selectList(qw));
}
// 第三种:@Test 
void text(){LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<User>();
// 这是查问小于 18 岁的,qw.lt(User::getAge,18);
// 这是查问并且的关系
qw.lt(User::getAge,18).gt(User::getAge,1);
qw.between(1,18);
// 或者关系
qw.lt(User::getAge,18).or().gt(User::getAge,1);
System.out.println(userMapper.selectList(qw))
}
// 条件查问 null 断定
如果第一个条件为空时该怎么办呢?
// 新建一个实体类继承 User
public class UserQuery extends User{private Integger age2;}
// 测试
@test
void text(){UserQuery uq =new UserQuery(){uq.setAge(10);
uq.setAge2(30);
LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<User>();
// 意思:当 uq.getAge2 为空时不执行“逗号”前面条件
qw.lt(null != uq.getAge2(),User::getAge,uq.getAge2());
qw.gt(null != uq.getAge(),User::getAge,uq.getAge());
System.out.println(userMapper.selectList(qw))
    }
}
// 查问投影:指指定的字段
// 比方只想看到 id 和姓名和年龄
@Test
void text(){LambdaQueryWrapper<User> qw =new LambdaQueryWrapper<User>();
qw.select(User::getid,User::getusername,User::getage);
System.out,println(userMapper.selectList(qw))
}
// 显示该字段的反复值的总数
@Test
void text(){
QueryWrapper<User> qw = new QueryWrapper<User>;
        qw.select("count(*) as count,age");
        qw.groupBy("age");
        System.out.println(userMapper.selectMaps(qw));
}

id 生成策略

实体:

//AUTO: 应用数据库主动生成的 id
//NONE:不设置 id
//INPUT: 须要手动写 id
//ASSIGN_ID: 雪花算法
@TableId(type =IdType.AUTO)
     private int id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;

正文完
 0