title: mybatisplus入门案例
date: 2023-03-10 22:56:09
tags:
sql文件
/*
SQLyog Ultimate v11.25 (64 bit)
MySQL - 5.7.34-log : Database - mybatis_plus
*********************************************************************
*/
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `mybatis_plus`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT 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 AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
/*Data for the table `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');
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.11</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.atguigu</groupId>
<artifactId>mybatisplus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatisplus</name>
<description>mybatisplus</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
a>配置application.yml
spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库的各个信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
b>启动类
在Spring Boot启动类中添加@MapperScan注解,扫描mapper包
package com.atguigu.mybatisplus;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.atguigu.mybatisplus.mapper")
public class MybatisplusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisplusApplication.class, args);
}
}
c>添加实体
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
d>添加mapper
BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的实体类型
@Repository//或者@Mapper也行
public interface UserMapper extends BaseMapper<User> {
}
e>测试
@SpringBootTest
class MybatisplusApplicationTests {
@Autowired()
private UserMapper userMapper;
@Test
public void setUserMapper(){
userMapper.selectList(null).forEach(System.out::println);
}
}
运行结果
2023-03-10 23:05:29.364 INFO 6208 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...2023-03-10 23:05:29.669 INFO 6208 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@1492276401 wrapping com.mysql.cj.jdbc.ConnectionImpl@46b2dcc5] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user==> Parameters: <== Columns: id, name, age, email<== Row: 1, Jone, 18, test1@baomidou.com<== Row: 2, Jack, 20, test2@baomidou.com<== Row: 3, Tom, 28, test3@baomidou.com<== Row: 4, Sandy, 21, test4@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 5
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32ec9c90]
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
2023-03-10 23:05:29.750 INFO 6208 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2023-03-10 23:05:29.753 INFO 6208 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
Process finished with exit code 0
基本CRUD
插入
@Test
public void testInsert(){
User user = new User();
user.setName("狂神");
user.setAge(23);
user.setEmail("kuangshen@atguigu.com");
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
//1475754982694199298
System.out.println("id自动获取:"+user.getId()); }
}
JDBC Connection [HikariProxyConnection@1656143941 wrapping com.mysql.cj.jdbc.ConnectionImpl@58f254b1] will not be managed by Spring==> Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )==> Parameters: 1634411039222972418(Long), 狂神(String), 23(Integer), kuangshen@atguigu.com(String)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12c0c0b3]受影响行数:1id自动获取:1634411039222972418
最终执行的结果,所获取的id为1475754982694199298
这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id
删除
a>通过id删除记录
@Test
public void testDeleteById(){
//通过id删除用户信息
// DELETE FROM user WHERE id=?
int result=userMapper.deleteById(1634411039222972418L);
System.out.println("受影响行数:"+result);
}
JDBC Connection [HikariProxyConnection@1153180745 wrapping com.mysql.cj.jdbc.ConnectionImpl@3c28e5b6] will not be managed by Spring==> Preparing: DELETE FROM user WHERE id=?==> Parameters: 1634411039222972418(Long)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@9c73fff]受影响行数:1
b>通过id批量删除记录
java.util.Arrays.asList() 的一般用法
List 是一种很有用的数据结构,如果需要将一个数组转换为 List 以便进行更丰富的操作的话,可以这么实现:
@Test
public void testDeleteBatchIds(){
//通过多个id批量删除
// DELETE FROM user WHERE id IN ( ? , ? , ? )
List<Long> idList = Arrays.asList(1L,2L,3L);
int result = userMapper.deleteBatchIds(idList);
System.out.println("受影响行数:"+result);
}
JDBC Connection [HikariProxyConnection@1257058590 wrapping com.mysql.cj.jdbc.ConnectionImpl@4c38cd16] will not be managed by Spring==> Preparing: DELETE FROM user WHERE id IN ( ? , ? , ? )==> Parameters: 1(Long), 2(Long), 3(Long)<== Updates: 3Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a97b17c]受影响行数:3
c>通过map条件删除记录
@Test
public void testDeleteByMap() {
//根据map集合中所设置的条件删除记录
// DELETE FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("age",23);
map.put("name","张三");
int result = userMapper.deleteByMap(map);
System.out.println("受影响行数:"+result);
}
JDBC Connection [HikariProxyConnection@1097397209 wrapping com.mysql.cj.jdbc.ConnectionImpl@353e6389] will not be managed by Spring==> Preparing: DELETE FROM user WHERE name = ? AND age = ?==> Parameters: 张三(String), 23(Integer)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@343e225a]受影响行数:1
修改
@Test
public void testUpdateById(){
User user = new User();
user.setId(4L);
user.setName("李四");
user.setEmail("lisi@atguigu.com");
int result = userMapper.updateById(user);
System.out.printf("result"+result);
}
JDBC Connection [HikariProxyConnection@988876043 wrapping com.mysql.cj.jdbc.ConnectionImpl@6806468e] will not be managed by Spring==> Preparing: UPDATE user SET name=?, email=? WHERE id=?==> Parameters: 李四(String), lisi@atguigu.com(String), 4(Long)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@60aec68a]
查询
a>根据id查询用户信息
@Test
public void testSelectById(){
//根据id查询用户信息
// SELECT id,name,age,email FROM user WHERE id=?
User user = userMapper.selectById(4L);
System.out.println(user);
}
JDBC Connection [HikariProxyConnection@1819552644 wrapping com.mysql.cj.jdbc.ConnectionImpl@5db3d57c] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user WHERE id=?==> Parameters: 4(Long)<== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Total: 1
b>根据多个id查询多个用户信息
@Test
public void testSelectBatchIds(){
//根据多个id查询多个用户信息
// SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
List<Long> idList = Arrays.asList(4L, 5L);
List<User> list = userMapper.selectBatchIds(idList);
list.forEach(System.out::println);
}
JDBC Connection [HikariProxyConnection@833272193 wrapping com.mysql.cj.jdbc.ConnectionImpl@26be9a6] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )==> Parameters: 4(Long), 5(Long)<== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2
c>通过map条件查询用户信息
@Test
public void testSelectByMap(){
//通过map条件查询用户信息
// SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("age",21);
map.put("name","李四");
List<User> list = userMapper.selectByMap(map);
list.forEach(System.out::println);
}
JDBC Connection [HikariProxyConnection@1745241742 wrapping com.mysql.cj.jdbc.ConnectionImpl@3c7b137a] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user WHERE name = ? AND age = ?==> Parameters: 李四(String), 21(Integer)<== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Total: 1
d>查询所有数据
@Test
public void testSelectList(){
//查询所有用户信息
// SELECT id,name,age,email FROM user
List<User> list = userMapper.selectList(null);
list.forEach(System.out::println);
}
JDBC Connection [HikariProxyConnection@1015139714 wrapping com.mysql.cj.jdbc.ConnectionImpl@111c229c] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user==> Parameters: <== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2
通过观察BaseMapper中的方法,大多方法中都有Wrapper类型的形参,此为条件构造器,可针
对于SQL语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据
通用Service
说明:
通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删
除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
泛型 T 为任意实体对象
建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承
Mybatis-Plus 提供的基类
a>IService
MyBatis-Plus中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑
详情查看源码IService和ServiceImpl
b>创建Service接口和实现类
package com.atguigu.mybatisplus.service;
import com.atguigu.mybatisplus.pojo.User;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* UserService继承IService模板提供的基础功能
*/
public interface UserService extends IService<User> {
}
package com.atguigu.mybatisplus.service.impl;
import com.atguigu.mybatisplus.mapper.UserMapper;
import com.atguigu.mybatisplus.pojo.User;
import com.atguigu.mybatisplus.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/***
* ServiceImpl实现了IService,提供了IService中基础功能的实现
* * 若ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现
* */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
c>测试查询记录数
@Autowired
private UserService userService;
@Test
public void testGetCount(){
long count = userService.count();
System.out.println("总记录数:" + count);
}
JDBC Connection [HikariProxyConnection@1684368286 wrapping com.mysql.cj.jdbc.ConnectionImpl@6870cfac] will not be managed by Spring==> Preparing: SELECT COUNT( * ) FROM user==> Parameters: <== Columns: COUNT( * )<== Row: 2<== Total: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@297c9a9b]总记录数:2
d>测试批量插入
@Test
public 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("xcw"+i);
user.setAge(8+i);
users.add(user);
}
//SQL:INSERT INTO t_user ( username, age ) VALUES ( ?, ? )
userService.saveBatch(users)
}
JDBC Connection [HikariProxyConnection@929066990 wrapping com.mysql.cj.jdbc.ConnectionImpl@33d28f0a] will be managed by Spring==> Preparing: INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )==> Parameters: 1634861531262742529(Long), xcw0(String), 8(Integer)==> Parameters: 1634861531417931777(Long), xcw1(String), 9(Integer)==> Parameters: 1634861531417931778(Long), xcw2(String), 10(Integer)==> Parameters: 1634861531417931779(Long), xcw3(String), 11(Integer)==> Parameters: 1634861531417931780(Long), xcw4(String), 12(Integer)
关注尚硅谷谢谢喵