Java MyBatis 模仿 MyBatis-Plus
·
Java MyBatis 模仿 MyBatis-Plus
1 Java
1 IService.java
package com.xu.wrapper.service;
import com.xu.wrapper.lambda.AbstractWrapper;
import com.xu.wrapper.lambda.LambdaQueryChainWrapper;
import com.xu.wrapper.lambda.LambdaUpdateChainWrapper;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
public interface IService<T> {
/**
* 新增
*
* @param bean 类
* @return 结果
*/
boolean save(T bean);
/**
* 批量新增
*
* @param beans 类
* @return 结果
*/
boolean saveBatch(Collection<T> beans);
/**
* 删除(主键)
*
* @param id 主键
* @return 结果
*/
boolean removeById(Serializable id);
/**
* 批量删除(主键)
*
* @param ids 主键
* @return 结果
*/
boolean removeByIds(Collection<? extends Serializable> ids);
/**
* 更新(主键)
*
* @param entity 类
* @return 结果
*/
boolean updateById(T entity);
/**
* 批量更新(自定义条件)
*
* @param beans 类
* @return 影响行数
*/
boolean updateBatch(@Param("beans") Collection<T> beans);
/**
* 批量更新(自定义条件)
*
* @param table 表名称
* @param beans 类
* @return 影响行数
*/
boolean updateBatch(@Param("table") String table, @Param("beans") Collection<T> beans);
/**
* 查询
*
* @param id 主键
* @return 数据
*/
T getById(Serializable id);
/**
* 查询
*
* @param ids 主键
* @return 数据
*/
List<T> getById(Collection<? extends Serializable> ids);
/**
* 查询所有
*
* @return 数据
*/
List<T> list();
/**
* 根据 Wrapper,查询列表
* @param queryWrapper 实体对象封装操作类
* @return 实体列表
*/
List<T> list(AbstractWrapper<T, ?> queryWrapper);
/**
* 查询
*
* @param bean 类
* @return 数据
*/
List<T> list(T bean);
/**
* 获取 Lambda 链式查询器
*
* @return LambdaQueryChainWrapper
*/
LambdaQueryChainWrapper<T> lambdaQuery();
/**
* 获取 Lambda 链式更新器
*
* @return LambdaUpdateChainWrapper
*/
LambdaUpdateChainWrapper<T> lambdaUpdate();
}
2 ServiceImpl.java
package com.xu.wrapper.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.xu.wrapper.lambda.AbstractWrapper;
import com.xu.wrapper.lambda.LambdaQueryChainWrapper;
import com.xu.wrapper.lambda.LambdaUpdateChainWrapper;
import com.xu.wrapper.mapper.BaseMapper;
import com.xu.wrapper.service.IService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* 默认Service实现类
*
* @param <M>
* @param <T>
*/
@Slf4j
public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
@Autowired
protected M baseMapper;
@Override
public boolean save(T entity) {
if (null == entity) {
return false;
}
return baseMapper.insert(entity) > 0;
}
@Override
public boolean saveBatch(Collection<T> coll) {
if (CollUtil.isEmpty(coll)) {
return false;
}
return baseMapper.insertBatch(coll) == CollUtil.size(coll);
}
@Override
public boolean removeById(Serializable id) {
if (null == id) {
return false;
}
return baseMapper.deleteById(id) > 0;
}
@Override
public boolean removeByIds(Collection<? extends Serializable> ids) {
if (CollUtil.isEmpty(ids)) {
return false;
}
return baseMapper.deleteByIds(ids) == CollUtil.size(ids);
}
@Override
public boolean updateById(T entity) {
if (null == entity) {
return false;
}
return baseMapper.updateById(entity) > 0;
}
@Override
public boolean updateBatch(Collection<T> beans) {
return updateBatch(null, beans);
}
@Override
public boolean updateBatch(String table, Collection<T> data) {
Collection<T> beans = Optional.ofNullable(data).orElse(CollUtil.newArrayList())
.stream().filter(Objects::nonNull).collect(Collectors.toList());
if (CollUtil.isEmpty(beans)) {
return false;
}
// 数据分批处理
int batchSize = 500;
int totalBatches = (beans.size() + batchSize - 1) / batchSize;
// 使用IntStream生成批次索引,通过lambda处理每个批次
long t1 = System.currentTimeMillis();
int count = IntStream.range(0, totalBatches)
.map(batchIndex -> {
try {
int start = batchIndex * batchSize;
int end = Math.min(start + batchSize, beans.size());
Collection<T> subBeans = CollUtil.sub(beans, start, end);
if (CollUtil.isEmpty(subBeans)) {
return 0;
}
return StrUtil.isBlank(table) ? baseMapper.updateBatch(subBeans) : baseMapper.updateBatch(table, subBeans);
} catch (Exception e) {
log.error("批量更新第{}批数据失败", batchIndex, e);
return 0;
}
}).sum();
long t2 = System.currentTimeMillis();
log.info("批量更新数据 表:{}, 耗时:{}ms, 总数:{}, 完成:{}", table, (t2 - t1), beans.size(), count);
return count == beans.size();
}
@Override
public T getById(Serializable id) {
if (null == id) {
return null;
}
return baseMapper.selectById(id);
}
@Override
public List<T> getById(Collection<? extends Serializable> ids) {
if (CollUtil.isEmpty(ids)) {
return null;
}
return baseMapper.selectByIds(ids);
}
@Override
public List<T> list() {
return baseMapper.selectAll();
}
@Override
public List<T> list(AbstractWrapper<T, ?> queryWrapper) {
return baseMapper.selectList(queryWrapper);
}
@Override
public List<T> list(T bean) {
return baseMapper.select(bean);
}
/**
* {@inheritDoc}
*/
@Override
public LambdaQueryChainWrapper<T> lambdaQuery() {
return new LambdaQueryChainWrapper<>(baseMapper);
}
/**
* {@inheritDoc}
*/
@Override
public LambdaUpdateChainWrapper<T> lambdaUpdate() {
return new LambdaUpdateChainWrapper<>(baseMapper);
}
}
3 BaseMapper.java
package com.xu.wrapper.mapper;
import com.xu.wrapper.lambda.AbstractWrapper;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* 基础类
*/
public interface BaseMapper<T> {
/**
* 新增
*
* @param bean 类
* @return 影响行数
*/
int insert(T bean);
/**
* 批量新增
*
* @param beans 类
* @return 影响行数
*/
int insertBatch(Collection<T> beans);
/**
* 删除(主键)
*
* @param id 主键
* @return 影响行数
*/
int deleteById(@Param("id") Serializable id);
/**
* 批量删除(主键)
*
* @param ids 主键
* @return 影响行数
*/
int deleteByIds(@Param("ids") Collection<? extends Serializable> ids);
/**
* 更新(主键)
*
* @param entity 类
* @return 影响行数
*/
int updateById(T entity);
/**
* 批量更新(自定义条件)
*
* @param beans 类
* @return 影响行数
*/
int updateBatch(@Param("beans") Collection<T> beans);
/**
* 批量更新(自定义条件)
*
* @param table 表名称
* @param beans 类
* @return 影响行数
*/
int updateBatch(@Param("table") String table, @Param("beans") Collection<T> beans);
/**
* 查询
*
* @param id 主键
* @return 数据
*/
T selectById(@Param("id") Serializable id);
/**
* 查询
*
* @param ids 主键
* @return 数据
*/
List<T> selectByIds(@Param("ids") Collection<? extends Serializable> ids);
/**
* 查询所有
*
* @return 数据
*/
List<T> selectAll();
/**
* 查询
*
* @param bean 类
* @return 数据
*/
List<T> select(T bean);
/**
* 根据 Wrapper 条件,查询一条记录
*
* @param wrapper 实体对象封装操作类
* @return 实体
*/
T selectOne(@Param("ew") AbstractWrapper<T, ?> wrapper);
/**
* 根据 Wrapper 条件,查询总记录数
*
* @param wrapper 实体对象封装操作类
* @return 总记录数
*/
Long selectCount(@Param("ew") AbstractWrapper<T, ?> wrapper);
/**
* 根据 Wrapper 条件,查询全部记录
*
* @param wrapper 实体对象封装操作类
* @return 实体列表
*/
List<T> selectList(@Param("ew") AbstractWrapper<T, ?> wrapper);
/**
* 根据 Wrapper 条件,更新记录
*
* @param wrapper 实体对象封装操作类
* @return 影响行数
*/
int update(@Param("ew") AbstractWrapper<T, ?> wrapper);
/**
* 根据 Wrapper 条件,删除记录
*
* @param wrapper 实体对象封装操作类
* @return 影响行数
*/
int delete(@Param("ew") AbstractWrapper<T, ?> wrapper);
}
2 XML
3 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>3.4.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xu</groupId>
<artifactId>spring-oracle</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-oracle</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>24</java.version>
</properties>
<dependencies>
<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>3.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.40</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.5</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

更多推荐
所有评论(0)