MyBatis-Plus与Druid数据源

数据访问层两大核心框架:

  • 全自动的ORM
  • 半自动的ORM

SpringBoot 集成MyBatis-Plus

MyBatis-Plus简称:

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

在这里插入图片描述

MyBatis官网地址:https://mybatis.plus/

MyBatis-Plus特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝滑般顺滑。
  • 损耗小:启动即会自动驻入基本CRUD(添加、删除、修改、查询)的操作,性能基本无损耗,直接面向对象操作。
  • 支持Lambda形式调用:通过Lambda表达式,方便的编写各类查询条件,无需担心字段写错。
  • 支持多种数据库:支持MySql、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer等多种数据库。
  • 请打的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
  • 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询

框架结构:

在这里插入图片描述

Lombok简介和安装:

  • Lombok是一个IDE的插件,可以兑编译器进行增强,是Java代码变得简介、快速。

  • IDEA中安装lombok插件:

    首先打开idea→File→Setting→Plugin→Markplace(或Browse Repositories)→输入Lombok回车进行搜索

    如图:

在这里插入图片描述

因为我提前装好了插件

基本用法:

@Data注解在类上,会为类的所有属性自动生产setter/getter、equals、canEquals、hashCode、toString方法,如果被final(常量)修饰的属性,则不会为该属性生成setter方法。

如果没有用上setter/getter方法,可以通过修改IDEA的设置,需要在File→Settings中修改编译器配置,允许编译环节的注解处理。

在这里插入图片描述

快速上手:

我们首先创建一个项目

在这里插入图片描述

关键依赖包:

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
 <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.18</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
 </dependency>

        <!--        lombok,帮忙省略掉getter/setter方法-->
  • lombok:帮助省略掉Getter/Setter方法
  • mybatis-plus-boot-starter,MyBatis Plus的依赖包,引入MyBatis以及MyBatis-Spring,以避免因版本差异导致的问题。

application.properties配置:

#数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#数据库路径
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=UTF-8

#数据库登录密码
spring.datasource.username=root
#数据库登录账号
spring.datasource.password=123456

#日志输出
logging.level.root=warn
logging.level.com.aiweiyi.qingjing.demo.mapper=trace
logging.pattern.console=%p%m%n

启动类:

在启动类中添加对Mapper包扫描@MapperScan,Spring Boot启动的时候会自动加载包路径下的Mapper:

package com.aiweiyi.qingjing.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.aiweiyi.qingjing.demo.mapper")
public class DemoApplication {

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

}

实体类(User):

package com.aiweiyi.qingjing.demo.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.io.Serializable;

@TableName("sys_user")
public class User implements Serializable {
    @TableId(type = IdType.AUTO)
    @TableField("usr_id")
    private Long usrId;

    @TableField("usr_name")
    private String usrName;

    private String usrPassword;

    private Long usrRoleId;

    private Integer UsrFlag;

    //省略Getter/Setter和toString以及构造方法
}

  • @TableName:注解在类上,指定数据库表名(实体名与表名不一致时需要指定)
  • @TableId(type = IdType.AUTO): 注解在主键属性上,且指定主键生成策略为自动增长。
  • @TableField:主键在属性上,指定数据库字段名(不满足默认匹配规则时需要指定),采用骆驼命名规则的属性,对应的字段名为两个单词之间使用_下划线连接,如属性名为:usrName,字段名为:usr_name

Mapper接口:UserMapper

public interface UserMapper extends BaseMapper<User> {
}

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Resource
private UserMapper userMapper;

    @Test
    public void testSelectById(){
        //主键查询
        User user= userMapper.selectById(24L);
        Assert.assertNotNull(user);
        System.out.println("usrName:"+user.getUsrName());
    }

}

执行效果:

在这里插入图片描述

从上图看,Spring Boot集成,MyBatis-Plus完成。可以看出使用的步骤比较简单、明了。

核心功能:

CRUD接口:

MyBatis-Plus通用的CRUD功能都在BaseMapper接口中,以下是源代码

public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> wrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);

    IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}

说明:

  • BaseMapper接口封装通用CRUD,为MyBatis-Plus启动时自动解析实体表关系映射转换为MyBatis内部对象注入容器。
  • 泛型T为任意实体对象。
  • 参数Serializable为任意类型主键,MyBatis-Plus不推荐使用复合主键,与欸的那个每一张表都有自己的唯一id主键。
  • 对象Wrapper为条件构造器。

