在了解三层架构

简介: 该文档详细介绍了在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

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

相关文章
|
1月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
2月前
|
人工智能 Java 数据库连接
Mybatis执行流程
本文详细分析了 MyBatis 的执行流程,介绍了其核心组件如 SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession 的作用与实现原理,并通过源码解析了 SQL 语句的执行过程,包括动态代理、缓存机制及数据库查询的实现,帮助读者深入理解 MyBatis 的内部工作机制。
Mybatis执行流程
|
1月前
|
NoSQL Java 数据库
杂项8
缓存三剑客(穿透、击穿、雪崩)解析及解决方案:穿透指请求数据在Redis和数据库均不存在,可通过校验、空值缓存、布隆过滤器应对;击穿针对热点数据失效,可用互斥锁或永不过期策略;雪崩因大量缓存同时失效,可采用随机过期、集群部署、降级机制缓解。
|
1月前
|
存储 SQL 缓存
spring基础2
本文介绍了 MyBatis 动态 SQL 的执行原理及常用标签,AOP 的实现原理与应用场景,Spring 的三级缓存机制及其在解决循环依赖中的作用,以及事务传播行为及其使用场景,帮助理解 Java 开发中的核心概念与实现机制。
|
1月前
|
前端开发 JavaScript Java
MVVM 状态管理
MVVM 实现数据驱动视图,通过 ViewModel 自动更新 View,支持双向绑定,生命周期管理控制流程。async/await 使异步代码更接近同步结构,提升可读性与调试效率。
|
1月前
|
JavaScript 前端开发 Go
web-2
CSS 样式通过选择器定义元素外观,属静态样式;JS 样式通过操作 DOM 实现动态修改。两者在语法、作用方式及应用场景上存在差异,CSS 侧重布局与视觉表现,JS 则用于交互与动态逻辑控制。
|
1月前
|
JavaScript
{{}}与v-bind的核心差异
本文对比了 Vue.js 中插值语法 `{{}}` 与指令 `v-bind` 的核心差异,介绍了它们在适用场景、语法本质、编译结果及动态更新等方面的区别,并总结了何时使用 `:`(即 `v-bind`)或 `{{}}` 的最佳实践。
|
1月前
|
SQL Java 数据库连接
Mybatis的批处理工具:MybatisBatchUtils功能全解
总而言之,MybatisBatchUtils 是 Mybatis 的一款强大工具,可以显著提高批量数据处理的效率,并确保事务的安全性。通过简化 API 的设计,使得开发者能够易于上手并利用 Mybatis 进行高效的数据库操作。正确使用 MybatisBatchUtils,必然能够在大数据量的场景下,给你的应用性能带来质的飞跃。
253 0
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
三周内转型AI工程师学习计划
3周AI转型计划:掌握数学、机器学习与深度学习基础,熟练使用Python、PyTorch/TensorFlow。完成2-3个CV/NLP项目,构建GitHub博客,强化LeetCode刷题与模拟面试。每日高效学习9小时,聚焦实战与面试准备,助力快速入行AI。
160 0
|
1月前
|
存储 安全 算法
掌握C/C++中常见的加解密技术
在实现任何安全敏感功能时,务必要详尽地测试你的代码以确保其不仅能正常工作,并且能抵御常见的攻击方式,例如重放攻击、中间人攻击等。这种测试通常需要具备专业的安全知识,并且要检查一系列的安全性能指标。
123 0