在了解三层架构

简介: 该文档详细介绍了在Java开发中,如何使用注解定义Mapper接口并实现数据库操作,包括SQL语句的编写与字段映射处理。同时涵盖了Service层的接口与实现类的结构,以及Controller层的请求处理方式,涉及RESTful API设计、参数绑定、数据传递与响应封装等内容,适用于基于Spring框架的Web应用开发。

mapper

主要定义接口,不需要实现类(由厂商实现),接口上注解@ mapper

在接口中定义方法,注意考虑返回值

@Mapper
public interface ClazzMapper {
    
    //插入数据
    void insert(Clazz clazz);
    //查询所有信息
    List<Clazz> findAll();
}

2.sql语句编写方案

1.使用mybatis生成xml文件(放在接口上生成),sql语句写在xml文件中

2.和sql语句(放在方法上生成)(根据操作情况编写)

3.注意sql语句,如果是查询一类的注意实体类属性名与数据库字段名的不一致(eg:实体类:createTime(小驼峰),在数据库字段名中则是(create_time)),因为查询一类的是映射关系,要进行修改

  方法1:

起别名(写在sql语句中)

eg:select id, name, create_time  as createTime, update_time as updateTime from dept

方法2:注解方式手动映射(写在sql语句上面)

@ Results(

{@ Result(column="字段名",property =”属性名“),。。。}

方法3:(与2相同,只不过写在xml文件中)

eg:

<!--方案二:字段名与实体类属性名不一致xml方式手动映射解决方案
                <id>为主键字段映射 
                <result>为普通字段映射
    <resultMap id="随意" type="com.itheima.pojo.Dept">返回值类型
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
    </resultMap>
    <select id="findAll"  resultMap="与id 值一致">
        select * from dept
    </select>-->

方式4:在application.yml开启驼峰命名映射自动转换

map-underscore-to-camel-case:true(放在mybatis下面)

service

创建接口和实现类

接口中定义方法(service层处理数据的方法)

public interface ClazzService {
    void insert(Clazz clazz);
    List<Clazz> findAll();
}

实现类中

1.加入容器管理,使用注解@ service

2.引用mapper层的对象 @ Autowired

3.重写方法,实现逻辑

public interface ClazzService {
    void insert(Clazz clazz);
    List<Clazz> findAll();
}
@Service
public class ClazzServiceIml implements ClazzService {
   @Autowired
   private ClazzMapper clazzMapper;
    @Override
    public void insert(Clazz clazz) {
        clazzMapper.insert(clazz);
    }
    @Override
    public List<Clazz> findAll() {
        return clazzMapper.findAll();
    }
}

controller

创建实现类

1.添加注解

@RestController,加入容器(不加入容器,无法被扫描,就无法使用注入依赖的注解)

@RequestMapping("路径名") 如果是本机直接可以不写路径名,

此注解放在类上,象征着里面的方法都会使用到这个路径,eg:访问路径是:127.0.0.1/clazzs/lst,则@RestController(”/clazzs“) ;

方法上的注解  @GetMapping("/list"),根据请求的不同注解也不同

@ RequestBody 把请求体的json格式转换为java中的实体类的对象 eg:@RequestBody Clazz clazz 把请求体中的json格式转换为 Clazz类的clazz对象

  • @RequestBody关注的是请求体本身。
  • @RequestParam用于获取 URL 中的查询参数。
  • @PathVariable用于获取 URL 路径中的变量。
  • 参数绑定@PathVariable("id") 中的名称需与路径中的变量名一致。
@RestController
@RequestMapping("/api/users")
public class UserController {
    // 处理GET请求:/api/users/123
    @GetMapping("/{id}")
    public User getUserById(@PathVariable("id") Long userId)// 不一致写法 {
        return userService.getUser(userId);
    }
    // 处理PUT请求:/api/users/123/roles/admin
    @PutMapping("/{id}/roles/{role}")
    public User updateUserRole(
        @PathVariable Long id,  //一致写法
        @PathVariable String role
    ) {
        return userService.updateUserRole(id, role);
    }
}

@RequestParam

示例

请求 URL/hello?name=张三
控制器方法

@GetMapping("/hello")
public String sayHello(@RequestParam String name) {
    return "你好," + name;
}

结果:返回 你好,张三

特性

@RequestParam

@PathVariable

参数位置

