快速入门Web开发(中)后端开发(有重点)(3)

简介: 快速入门Web开发(中)后端开发(有重点)(3)

快速入门Web开发(中)后端开发(有重点)(2):https://developer.aliyun.com/article/1548585


表关系及对应

一对多

  • 多的一方添加外键
一对一

多对多

多表设计的流程

  • 步骤一画er图

多表查询

内连接

外连接

  • 左外连接会包含左表中的所有数据
  • 右外连接会包含右表中的所有数据
  • 可以解决一方值为空,对应不到对方的情况
  • 基本用左外,右外可以替换成左外

子查询

  • 以上出现了两种方式

-- 查询每个分类下最贵的菜品,展示出分类的名称、最贵的菜品的价格
select c.name,max(d.price)-- 不一定要用子查询,可以直接筛选出最贵的
from category c,
     dish d
where d.category_id = c.id
group by c.id;

事物

索引

  • 索引将原本的挨个查询变成使用数据结构来查询

写MySQl代码的方式(重点)

1、分析需要用到那几张表(提前做好er图),然后再开始写代码

2、先写查询条件再写查询显示项

mysql语句的难点(重点)

优先级,你需要知道每个语句的优先级

-- 查询每个分类下最贵的菜品,展示出分类的名称、最贵的菜品的价格
select c.name,max(d.price)
from category c,
     dish d
where d.category_id = c.id
group by c.id;
  • 比如以上的案列,我以为是先执行语句是从左边执行到右边,于是认为先查询最贵的价格了,而最贵的价格只有一个,因此只会出现一个拥有最贵的分类。但代码不是这么运作的。

一个用的到的函数—concat()

  • 函数格式是CONCAT(‘参数1’,’参数2’,’参数3’)
  • 使用该函数可以将括号中的参数拼接在一起,用于sql的预编译

JDBC

  • sun公司提供的api

数据库链接池

  • 用户使用数据库连接池用完了还回去

切换数据库链接池

在配置文件中增加德鲁伊数据库链接池即可

//德鲁伊数据库链接词
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.8</version>
</dependency>

lombik(注解简化代码)

  • 写在类的前面
  • 原理就是根据注解生成相应的方法

Mybatis基于注解来配置sql

  • 只需要定义接口就好不需要定义实现类
#配置数据库中的链接信息
# mysql项目的application.properties配置
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456

@Mapper

@Mapper是一个MyBatis注解,用于标注DAO层的Mapper接口。

MyBatis是一个支持定制化SQL、存储过程以及高级映射的优秀持久层框架。在MyBatis中,DAO层的Mapper接口负责与数据库交互,封装各种CRUD操作。

@Mapper注解用于告诉MyBatis框架,该接口需要被自动实现为Mapper代理。MyBatis会在应用启动时自动扫描带有@Mapper注解的接口,并为这些接口生成实现类。

  • 标注在类上面,即可使用
  • 也是交给loc容器管理

@Select与其他的语句映射

查询就是@select,删除就是@delete

MyBatis通过注解的方式,可以直接将SQL语句映射到DAO方法上,无需编写XML映射文件。

//根据ID删除数据
    @Delete("delete from emp where id=#{id}")
    //mybatis实现了根据 #{} 来实现注释绑定的注释方法传参
    public void delete(Integer id);
  //public int delete(Integer id);
 //可以有返回值。返回值意思是影响的记录数

Test

  • 使用@test注解可以进行测试

日志与预编译

  • 通过?(预编译)使得能够高性能的工作

  • 登录的本质就是将输入的用户名和密码拿去查询,看是否能查到

其中count(*)能够统计查询到的总行数

  • 使用$()是直接拼接字符串
  • 使用#()是使用预编译

SQL注入

  • 没有使用预编译的SQL可以通过输入密码或者账号时,改为mysql语句的形式,来修改。
  • 使用预编译,将把输入的字符都变为一个参数,代替问号

Mybatis使用

  • 注意,上面的链接那边要填写自己的数据库名称

配置sql

增加员工(涉及主键返回问题)

  • 出现以上数据过多时,可以通过列多个参数,也可以通过使用一个对象

  • 以上字母是emp中的属性名称

多对多关系(两张表)

  • 需要使用共通的id,使用@Options

更新数据

  • 以上想要实现模糊查询,但是#{}会被替换成?,所以不能使用。而是要用 ${}

  • 使用concat函数解决
//方式二
   @Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +
          "entrydate between #{begin} and #{end} order by update_time desc ")
   public List<Emp> list(String name, Short gender, LocalDate begin , LocalDate end);

变量映射

方案一: 给字段起别名, 让别名与实体类属性一致
    @Select("select id, username, password, name, gender, image, job, entrydate, " +
            "dept_id deptId, create_time createTime, update_time updateTime from emp where id = #{id}")
    public Emp getById(Integer id);
