快速入门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)]