java实操笔记

3 阅读5分钟

. controller(控制层)

  • 核心职责:接收前端 HTTP 请求,进行参数校验,调用对应的业务逻辑,并返回响应结果。
  • 典型内容@RestController@Controller 注解的类,如 UserController.java
  • 作用:作为项目的入口,负责请求路由和参数处理,不包含复杂业务逻辑。

2. entity(实体层)

- **核心职责**:定义与数据库表一一对应的实体类,包含属性、getter/setter 等。 - **典型内容**:`@Entity` 或普通 POJO 类,如 `User.java`、`Order.java`。 - **作用**:承载数据,在各层之间传递数据,是整个项目的数据模型基础。 - 这个类就像 “用户信息的纸质表单”,只记录 id、用户名、密码、年龄这些数据,没有任何 “做事” 的逻辑,所有层之间传递用户信息都靠它
@Data // 核心:Lombok注解,自动生成所有属性的getter/setter、toString、equals、hashCode、无参构造 
@EqualsAndHashCode(callSuper = false) // Lombok注解:生成equals/hashCode方法时,不调用父类(WorkFlowEntity)的方法 
@Accessors(chain = true) // Lombok注解:开启链式调用(比如 wellPractise.setBillCode("001").setFactory("一分厂")) 
@TableName("WELL_PRACTISE") // MyBatis-Plus注解:指定该实体对应数据库的表名是 WELL_PRACTISE(大写是数据库常见规范)

解释

  • equals():用来判断两个对象是否“相等”。
  • hashCode():返回一个整数(哈希码),可以理解为对象的“身份证号”或“分类编号”。
  • 链式调用 Java 中普通的 setter 方法返回值是 void,调用完一个方法后,没法直接调用下一个:
// 普通写法:每调一个setter都要单独写一行
WellPractise wp = new WellPractise();
wp.setBillCode("LSJC-2026-001");  // setBillCode返回void,没法接着调
wp.setFactory("一分厂");          // 只能重新用wp对象调用
wp.setFlag("1");
wp.setWriteName("张三");

2. 开启链式调用(@Accessors (chain = true))

加了 @Accessors(chain = true) 后,setter 方法会返回当前对象本身(this) ,就能 “链式” 调用:

// 链式调用写法:一行搞定所有set操作
WellPractise wp = new WellPractise()
    .setBillCode("LSJC-2026-001")  // 返回wp对象,可接着调下一个方法
    .setFactory("一分厂")          // 继续返回wp对象
    .setFlag("1")
    .setWriteName("张三");
  • @TableField(exist = false) MyBatis-Plus注解:标记该字段不是数据库表中的字段,查询/插入时会忽略

3. mapper(数据访问层 / DAO 层)

  • 核心职责:负责与数据库交互,执行 CRUD 操作。

  • 典型内容:使用 MyBatis 等框架的 Mapper 接口,如 UserMapper.java,以及对应的 XML 映射文件。

  • 作用:封装数据库操作,为上层提供数据访问接口,解耦业务逻辑与数据库细节。 项目里的 Java 代码说的是 “面向对象的语言”,数据库说的是 “SQL 语言”,两者没法直接沟通,Mapper 层就负责在中间做翻译:

  • 你在 Service 层说 “查 ID 为 1 的 WellPractise 数据”,Mapper 层就翻译成SELECT * FROM well_practise WHERE id = 1发给数据库;

  • 数据库返回一堆原始数据,Mapper 层再翻译成 Java 的WellPractise对象,交给 Service 层用。

4. service(业务逻辑层)

  • 核心职责:处理核心业务逻辑,调用 Mapper 层完成数据操作,实现事务控制。
  • 典型内容@Service 注解的类,如 UserService.javaOrderService.java
  • 作用:是项目的核心,负责业务规则、数据处理和流程编排,是 Controller 和 Mapper 之间的桥梁。

impl

查询参数
.eq( 
// 第一个参数:判断 flag 是不是有值(有值才生效)
experiencePoorPerformanceRptVo.getFlag() != null, 
// 第二个参数:对应数据库字段 
flag ExperiencePoorPerformanceRpt::getFlag, 
// 第三个参数:前端传过来的 flag 值
experiencePoorPerformanceRptVo.getFlag() )
其他常用参数
一、等值查询
  • eq → equal → 等于(=)
  • ne → not equal → 不等于(!=)