方案二: 通过@Results, @Result注解手动映射封装
    @Results({
            @Result(column = "dept_id", property = "deptId"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })
    @Select("select * from emp where id = #{id}")
    public Emp getById(Integer id);
  • 方案三配置application.properties文件
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库链接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#3306后面内容是要链接数据库的名称
#链接数据库的用户名
spring.datasource.username=root
#链接数据库的密码
spring.datasource.password=123456
#开启mybatis的驼峰命名自动映射开关  a_bbb ----> aBbb
mybatis.configuration.map-underscore-to-camel-case=true
#配置mybatis的日志 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

XML文件定义的三种规范

一、同包同名

比如我要配置com.example.webcase下mapper的xml,那么便要如以下一样

二、一个xml文件对应一个接口,且名称完全一致

如图

三、xml中SQL语句的id要与mapper接口中的方法名保持一致,并且放回类型也是一致的

  • mapper接口中的方法名为list,返回值是List

  • xml中的id也为list,返回值为List

XML映射文件来配置sql

  • 一个接口与一个映射文件相对应
  • 红色是要求一,紫色是要求二
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  • 每次配置xml文件时候,根据配置东西的不同要选择不同的约束。比如以上就是mysql的约束

访问mybatis中文网获得

https://mybatis.net.cn/getting-started.html

动态SQL

  • 指查询条件随着用户所填变化而变化
  • 以上if有一个缺陷,当name为空而gender有值的时候,会出现语法错误
动态查询

  • 使用where解决
动态更新

  • 通过Alt+回车可以自动生成动态sql代码

  • 不同的关键字能生成不同
  • 也会if限制,多个 ,

批量删除

代码复用

  • 用于代码的复用性

配置文件

使用application.properties配置文件

不同的配置文件

011)]

XML映射文件来配置sql

[外链图片转存中…(img-x4YKjqVs-1714007817011)]

  • 一个接口与一个映射文件相对应
  • 红色是要求一,紫色是要求二
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  • 每次配置xml文件时候,根据配置东西的不同要选择不同的约束。比如以上就是mysql的约束

访问mybatis中文网获得

https://mybatis.net.cn/getting-started.html

[外链图片转存中…(img-x1DGCwa8-1714007817011)]

[外链图片转存中…(img-pyMgdDtU-1714007817012)]

[外链图片转存中…(img-ns5YgnHb-1714007817012)]

动态SQL

[外链图片转存中…(img-TMZ5N4Z2-1714007817012)]

  • 指查询条件随着用户所填变化而变化
  • 以上if有一个缺陷,当name为空而gender有值的时候,会出现语法错误
动态查询

[外链图片转存中…(img-7qvdoCno-1714007817013)]

  • 使用where解决
动态更新

[外链图片转存中…(img-POn4JMiQ-1714007817014)]

  • 通过Alt+回车可以自动生成动态sql代码

[外链图片转存中…(img-1361I06g-1714007817014)]

  • 不同的关键字能生成不同
  • 也会if限制,多个 ,

[外链图片转存中…(img-LuWRjqH0-1714007817014)]

[外链图片转存中…(img-DHfKCUpS-1714007817015)]

批量删除

[外链图片转存中…(img-IYeQxTWd-1714007817015)]

代码复用

[外链图片转存中…(img-lSHub1Zt-1714007817016)]

  • 用于代码的复用性

配置文件

使用application.properties配置文件

[外链图片转存中…(img-c56FDcEe-1714007817016)]

[外链图片转存中…(img-Tr1oaWUZ-1714007817016)]

不同的配置文件

[外链图片转存中…(img-3gaN4fAv-1714007817017)]

[外链图片转存中…(img-uM9nInYb-1714007817017)]

[外链图片转存中…(img-cXZyXj6a-1714007817018)]

[外链图片转存中…(img-uhWTISOU-1714007817018)]

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
279 4
|
6月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
6月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
5月前
|
人工智能 Java API
后端开发必看:零代码实现存量服务改造成MCP服务
本文介绍如何通过 **Nacos** 和 **Higress** 实现存量 Spring Boot 服务的零代码改造,使其支持 MCP 协议,供 AI Agent 调用。全程无需修改业务代码,仅通过配置完成服务注册、协议转换与工具映射,显著降低改造成本,提升服务的可集成性与智能化能力。
1563 1
|
5月前
|
前端开发 Java 数据库连接
后端开发中的错误处理实践:原则与实战
在后端开发中,错误处理是保障系统稳定性的关键。本文介绍了错误分类、响应设计、统一处理机制及日志追踪等实践方法,帮助开发者提升系统的可维护性与排障效率,做到防患于未然。
|
6月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
299 1
|
9月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
519 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
7月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
464 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
440 6
|
8月前
|
前端开发 JavaScript 关系型数据库
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
619 5
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