MyBatis-Plus与Druid数据源
- SpringBoot 集成MyBatis-Plus
- 条件构造器
- Spring Boot集成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
直接运行启动项,通过在浏览器中直接访问即可
网址