二、大小比较
  • gt → greater than → 大于(>)
  • ge → greater than or equal → 大于等于(>=)
  • lt → less than → 小于(<)
  • le → less than or equal → 小于等于(<=)
三、模糊查询
  • like → 全模糊匹配(% 值 %)
  • likeLeft → 左模糊(% 值)
  • likeRight → 右模糊(值 %)
四、包含 / 不包含
  • in → 在集合内(IN)
  • notIn → 不在集合内(NOT IN)
排序

// 倒序(desc) .orderByDesc(实体::getCreateTime); // 正序(asc) .orderByAsc(实体::getCreateTime);

lambda

wrapper.lambda() = 让你写查询条件时****不用写数据库字段名(字符串),直接用实体类的属性,安全、不写错、不报错!


    1. 先看对比:有 lambda 和 没有 lambda 的区别

-不使用 lambda(老式写法,容易出错)

wrapper.eq("unit_code", vo.getUnitCode()); // 手写数据库字段名
wrapper.like("project_name", vo.getProjectName());
  • 字段名是字符串,写错了运行才报错
  • 没有代码提示,全靠记忆
  • 容易写错:unit_codprojectName 都会崩

使用 lambda(你现在的写法,安全、优雅)

wrapper.lambda()
       .eq(ExperiencePoorPerformanceRpt::getUnitCode, vo.getUnitCode())
       .like(ExperiencePoorPerformanceRpt::getProjectName, vo.getProjectName());
  • 不用写字段名
  • 直接用实体类的方法引用
  • IDEA 会自动提示
  • 写错编译就报错,不会跑到线上才崩
ueryWrapper
ueryWrapper<ExperiencePoorPerformanceRpt> wrapper = new QueryWrapper<>();
  1. QueryWrapper

    • MyBatis-Plus 提供的条件构造器
    • 作用:帮你拼 WHERE 后面的所有查询条件
  2. <ExperiencePoorPerformanceRpt>

    • 泛型:告诉它要查哪张表
    • 对应你的实体类 → 对应数据库表
  3. wrapper

    • 变量名,意思是包装器、条件包裹器
    • 你可以理解成:查询条件集合
  4. new QueryWrapper<>()

    • 新建一个空的查询条件对象
    • 刚开始里面什么条件都没有

    1. 它到底是干嘛的?(最核心)

你要查数据库,肯定要写条件:

SELECT * FROMWHERE unit_code = 'xxx'
  AND project_name LIKE '%xxx%'
  AND create_time > '2025-01-01'

这些 WHERE 条件,不用你手写 SQL全部用 wrapper 对象一行一行拼进去!


    1. 整个流程长这样(一看就懂)
// 1. 新建一个空的查询条件盒子
QueryWrapper<ExperiencePoorPerformanceRpt> wrapper = new QueryWrapper<>();

// 2. 往盒子里装条件(eq = 等于,like = 模糊查询...)
wrapper.eq("unit_code", "1001");
wrapper.like("project_name", "测试");

// 3. 把盒子丢给数据库去查
this.list(wrapper);

它就像一个:装查询条件的快递盒子

  • 先创建盒子
  • 再把条件装进去
  • 最后发给数据库

和你上面那行连起来理解

// 1. 创建空查询条件
QueryWrapper<ExperiencePoorPerformanceRpt> wrapper=new QueryWrapper<>();

// 2. 开启 Lambda 安全模式
wrapper.lambda()
       .eq(...)
       .like(...)

  • new QueryWrapper<>() = 拿一个空表单
  • wrapper.lambda () = 开始安全填写条件

5. workflow(工作流层)

  • 核心职责:处理复杂的业务流程,如审批流、任务调度、状态流转等。
  • 典型内容:集成 Activiti、Flowable 等工作流引擎的代码,或自定义的流程控制逻辑。
  • 作用:将复杂的业务流程抽象化、配置化,提高系统的灵活性和可维护性。

6. OeApplication

  • 核心职责:Spring Boot 项目的启动类。
  • 典型内容:包含 main 方法,使用 @SpringBootApplication 注解。
  • 作用:作为项目的入口点,启动 Spring 容器,自动配置和扫描组件。