URL 查询字符串(?key=value

URL 路径部分(/path/{variable}

典型场景

搜索、分页、筛选等可选参数

RESTful 资源标识(如 ID、名称)

URL 示例

/users?page=1&size=10

/users/123

参数是否必传

默认必传(可设置 required=false

必传(路径中必须存在变量)

代码可读性

参数多时代码冗长

路径更直观,符合 RESTful 风格

@RestController
@RequestMapping("/clazzs")
public class ClazzController {
    @Autowired
    private ClazzService clazzService;
    @PostMapping
    public Result insert(@RequestBody Clazz clazz){
        try{
            clazzService.insert(clazz);
            return Result.success();
        }
        catch (Exception e){
            e.printStackTrace();
            return Result.error("添加班级失败,部门名称重复!");
        }
    }
    @GetMapping("/list")
    public Result findAll(){  //查询信息是一一映射的关系,即是,子表段中的的数据按照子标段名称一一映射给实体类,因此名字要一致
        List<Clazz> all = clazzService.findAll();
        return Result.success(all);
    }
}

2.注入依赖,定义service实现类的对象,调用方法

3.定义方法,一般使用Result返回值(Result自定义的实体类,调用,固定模板,用于封装信息)

@RequestBody与@ResponseBody

  • @RequestBody:将 HTTP 请求体反序列化为 Java 对象。
  • @ResponseBody:将 Java 对象序列化为 HTTP 响应体。

特性

@RequestBody

@ResponseBody

作用对象

HTTP 请求体

HTTP 响应体

数据流向

客户端 → 服务端

服务端 → 客户端

常用场景

接收 JSON/XML 参数(POST/PUT 请求)

返回 JSON/XML 数据(RESTful API)

核心依赖

消息转换器(如 Jackson)

消息转换器(如 Jackson)

常见异常

HttpMessageNotReadableException

HttpMessageNotWritableException

注解位置

方法参数

方法或类(如 @RestController

使用与不使用@RequestParam的区别

场景

使用@RequestParam

注解

不使用@RequestParam

注解

参数名与请求名一致

等价于不使用注解,均可获取参数

直接通过参数名匹配请求参数

参数名与请求名不一致

必须通过value

指定映射(如@RequestParam("pageNum")

无法获取,会报参数不存在错误

设置默认值

支持(通过defaultValue

不支持,参数缺失时会报Required parameter missing

错误

控制必填性

支持(通过required

默认为必填,参数缺失时报错

相关文章
|
7月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
数据采集 前端开发 数据挖掘
kettle开发-SQ索引优化
kettle开发-SQ索引优化
298 0
|
缓存 图形学
游戏通用解决方案之红点设计
游戏通用解决方案之红点设计
1248 0
|
7月前
|
存储 SQL 缓存
spring基础2
本文介绍了 MyBatis 动态 SQL 的执行原理及常用标签,AOP 的实现原理与应用场景,Spring 的三级缓存机制及其在解决循环依赖中的作用,以及事务传播行为及其使用场景,帮助理解 Java 开发中的核心概念与实现机制。
|
7月前
|
NoSQL Java 数据库
杂项8
缓存三剑客(穿透、击穿、雪崩)解析及解决方案:穿透指请求数据在Redis和数据库均不存在,可通过校验、空值缓存、布隆过滤器应对;击穿针对热点数据失效,可用互斥锁或永不过期策略;雪崩因大量缓存同时失效,可采用随机过期、集群部署、降级机制缓解。
|
7月前
|
机器学习/深度学习 运维 自然语言处理
别再当“救火队长”了,AIOps让运维从熬夜到睡好觉
别再当“救火队长”了,AIOps让运维从熬夜到睡好觉
247 5
|
10月前
|
JavaScript Java 开发工具
零基础用 DevEco Studio 打造你的首个 HarmonyOS 应用,开启鸿蒙生态的创新之旅,实现你的技术探索梦想
在鸿蒙生态蓬勃发展的当下,越来越多的开发者怀揣着热情与创意,渴望投身于HarmonyOS应用开发的浪潮之中。
零基础用 DevEco Studio 打造你的首个 HarmonyOS 应用,开启鸿蒙生态的创新之旅,实现你的技术探索梦想
|
7月前
|
机器学习/深度学习 人工智能 PyTorch
三周内转型AI工程师学习计划
3周AI转型计划:掌握数学、机器学习与深度学习基础,熟练使用Python、PyTorch/TensorFlow。完成2-3个CV/NLP项目,构建GitHub博客,强化LeetCode刷题与模拟面试。每日高效学习9小时,聚焦实战与面试准备,助力快速入行AI。
613 0
|
7月前
|
存储 安全 算法
掌握C/C++中常见的加解密技术
在实现任何安全敏感功能时,务必要详尽地测试你的代码以确保其不仅能正常工作,并且能抵御常见的攻击方式,例如重放攻击、中间人攻击等。这种测试通常需要具备专业的安全知识,并且要检查一系列的安全性能指标。
357 0
|
7月前
|
存储 JavaScript 前端开发
详解C语言指针的指针,不信你还不懂!!!
指针的指针(也叫二级指针)是 C 语言中很经典但也让人迷惑的一个知识点。下面我帮你用最详细、最通俗的方式来讲清楚它,保证你看完会豁然开朗!

热门文章

最新文章