MyBatis-Plus是一个Mybatis增强版工具,在MyBatis上扩充了其它功能没有改变基本功能,也就是只做封装增强不做改变,为了简化开发提交效率而存在,不需要写XML等sql语句就可实现。
1、简述
项目整体结构:
2、 脚本准备
CREATE TABLE
USER
(
id INT NOT NULL AUTO_INCREMENT COMMENT '用户编号',
username VARCHAR(64) COLLATE utf8mb4_bin COMMENT '账号',
password VARCHAR(32) COLLATE utf8mb4_bin COMMENT '密码',
create_time DATETIME COMMENT '创建时间',
deleted bit COMMENT '是否删除。0-未删除;1-删除',
PRIMARY KEY (id),
CONSTRAINT idx_username UNIQUE (username)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3、整合MyBatis-Plus
我们需要分别对dubbo-api,dubbo-provide,dubbo-consumer
dubbo-api: 公共服务接口
dubbo-provide: 服务提供者
dubbo-consumer: 服务消费者
3.1 dubbo-api改造
dubbo-api这边主要加上我们对接的测试接口和数据库实体就可
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>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-api</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<!--给子模块添加父项目,需要给出父项目pom文件路径-->
<parent>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubboparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
<!-- 实现对 MyBatis Plus 的自动化配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
在上一篇的基础上引入了 lombok 和 mybatis-plus-boot-starter。
UserService
public interface UserService {
User selectByUsername(String username);
List<User> selectByIds(Collection<Integer> ids);
IPage<User> selectPageByCreateTime(IPage<User> page, String createTime);
void insertUser(User user);
}
User
@Data
@TableName(value = "user")
public class User implements Serializable {
/**
* 用户编号
*/
private Integer id;
/**
* 账号
*/
private String username;
/**
* 密码(明文)
*
* ps:生产环境下,千万不要明文噢
*/
private String password;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否删除
*/
@TableLogic
private Integer deleted;
}
@TableLogic 注解,设置该字段为逻辑删除的标记。
3.2 dubbo-provide改造
dubbo-provide这边涉及到了数据库的连接,需要改造的地方会比其他模块相对多些
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>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<!--给子模块添加父项目,需要给出父项目pom文件路径-->
<parent>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubboparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<!--添加api依赖-->
<dependency>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
<!-- 实现对数据库连接池的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency> <!-- 本示例,我们使用 MySQL -->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- 实现对 MyBatis Plus 的自动化配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 方便等会写单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- 实现对 Dubbo 的自动化配置 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- 使用 Nacos 作为注册中心 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.4.1</version>
</dependency>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
DubboProviderApplication
@SpringBootApplication
@MapperScan(basePackages = "com.dubboscaffold.dubboprovider.mapper")
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
启动类需要加上MapperScan,扫描对应 Mapper 接口所在的包路径
application.yml
server:
port: 8081
# datasource 数据源配置内容
spring:
application:
name: dubbo-provider
datasource:
url: jdbc:mysql://127.0.0.1:3306/dubbo_master?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
# mybatis-plus 配置内容
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
global-config:
db-config:
id-type: auto # ID 主键自增
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.dubboscaffold.dubboapi.entity
# logging
logging:
level:
# dao 开启 debug 模式 mybatis 输入 sql
cn:
iocoder:
springboot:
lab12:
mybatis:
mapper: debug
# dubbo 配置项,对应 DubboConfigurationProperties 配置类
dubbo:
# Dubbo 应用配置
application:
name: user-service-provider # 应用名
# Dubbo 注册中心配
registry:
address: nacos://192.168.160.128:8848 # 注册中心地址
# Dubbo 服务提供者协议配置
protocol:
port: -1 # 协议端口。使用 -1 表示随机端口。
name: dubbo # 使用 `dubbo://` 协议。更多协议,可见 http://dubbo.apache.org/zh-cn/docs/user/references/protocol/introduction.html 文档
# Dubbo 服务提供者配置
provider:
timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒
TestService:
version: 1.0.0
# 配置扫描 Dubbo 自定义的 @Service 注解,暴露成 Dubbo 服务提供者
scan:
base-packages: com.dubboscaffold.dubboprovider.service.impl
本次新增数据源datasource、mybatis-plus配置、logging日志输出
UserMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
//使用QueryWrapper构造相对灵活的条件,可以避免一些动态Sql的编写
default User selectByUsername(@Param("username") String username) {
return selectOne(new QueryWrapper<User>().eq("username", username));
}
List<User> selectByIds(@Param("ids") Collection<Integer> ids);
//演示分页组件
default IPage<User> selectPageByCreateTime(IPage<User> page, @Param("createTime") String createTime) {
return selectPage(page,
new QueryWrapper<User>().gt("create_time", createTime));
}
}
Mapper的接口名必须与xml对应上
UserMapper.xml
<?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.dubboscaffold.dubboprovider.mapper.UserMapper">
<sql id="fields">
id, username, password, create_time
</sql>
<select id="selectByIds" resultType="User">
SELECT
<include refid="fields"></include>
from user
WHERE id in
<foreach collection="ids" item="id" separator="," open="(" close=")" index="">
#{id}
</foreach>
</select>
</mapper>
<mapper namespace="com.dubboscaffold.dubboprovider.mapper.UserMapper">要对应上UserMapper的路径地址
UserServiceImpl
@Component
@Service(timeout = 10000)
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User selectByUsername(String username) {
return userMapper.selectByUsername(username);
}
@Override
public List<User> selectByIds(Collection<Integer> ids) {
return userMapper.selectByIds(ids);
}
@Override
public IPage<User> selectPageByCreateTime(IPage<User> page, String createTime) {
return userMapper.selectPageByCreateTime(page,createTime);
}
@Override
public void insertUser(User user) {
userMapper.insert(user);
}
}
@Service(timeout = 10000)设置接口超时时间
3.3 dubbo-consumer改造
dubbo-consumer消费者这边只需要新增一个controller就行
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>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<!--给子模块添加父项目,需要给出父项目pom文件路径-->
<parent>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubboparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<!--添加api依赖-->
<dependency>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.5</version>
</dependency>
<!-- 引入 Spring Boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 实现对 Dubbo 的自动化配置 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- 使用 Nacos 作为注册中心 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.4.1</version>
</dependency>
</dependencies>
</project>
application.yml
spring:
application:
name: dubbo-consumer
server:
port: 8082
# dubbo 配置项,对应 DubboConfigurationProperties 配置类
dubbo:
# Dubbo 应用配置
application:
name: user-service-consumer # 应用名
# Dubbo 注册中心配置
registry:
address: nacos://192.168.160.128:8848 # 注册中心地址
# Dubbo 消费者配置
consumer:
timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒
TestService:
version: 1.0.0
UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Reference
private UserService userService;
@RequestMapping("/insertDemo")
public void insertUser(){
User user = new User();
user.setUsername(UUID.randomUUID().toString());
user.setPassword("123");
user.setCreateTime(new Date());
user.setDeleted(0);
userService.insertUser(user);
}
@RequestMapping("/selectByUsername")
public User selectByUsername(String username){
return userService.selectByUsername(username);
}
@RequestMapping("/selectByIds")
public List<User> selectByIds(String ids){
String[] idArr = ids.split(",");
List list = Arrays.asList(idArr);
return userService.selectByIds(list);
}
@RequestMapping("/selectPageByCreateTime")
public IPage selectPageByCreateTime(int currentPage,int pageSize,String createTime){
//int currentPage = 1; //当前页数:显示第一页数据
//Integer pageSize = 2; //每页显示多少:每页显示2条数据
Page<User> page = new Page<User>(currentPage,pageSize);
return userService.selectPageByCreateTime(page,createTime);
}
}
4、项目启动
分别先后启动dubbo-provide,dubbo-consumer
通过postman访问/user/insertDemo接口进行数据添加,如果没有报错就是新增成功了
http://127.0.0.1:8082/user/insertDemo
有了数据后可通过/user/selectPageByCreateTime进行分页查询
剩下的根据id和用户名进行查询的接口大家可以自己试试看,这样子整合MyBatis-Plus就算完成。