mybatis-金年会app官方网
在java开发的世界里,持久层框架的选择对于项目的成功至关重要。今天,我们要聊的主角是mybatis-plus——一个增强版的mybatis,它以其强大的功能、简洁的代码和高效的性能,正在成为越来越多开发者的新宠。
那么,mybatis-plus到底是什么?又该如何快速入门呢?让我们一起探索这个强大的工具。
一、mybatis-plus简介
1、简介
mybatis-plus (opens new window)(简称 mp)是一个 mybatis (opens new window)的增强工具,在 mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2、特性
无侵入: 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
损耗小: 启动即会自动注入基本 curd,性能基本无损耗,直接面向对象操作,basemapper。
强大的 crud 操作: 内置通用 mapper、通用 service,仅仅通过少量配置即可实现单表大部分 crud 操作,更有强大的条件构造器,满足各类使用需求,简单的crud操作不用自己编写。
支持 lambda 形式调用: 通过 lambda 表达式,方便的编写各类查询条件,无需再担心字段写错。
支持主键自动生成: 支持多达 4 种主键策略(内含分布式唯一 id 生成器 - sequence),可自由配置,完美解决主键问题。
支持 activerecord 模式: 支持 activerecord 形式调用,实体类只需继承 model 类即可进行强大的 crud 操作。
支持自定义全局通用操作: 支持全局通用方法注入( write once, use anywhere )。
内置代码生成器: 采用代码或者 maven 插件可快速生成 mapper 、 model 、 service 、 controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(自动生成代码)。
内置分页插件: 基于 mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 list 查询。
分页插件支持多种数据库: 支持 mysql、mariadb、oracle、db2、h2、hsql、sqlite、postgre、sqlserver 等多种数据库。
内置性能分析插件: 可输出 sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
内置全局拦截插件: 提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作。
3、框架结构
二、快速入门
1.开发环境
2.创建数据库和表
1)创建表单
create database `mp_study` /*!40100 default character set utf8mb4 */;
use `mp_study`;
create table `user` (
`id` bigint(20) not null comment '主键id',
`name` varchar(30) default null comment '姓名',
`age` int(11) default null comment '年龄',
`email` varchar(50) default null comment '邮箱',
primary key (`id`)
) engine=innodb default charset=utf8;
2)添加数据
insert into user (id, name, age, email) values
(1, 'jone', 18, '[email protected]'),
(2, 'jack', 20, '[email protected]'),
(3, 'tom', 28, '[email protected]'),
(4, 'sandy', 21, '[email protected]'),
(5, 'billie', 24, '[email protected]');
3. 创建springboot工程
1)初始化工程
2)导入依赖
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
<scope>test</scope>
</dependency>
<dependency>
<groupid>com.baomidou</groupid>
<artifactid>mybatis-plus-boot-starter</artifactid>
<version>3.5.1</version>
</dependency>
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<optional>true</optional>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<scope>runtime</scope>
</dependency>
</dependencies>
4. 编写代码
1)配置application.yml
# datasource config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.driver
url: jdbc:mysql://localhost:3306/mybatis_plus?usessl=false&useunicode=true&characterencoding=utf-8&servertimezone=gmt%2b8
username: root
password: 1234
2)启动类
在spring boot启动类中添加@mapperscan注解,扫描mapper包
@mapperscan("cn.frozenpenguin.mapper")
@springbootapplication
public class mybatisplusstudyapplication {
public static void main(string[] args) {
springapplication.run(mybatisplusstudyapplication.class, args);
}
}
3)添加实体类
@data//lombok注解
public class user {
private long id;
private string name;
private integer age;
private string email;
}
4)添加mapper
basemapper是mybatis-plus提供的模板mapper,其中包含了基本的crud方法,泛型为操作的实体类型。
public interface usermapper extends basemapper<user> {
}
5)测试
@autowired
private usermapper usermapper;
@test
void test01(){
list<user> users = usermapper.selectlist(null);
for (user user : users) {
system.out.println(user);
}
}
结果
注意:
idea在 usermapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确执行。为了避免报错,可以在mapper接口上添加 @repository注解。
6)添加日志
我们所有的sql现在是不可见的,我们希望知道它是怎么执行的,所以我们必须要看日志!
在application.yml中配置日志输出
# 配置日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.stdoutimpl
mapper-locations:
三、基本crud
1.插入
@test
void insert()
user user = new user(null, "lisi", 2, "[email protected]");
int insert = usermapper.insert(user);
system.out.println("受影响行数"insert);
//1511332162436071425
system.out.println(user.getid());
}
id设置为null,却插入了1511332162436071425,这是因为mybatis-plus在实现插入数据时,会默认基于雪花算法的策略生成id。
2.删除
1)通过id删除记录
@test
void testdeletebyid(){
//delete from user where id=?
int result = usermapper.deletebyid(1);
system.out.println("受影响行数:"result);
}
- 通过id批量删除记录
@test
void testdeletebatchids(){
//delete from user where id in ( ? , ? , ? )
int result = usermapper.deletebatchids(ids);
system.out.println("受影响行数:"result);
}
- 通过map条件删除记录
@test
void testdeletebymap(){
//delete from user where name = ? and age = ?
map<string,object> map=new hashmap<>();
map.put("age",12);
map.put("name","lisi");
int result = usermapper.deletebymap(map);
system.out.println("受影响行数:"result);
}
3. 修改
@test
void testupdatebyid(){
//select id,name,age,email from user where id=?
user user = new user(10l, "hello", 12, null);
int result = usermapper.updatebyid(user);
//注意:updatebyid参数是一个对象
system.out.println("受影响行数:"result);
}
4.自动填充
创建时间、修改时间!这些个操作都是自动化完成的,我们不希望手动更新!
阿里巴巴开发手册:所有的数据库表:gmt_create、gmr_modified、几乎所有的表都要配置上!而且需要自动化!
方式一:数据库级别(工作中不允许修改数据库)
1)在表中新增字段 create_time, update_time;
2)再次测试插入方法,我们需要先把实体类同步!
3)再次更新查看结果即可。
方式二:代码级别
删除数据库的默认值,更新操作
实体类的字段属性上需要加注解
@tablefield(fill = fieldfill.insert)
private date createtime;
@tablefield(fill = fieldfill.insert_update)
private date updatetime;
- 编写处理器处理注解
@component
public class mymetaobjecthandler implements metaobjecthandler {
@override
public void insertfill(metaobject metaobject) {
// 起始版本 3.3.0(推荐使用)
this.strictinsertfill(metaobject, "createtime", localdatetime.class, localdatetime.now());
}
@override
public void updatefill(metaobject metaobject) {
// 起始版本 3.3.0(推荐)
this.strictupdatefill(metaobject, "updatetime", localdatetime.class, localdatetime.now());
}
}
测试插入
测试更新、观察时间即可
你还在苦恼找不到真正免费的编程学习平台吗?可以试试【云端源想】!课程视频、知识库、微实战、云实验室、一对一咨询……你想要的全部学习资源这里都有,重点是现在还是免费的!
5.查询
与查询基本一致;
根据id查询用户信息;
根据多个id查询多个用户信息;
通过map条件查询用户信息;
查询所有数据;
@test
void test01(){
list<user> users = usermapper.selectlist(null);
for (user user : users) {
system.out.println(user);
}
}
通过观察basemapper中的方法,大多方法中都有wrapper类型的形参,此为条件构造器,可针 对于sql语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据。
6.通用service
说明:
通用 service crud 封装iservice接口,进一步封装 crud;
采用 get 查询单行;
remove 删除;
list 查询集合;
page 分页;
前缀命名方式区分 mapper 层避免混淆;
泛型 t 为任意实体对象;
建议如果存在自定义通用 service 方法的可能,请创建自己的 ibaseservice 继承 mybatis-plus 提供的基类;
金年会app官方网官网地址:
1)iservice
mybatis-plus中有一个接口 iservice和其实现类 serviceimpl,封装了常见的业务层逻辑 详情查看源码iservice和serviceimpl。
2)创建service接口和实现
/**
* userservice继承iservice模板提供的基础功能
*/
public interface userservice extends iservice<user> {
}
/**
* serviceimpl实现了iservice,提供了iservice中基础功能的实现
* 若serviceimpl无法满足业务需求,则可以使用自定的userservice定义方法,并在实现类中实现
*/
@service
public class userserviceimpl extends serviceimpl<usermapper, user> implements userservice {
}
3)测试查询记录数
@test
void testgetcount(){
long count = userservice.count();
system.out.println("总记录数:" count);
}
4)测试批量插入
@test
void testsavebatch(){
// sql长度有限制,海量数据插入单条sql无法实行,
// 因此mp将批量插入放在了通用service中实现,而不是通用mapper
arraylist<user> users = new arraylist<>();
for (int i = 0; i < 5; i) {
user user = new user();
user.setname("lyl"i);
user.setage(20i);
users.add(user);
}
//sql:insert into t_user ( username, age ) values ( ?, ? )
userservice.savebatch(users);
}
原理:先把user对象存到list(存在内存中),然后直接save集合list中的所有user。
mybatis-plus作为mybatis的增强版,不仅继承了mybatis的所有优点,还在此基础上做了大量的改进和扩展。它的出现,无疑为java开发者提供了一个更为强大、便捷的数据操作工具。
技术的世界总是在不断进步,而我们作为开发者,也需要不断学习新的工具和技术。mybatis-plus正是这样一把钥匙,它能打开高效数据操作的大门。希望本文能帮助您快速入门mybatis-plus!
本作品采用《cc 协议》,转载必须注明作者和本文链接