前言
mybatis是我们常用的orm框架,我们通过在xml中编写sql语句操作数据库,很灵活;但是,也因此需要编写大量的sql语句,尤其是一些简单的sql语句,简单重复的劳动是无法容忍的!Mybatis-plus很好的解决了这个问题。
1.Mybatis-plus简介
这是一个mybatis增强工具,详细的介绍可以参考上述官网。
2.springboot整合mybatis-plus
依赖信息
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
当前项目使用的全部依赖信息如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </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> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
application.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/kwin?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
dbcp2:
max-idle: 5
max-wait-millis: 10000
min-idle: 2
initial-size: 3
validation-query: SELECT 1
time-between-eviction-runs-millis: 18800
mybatis-plus:
# xml扫描,多个目录用逗号或者分号分隔
mapper-locations: classpath:mapper/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.kwin.**.entity
global-config:
db-config:
# 全局默认主键类型
# AUTO(0),//数据库自增 依赖数据库
# NONE(1),// 表示该类型未设置主键类型 (如果没有主键策略)默认根据雪花算法生成
# INPUT(2),//用户输入ID(该类型可以通过自己注册填充插件进行填充)
# ASSIGN_ID(3), //全局唯一数值类型
# ASSIGN_UUID //全局唯一(UUID)
id-type: ASSIGN_UUID
# 表前缀
#table-prefix: null
# 表名是否使用驼峰转下划线命名,只对表名生效
# 默认值:true
tableUnderline: true
# 大写命名,对表名和字段名均生效
capitalMode: false
# 逻辑已删除值,(逻辑删除下有效)
logic-delete-value: 1
# 逻辑未删除值,(逻辑删除下有效)
logicNotDeleteValue: 0
configuration:
cache-enabled: false
# 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。
map-underscore-to-camel-case: true
# 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
call-setters-on-nulls: true
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
sql脚本
DROP TABLE IF EXISTS USER;
CREATE TABLE USER
(
id BIGINT(20) NOT NULL 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)
);
INSERT INTO USER (id, NAME, age, email) VALUES
(1, 'test1', 1, 'test1@kwin.com'),
(2, 'test2', 2, 'test2@kwin.com'),
(3, 'test3', 3, 'test3@kwin.com'),
(4, 'test4', 4, 'test4@kwin.com'),
(5, 'test5', 5, 'test5@kwin.com');
创建实体
package com.kwin.test.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author : Kwin
* @version V1.0
* @Package com.kwin.test.entity
* @Description:
* @date 2021年06月10日 17:37
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user")
public class User extends Model<User> {
@TableId
private Long id;
private String name;
private int age;
private String email;
@Override
protected Serializable pkVal() {
return id;
}
}
创建mapper
package com.kwin.test.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kwin.test.entity.User;
/**
* @author : Kwin
* @version V1.0
* @Package com.kwin.test.mapper
* @Description:
* @date 2021年06月10日 17:38
**/
public interface UserMapper extends BaseMapper<User> {
}
创建service接口及实现类
package com.kwin.test.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.kwin.test.entity.User;
/**
* @author : Kwin
* @version V1.0
* @Package com.kwin.test.service
* @Description:
* @date 2021年06月10日 17:44
**/
public interface UserService extends IService<User> {
}
package com.kwin.test.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kwin.test.entity.User;
import com.kwin.test.mapper.UserMapper;
import com.kwin.test.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author : Kwin
* @version V1.0
* @Package com.kwin.test.service.impl
* @Description:
* @date 2021年06月10日 17:45
**/
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
基本的代码结构就完成了
最后别忘记在项目启动类添加如下注解
@MapperScan("com.kwin.test.mapper")
现在需要进行测试一下成果
测试1
package com.kwin.test;
import com.kwin.test.entity.User;
import com.kwin.test.mapper.UserMapper;
import com.kwin.test.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class TestApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void testSelect() {
List<User> userList = userMapper.selectList(null);
for(User user:userList) {
System.out.println(user);
}
}
}
结果如下
测试2
package com.kwin.test;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.kwin.test.entity.User;
import com.kwin.test.service.UserService;
@SpringBootTest
class TestApplicationTests {
@Autowired
private UserService userService;
@Test
void test2() {
List<User> userList = userService.list();
for(User user:userList) {
System.out.println(user);
}
}
}
结果
测试3
package com.kwin.test;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.kwin.test.entity.User;
import com.kwin.test.service.UserService;
@SpringBootTest
class TestApplicationTests {
@Autowired
private UserService userService;
@Test
void test3() {
User user = new User();
user.setId(6L);
user.setName("Kwin");
user.setAge(28);
user.setEmail("110@qq.com");
userService.save(user);
List<User> userList = userService.list();
for(User user1:userList) {
System.out.println(user1);
}
}
}
结果
测试4
package com.kwin.test; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import com.kwin.test.entity.User; import com.kwin.test.service.UserService; @SpringBootTest class TestApplicationTests { @Autowired private UserService userService; @Test void test4() { User user = new User(); user.setId(7L); user.setName("test7"); user.setAge(77); user.setEmail("1107@qq.com"); boolean result = user.insert(); System.out.println("result is " + result); List<User> userList = userService.list(); for(User user1:userList) { System.out.println(user1); } } }
结果