# lazy-cat
**Repository Path**: ma_hao_mh/lazy-cat
## Basic Information
- **Project Name**: lazy-cat
- **Description**: 全自动orm映射及api自动映射
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 2
- **Created**: 2022-03-11
- **Last Updated**: 2025-08-22
## Categories & Tags
**Categories**: database-dev
**Tags**: 全自动orm映射及api自动映射
## README
# 简介
lazy-cat是基于spring-jdbcTemplate封装的orm框架
- orm-parent 父级项目
- orm-base 基础接口, 常量, 工具类
- orm-anno 基础注解
- orm-core orm映射
- orm-api-base api基础代码及注解
- orm-api api自动映射
***
# 快速开始 :cat:
#### orm-core maven依赖:
cool.lazy-cat
orm-core-spring-boot-starter
2.4.0
启动类增加注解@PojoScan(value = {"xxx.xxx.**"}, excludes = {})
指定包下标注@Pojo的类将被lazy-cat管理 除此之外可以在配置文件中指定扫描路径和排除路径
**在配置文件指定时将忽略启动类中的注解**
一个例子:
```java
@Pojo(table = @Table(schema = "app_core", tableName = "acc_user"))
public class User {
private String id;
private String name;
private Sex sex;
private Office office;
private List userDirList;
@Id(idGenerator = UUIdGenerator.class)
@Column(updatable = false, sort = 1, name = "acc_user_id")
public String getId() {
return id;
}
@Column(sort = 10)
public String getName() {
return name;
}
/**
* 内置的枚举类型转换器 查询、持久化时自动转换类型.
*/
@Column(sort = 40, typeConverter = SimpleEnumTypeConverter.class)
public Sex getSex() {
return sex;
}
@OneToMany(condition = {@On(foreignFiled = "id", targetFiled = "userId")},
cascadeScope = {"userDirList.userFileList.fileContentList"},
ignoreFields = {"userDirList.userFileList.fileContentList.suffix"},
sort = 10)
public List getUserDirList() {
return userDirList;
}
@ManyToOne(condition = @On(foreignFiled = "department", targetFiled = "id"), sort = 30, cascadeLevel = 2)
public Office getOffice() {
return office;
}
}
```
对于数据库表存在的字段应加注@Column注解 默认将字段驼峰转换下划线映射数据库字段
**以pojo字段的getter方法标注的注解为准 请注意**
对于关系映射对象, lazy-cat提供三个注解
- OneToMany
- ManyToOne
- OneToOne
在查询、增删改时根据 **作用域** 自动更新关系映射对象 也可以通过参数来控制是否更新映射对象的值
所谓 **作用域** 是指注解中配置的cascadeScope或者cascadeLevel参数, 优先取cascadeScope参数
- cascadeLevel 加载映射对象等级(层级), 如果大于1, 则继续加载映射对象配置的关系映射对象(如果有), 值越大加载层级越深
- **cascadeScope** 以字符串的形式配置加载映射对象的嵌套对象结构
**cascadeScope**模式更加灵活控制加载的嵌套对象, 在对象结构复杂的情况下 cascadeLevel可能造成性能问题
lazy-cat提供了BaseRepository万能类, 可以操作所有被lazy-cat管理的pojo
```java
@Autowired
BaseRepository baseRepository;
public void test() {
List ul1 = baseRepository.queryByIds(User.class, Arrays.asList(1, 2, 3));
User u2 = baseRepository.queryById(User.class, 133);
// 如果返回了多条数据,将抛出异常
User w = baseRepository.querySingle(new SearchParamImpl<>(User.class).setCondition(Condition.eq("name", "王五")));
PageResult upr = baseRepository.queryPage(new SearchParamImpl<>(User.class)
.setCondition(Condition.eq("office.name", "A公司").and(Condition.lt("age", 35))));
// 更新或保存 默认更新映射对象 判断对象是否为新记录可重写isNewRecord()方法
baseRepository.save(ul1);
// 更新或保存 但不更新映射对象
baseRepository.save(ul1, false);
// 删除 默认删除映射对象
baseRepository.delete(ul1);
// 删除 担不删除映射对象
baseRepository.delete(ul1, false);
// 根据条件删除
baseRepository.deleteByCondition(User.class, Condition.eq("name", "王五").or(Condition.gte("age", 99)));
// 根据id删除
baseRepository.deleteByIds(User.class, Arrays.asList(1, 2, 3));
// 逻辑删除 默认逻辑删除映射对象 如果类没有逻辑删除字段 则什么也不做
baseRepository.logicDelete(ul1);
// 逻辑删除 但不逻辑删除映射对象 如果类没有逻辑删除字段 则什么也不做
baseRepository.logicDelete(ul1, false);
// 推断删除 如果类具有逻辑删除字段则执行逻辑删除 否则物理删除 同时更新映射对象
baseRepository.deleteByInfer(ul1);
// 同上 但不更新映射对象
baseRepository.deleteByInfer(ul1, false);
}
```
在查询操作时可以动态指定`作用域` **但增删改操作时只能使用注解声明的作用域**
```java
List searchScope = Arrays.asList("office.parent.parent.childrenList",
"userDirList.userFileList.fileContentList.dir", "ftpDirList.ftpFileList.dir");
Condition condition = Condition.in("office.name", Arrays.asList("A公司", "B公司")).and(Condition.eq("sex", "女"));
// 忽略查询的字段
Ignorer ignorer = Ignorer.build("office.level", "sex", "userDirList.userFileList.fileContentList.suffix");
List u = baseRepository.query(new SearchParamImpl<>(User.class).setSearchScope(searchScope).setIgnorer(ignorer).setCondition(condition));
```
事务控制层面提供了泛型接口`BaseService