Mybatis-pus作为Mybatis的增强版 不用多说,肯定是使数据库的crud操作更加简单快捷
特性:
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、 SQLServer2005、SQLServer 等多种数据库
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由 配置,完美解决主键问题
支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强 大的 CRUD 操作 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等 同于普通 List 查询
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢 查询
内置全局拦截插件:提供全表 delete 、update 操作智能分析阻断,也可自定义拦截规则,预防误 操作
内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
案列(查询操作):
该案列所需要用到的相关注解:
@TableName("tb_user") 把数据库表与实体类进行绑定
@TableId("ID") 把数据库主键和实体类属性进行绑定
@TableField("USER_NAME") 把数据库键和实体类属性进行绑定
mybatis-plus包:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
完整Pom:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--简化代码的工具包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--mybatis-plus的springboot支持-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
application.properties配置文件:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mq?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
# 如果你全部都是使用的mybatis-plus的方法 则下面的配置可以不需要
mybatis-plus.mapper-locations = classpath:mybatis/*.xml
# 设置别名包扫描路径,通过该属性可以给包中的类注册别名
mybatis-plus.type-aliases-package =com.qrq.mybatisplusd.entity
mapper.xml:
//如果你没有使用自定义的方法 全部都是使用的mybatis-plus的方法 则可以不创建这个mapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qrq.mybatisplusd.dao.TbUserDao">
</mapper>
dao:
//创建一个接口实现BaseMapper<你的实体类> 这个接口 即可
public interface TbUserDao extends BaseMapper<TbUser> {
}
entity:
//下面三个注解的作用是 自动生成有参,无参构造方法 和get set 等方法
@Data
@NoArgsConstructor
@AllArgsConstructor
//与数据库表进行绑定
@TableName("tb_user")
public class TbUser {
//与数据库主键id进行绑定 并设置为自增长
@TableId(type = IdType.AUTO)
private Long id;
// 与数据库普通字段进行绑定
@TableField("USER_NAME")
private String userName; //驼峰命名,则无需注解
@TableField("PASSWORD")
private String password;
@TableField("NAME")
private String name;
@TableField("AGE")
private Integer age;
@TableField("EMAIL")
private String email;
}
测试(CRUD):
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class MybatisPlusdApplicationTests {
@Resource
private TbUserDao userMapper;
@Test
public void testSelect() {
TbUser user=userMapper.selectById(2);
System.out.println(user);
}
// 删除
@Test
public void del(){
userMapper.deleteById(4);
}
// 添加
@Test
public void add(){
TbUser tbUser = new TbUser("三体1","12333","santi",12,"3300892656@qq.com");
int insert = userMapper.insert(tbUser);
TbUser update = new TbUser();
if (insert!=0){
System.out.println("添加成功");
}
}
// 修改
@Test
public void update(){
TbUser tbUser = new TbUser(2L,"三体3","12333","santi",12,"3300892656@qq.com");
userMapper.updateById(tbUser);
}
}
条件构造器QueryWrapper:
当查询时 ,需要的条件过多 普通查询已经没法满足我们的要求时,就需要使用条件构造器
比较操作
eq 等于 =
ne 不等于 <>
gt 大于 >
ge 大于等于 >=
lt 小于 <
le 小于等于 <=
between BETWEEN 值1 AND 值2
notBetween NOT BETWEEN 值1 AND 值2
in 字段 IN (value.get(0), value.get(1), ...)
notIn 字段 NOT IN (v0, v1, ...)
模糊查询
like LIKE '%值%' :
例: like("name", "王") ---> name like '%王%'
notLike NOT LIKE '%值%' :
例: notLike("name", "王") ---> name not like '%王%'
like Left LIKE '%值' :
例: likeLeft("name", "王") ---> name like '%王'
likeRight LIKE '值%' :
例: likeRight("name", "王") ---> name like '王%'
排序
orderBy 排序:
例: orderBy(true, true, "id", "name") ---> order by id ASC,name ASC
orderByAsc 排序:
例: orderByAsc("id", "name") ---> order by id ASC,name ASC
orderByDesc 排序:
例: orderByDesc("id", "name") ---> order by id DESC,name DESC
逻辑查询
or 拼接 OR
主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)
// 查询账号等于三体3 or 密码等于12333
q1.eq("user_name","三体3").or().eq("password","12333");
and AND 嵌套
例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着')
// 查询账号等于三体3 and 密码等于12333
q1.eq("user_name","三体3").eq("password","12333");
分页查询:
1、定义一个分页配置对象
@Configuration
public class Page {
// 定义一个分页 对象
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
2、测试:
// mybatis-plus 分页查询
@Test
public void page(){
// 创建一个page对象 从第一条数据 开始查询 查询 2条
Page<TbUser> page = new Page<>(1,2);
// 创建一个查询条件构造器
QueryWrapper<TbUser> queryWrapper=new QueryWrapper<>();
// user_name=三体
queryWrapper.eq("user_name","三体");
// 使用分页方法 把封装好的分页对象和查询条件 传递进去 并返回查询的结果的全部信息 比如数据行数
IPage<TbUser> tbUserIPage = userMapper.selectPage(page,queryWrapper);
//获取到查询出来的List集合
List<TbUser> records = tbUserIPage.getRecords();
// 输出
for (TbUser record : records) {
System.out.println(record.getAge());
}
}
Mybatis-Plus的Service封装
MP对业务层 也进行了封装 使我们开发效率更高
创建 service接口并寄出mq类
public interface TbUserService extends IService<TbUser> {
}
创建serviceImp继承mq的类 并实现我们自定义的service接口类
@Service
public class TbUserServiceImp extends ServiceImpl<TbUserDao, TbUser> implements TbUserService {
}
这样 我们就直接在controller层调用业务层实现类 就能操作数据库 而不用去调用dao层