执行测试:

    @Test
    public void testInsert(){
        //新增
        userMapper.insert(new User("MyBatis-Plus","123456",8L,1));
    }

    @Test
    public void testFinAll() {
        //查询所有
        List<User> getAll = userMapper.selectList(null);
        getAll.forEach(user -> System.out.println(user));
    }

条件构造器

AbstractWrapper抽象类是QueryWrapper(LambdaQueryWrapper)和UpdateWrapper(LambadaUpdateWrapper)的父类,用于sql的where条件,源代码量比较大

在这里插入图片描述

说明:

  • 源码中出现第一个入参的boolean condition表示该条件时否加入最后生成的sql中。
  • 源码中的多个方法均为从上往下补全个别boolean类型的入参,默认为true。
  • 源码中出现的泛型Param均为Wrapper的子类示例(均具有AbstractWrapper)的所有方法。
  • 源码中的方法在入参中出现的R为泛型,在普通wrapper中是String在LambdaWrapper中是函数。
  • 源码中的方法入参中的R column 均表示数据库字段,当R具体类型为String时则是数据库字段名,(字段名是数据库关键字的自己用转义包裹),而不是实体类数据字段名,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器。
  • 使用中如果入参的Map或者List为空,则不会加入最后生成的sql中。

执行测试:

 @Test
    public void testFind(){
        QueryWrapper<User>wrapper =new QueryWrapper<User>();
        wrapper.eq("usr_name","MyBatis-Plus");
        wrapper.eq("usr_password","123456");
        List<User>list = userMapper.selectList(wrapper);
        Assert.assertNotNull(list);
        list.forEach(user -> System.out.println(user));
    }

在这里插入图片描述

修改:

 @Test
    public void textUpdate(){
        UpdateWrapper<User>wrapper = new UpdateWrapper<User>();
        User user = new User();
        user.setUsrName("ktjiaoyu2");
        wrapper.eq("usr_id",24);
        int num=userMapper.update(user,wrapper);
        System.out.println(num);
    }

在这里插入图片描述

分页插件:
MyBatis-Plus内部提供了分页拦截器,只需要配置注册拦截器即可实现分页功能:
创建config包,并创建MyBatisPlusConfig.java。

package com.aiweiyi.qingjing.demo.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//配置类
@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

测试效果:

    @Test
    public void testPagination(){
        QueryWrapper<User>wrapper = new QueryWrapper<User>();
        wrapper.eq("usr_role_id",10L);
        Page<User>page = new Page<User>();
        IPage<User>userIPage=userMapper.selectPage(page,wrapper);
        System.out.println("总记录数:"+userIPage.getTotal());
        System.out.println("总页数:"+userIPage.getPages());
        System.out.println("当前页数:"+userIPage.getCurrent());
        System.out.println("每页记录数:"+userIPage.getSize());
        System.out.println("当前记录:");
        userIPage.getRecords().forEach(user -> System.out.println(user));
    }

在这里插入图片描述

代码生成器:
AutoGenerator是MyBatis-Plus的代码生成器,通过AutoGenerator可以快速生成Entity、Mapper、Mapper XML、Service、Controller等各个模块

Spring Boot集成Druid数据源:

Druid数据源的优势?
1.有强大的监控特性,通过Druid提供的监控能力,可以清楚的知道连接池和SQL的工作情况。
2.方便扩展,自己可以编写Filter(工具类)拦截JDBC的任何方法,可以监控一些性能、SQL执行情况、执行时间、用户名加密等等
3.Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化

Druid数据源依赖包:

<!--        druid数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

application.properties配置信息:


#server.port=8080

#数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#数据库路径
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=utf-8

#数据库登录密码
spring.datasource.username=root
#数据库登录账号
spring.datasource.password=123456

#日志输出
logging.level.root=warn
logging.level.com.aiweiyi.qingjing.demo.mapper=trace
logging.pattern.console=%p%m%n


#配置druid数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#初始化大小、最小、最大连接数
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10

#配置获取连接等待超时的时间
spring.datasource.druid.max-wait=6000

spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

#配置 StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000



直接运行启动项,通过在浏览器中直接访问即可
网址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值