diff --git a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java index d7fad5a..6fe43b3 100644 --- a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java +++ b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java @@ -12,7 +12,7 @@ import org.apache.ibatis.annotations.UpdateProvider; import java.util.List; /** - * 基本 SQL 映射,子接口可以不实现 + * 基本 SQL 映射 * * @param 实体类型 * @param

主键类型 @@ -88,7 +88,7 @@ public interface BaseMapper { List selectAll(); /** - * 创建数据。默认自增主键为 id,如需修改请重写此接口 + * 创建数据 * * @param t 数据对象 */ diff --git a/src/main/java/com/imyeyu/spring/mapper/RawMapper.java b/src/main/java/com/imyeyu/spring/mapper/RawMapper.java new file mode 100644 index 0000000..15ac4b1 --- /dev/null +++ b/src/main/java/com/imyeyu/spring/mapper/RawMapper.java @@ -0,0 +1,52 @@ +package com.imyeyu.spring.mapper; + +import com.imyeyu.spring.util.RawSQLProvider; +import org.apache.ibatis.annotations.SelectProvider; + +import java.util.List; + +/** + * 原始 SQL 映射 + * + * @param 实体类型 + * @param

主键类型 + * @author 夜雨 + * @since 2026-01-05 12:58 + */ +public interface RawMapper { + + /** + * 查询全部数据 + * + * @return 数据列表 + */ + @SelectProvider(type = RawSQLProvider.class, method = "selectAll") + List selectAllRaw(); + + /** + * 根据 ID 获取对象 + * + * @param id 索引 + * @return 数据对象 + */ + @SelectProvider(type = RawSQLProvider.class, method = "select") + T selectRaw(P id); + + /** + * 根据示例查询单条数据 + * + * @param t 示例对象 + * @return 数据对象 + */ + @SelectProvider(type = RawSQLProvider.class, method = "selectByExample") + T selectByExampleRaw(T t); + + /** + * 根据示例查询全部数据 + * + * @param t 示例对象 + * @return 数据列表 + */ + @SelectProvider(type = RawSQLProvider.class, method = "selectAllByExample") + List selectAllByExampleRaw(T t); +} diff --git a/src/main/java/com/imyeyu/spring/util/RawSQLProvider.java b/src/main/java/com/imyeyu/spring/util/RawSQLProvider.java new file mode 100644 index 0000000..75b7e0d --- /dev/null +++ b/src/main/java/com/imyeyu/spring/util/RawSQLProvider.java @@ -0,0 +1,49 @@ +package com.imyeyu.spring.util; + +import com.imyeyu.java.bean.timi.TimiException; +import com.imyeyu.spring.mapper.BaseMapper; +import org.apache.ibatis.builder.annotation.ProviderContext; + +import java.util.stream.Collectors; + +/** + * 原始 Mapper SQL 代理器 + * + * @author 夜雨 + * @since 2026-01-05 13:00 + */ +public class RawSQLProvider extends SQLProvider { + + @Override + public String selectAll(ProviderContext context) { + EntityMeta meta = getEntityMeta(context); + return "SELECT * FROM %s WHERE 1 = 1".formatted(meta.table); + } + + @Override + public String select(ProviderContext context, Object id) { + EntityMeta meta = getEntityMeta(context); + TimiException.required(meta.idFieldColumn, "not found id field in %s".formatted(meta.entityClass)); + return "SELECT %s FROM `%s` WHERE `%s` = #{%s}".formatted(meta.selectAllClause, meta.table, meta.idFieldColumn.columnName, id) + " LIMIT 1"; + } + + @Override + public String selectByExample(Object entity) { + return selectAllByExample(entity) + BaseMapper.LIMIT_1; + } + + @Override + public String selectAllByExample(Object entity) { + EntityMeta meta = getEntityMeta(entity.getClass()); + String conditionClause = meta.fieldColumnList.stream() + .filter(fc -> fc.isNotEmpty(entity)) + .map(fc -> "`%s` = #{%s}".formatted(fc.columnName, fc.fieldName)) + .collect(Collectors.joining(" AND ")); + return "SELECT %s FROM `%s` WHERE %s".formatted(meta.selectAllClause, meta.table, conditionClause); + } + + @Override + public String deleteAllByExample(Object entity) { + return super.deleteAllByExample(entity); + } +}