Mybatis-Plu只为增强而生
一、初始MyBatis-Plus
官方网址:https://baomidou.com/
官方对MyBatis-Plus的解释: MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
总结: MP可以看作是MyBatis的好大哥。黑风寨的二把手,李云龙的和尚。魂斗罗的2P。有了MP,MyBatis可以不再写xxxmapper.xml便可以实现对数据库的持久化操作。可谓是便捷省事。
二、如何使用
在这里都是参考官网的教程,如有遗漏可移步官网参考,不喜勿喷,礼貌学习。
1、环境准备
- jdk1.8
- SpringBoot/Spring【官方推荐SpringBoot】
- Maven3.6.6
- Eclipse
2、新建数据库
既然是持久层矿建MyBatis的增强工具,那么必然需要一个数据库来进行相关的操作。
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
为了方便测试,所以往数据库中新加一些数据,方便测试。
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
3、新建SpringBoot项目,并前期工作
- SpringBoot
- MySQL/Oracel
- MyBtais-PLUS
- Lombok
- …
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
连接数据库配置文件以及SQL日志
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mybatis_plus?characterEncoding=UTF-8&useSSL=true&useUnicode=true&serverTimezone=UTC
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
新建几个包:mapper、servcie、test、pojo…具体的项目目录结构如下:
4、编写各层代码
pojo层对数据表的实体进行封装
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User {
private Long id;
private String name;
private Integer age;
private String email;
public User(String name, Integer age, String email) {
super();
this.name = name;
this.age = age;
this.email = email;
}
}
1️⃣通用Mapper
mapper层使用MP的通用Mapper进行操作,需要注意的是: 使用MP的通用Mapper必须要继承BaseMapper的这个类
,这个类是有泛型的,反省对应着你的数据库的POJO类。
@Repository("userMapper")
public interface UserMapper extends BaseMapper<User>{
}
2️⃣通用Service
MP的通用Service是MP所提供的一种对原始mapper层的CRUD的封装调用
使用:
- 想要使用MyBatis-Plus的通用Service,首先我们需要写一个Service,然后继承MyBatis-Plus的通用Service(IService)。
- 然后再写一个ServiceImpl并且继承MyBatis-Plus的ServiceImpl<M extends BaseMapper, T>,当然还要实现我们写的Service。
1、
public interface IUserService extends IService<User>{
}
2、
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper , User> implements IUserService{
}
5、在启动类上加@MapperScann注解扫描mapper的包
在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:
@SpringBootApplication
// 扫描Mapper接口所在的包
@MapperScan("com.wei.mapper")
public class DhcMpProjectApplication {
public static void main(String[] args) {
SpringApplication.run(DhcMpProjectApplication.class, args);
}
}
6、编写测试类进行测试
package com.wei;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.w3c.dom.html.HTMLBaseElement;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wei.mapper.UserMapper;
import com.wei.pojo.User;
@SpringBootTest
public class MyTest {
// 注入Mapper的Bean
@Autowired
private UserMapper userMapper;
/**
* 新增数据 参数是一个实体对象
*/
@Test
public void test2() {
// 新增用户信息 INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
User user = new User("joker",23,"joker@qq.com");
int insert = userMapper.insert(user);
System.out.println("成功插入"+insert+"条数据");
// 在MyBatis里默认是使用雪花算法创建id 不会默认使用数据库里面的自增主键
System.out.println("id:"+user.getId());
}
/**
* 通过id删除数据
*/
@Test
public void test3() {
// 根据id删除 DELETE FROM user WHERE id=?
int deleteById = userMapper.deleteById(1529380500983910401L);
System.out.println("成功删除"+deleteById);
}
/**
* 通过map条件集合删除
*/
@Test
public void test4() {
// 根据条件删除数据 可以删除多个 DELETE FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("age", 23);
int deleteByMap = userMapper.deleteByMap(map);
System.out.println("删除了"+deleteByMap);
}
/**
* 批量删除
*/
@Test
public void test5() {
// 批量删除 DELETE FROM user WHERE id IN ( ? , ? )
Collection<Long> ids = new ArrayList<>();
ids.add(5L);
ids.add(2L);
int deleteBatchIds = userMapper.deleteBatchIds(ids);
System.out.println("删除了"+deleteBatchIds+"条数据");
}
/**
* 修改方法 参数为一个实体对象
*/
@Test
public void test6() {
// 根据id修改数据 UPDATE user SET name=?, age=?, email=? WHERE id=?
User user = new User(1L,"koppy",45,"koppy@163.com");
int updateById = userMapper.updateById(user);
System.out.println("修改了"+updateById+"条数据");
}
/**
* 查询方法 参数是一个条件warpper
*/
@Test
public void test7() {
List<Long> list = Arrays.asList(1L,2L,3L);
List<User> selectBatchIds = userMapper.selectBatchIds(list);
selectBatchIds.forEach(System.out::println);
}
/**
* 查询方法 参数是一个条件map
*/
@Test
public void test8() {
Map<String, Object> maps =new HashMap<>();
maps.put("name", "koppy");
maps.put("age", 45);
List<User> selectByMap = userMapper.selectByMap(maps);
selectByMap.forEach(System.out::println);
}
/**
* 查询方法 参数是一个条件warpper
*/
@Test
public void test9() {
Map<String, Object> maps =new HashMap<>();
maps.put("name", "koppy");
maps.put("age", 45);
List<User> selectByMap = userMapper.selectList(null);
selectByMap.forEach(System.out::println);
}
}
至此,MP的入门就到此为止了!
三、 总结:
- 对于MP的使用,可以帮助我们达到快速开发的目的,但是正所谓任何事物都有其双面性,我们往往只关注其便捷,有利的一面,却忽略了他的前期工作,在学此篇之前,我们必须要熟练掌握JDBC的所有操作以及数据库的相关知识。
- 在对MP的使用上,如果采用SpringBoot进行操作,必须要在起动类上加上MapperScan的注解
- 使用通用Mapper需要继承BaseMapper<T Entity >
- 使用通用Service 需要在接口上继承IService<T Entity>的接口,同时还要再实现类上继承ServiceImpl<M extends BaseMapper<T>, T>接口,同时实现 IService