《从零开始的java从入门到入土的学习生活——JavaWeb后端篇》Chapter13——JavaWeb后端篇学习记录——MYSQL、MyBatis
一、MYSQL数据库
数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库
1、SQL(Structured Query Language,简称SQL)
结构化查询语言,它是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。
关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
①使用表存储数据,格式统一,便于维护。
②使用SQL语言操作,标准统一,使用方便,可用于复杂查询。
2、SQL语句
SQL语句根据其功能被分为四大类:DDL、DML、DQL、DCL

①DDL
DDL英文全称是Data Definition Language(数据定义语言),用来定义数据库对象(数据库、表)。常见操作:查询、创建、使用、删除。
查询所有数据库:
show databases;查询当前数据库:
select database();创建数据库:
create database [ if not exists ] 数据库名 [default charset utf8mb4];使用数据库:
use 数据库名 ;删除数据库:
drop database [ if exists ] 数据库名 ;DDL语句当中关于表结构的操作。关于表结构的操作也是包含四个部分:创建表、查询表、修改表、删除表。
创建:
create table 表名( 字段1 字段1类型 [约束] [comment 字段1注释 ], 字段2 字段2类型 [约束] [comment 字段2注释 ], ...... 字段n 字段n类型 [约束] [comment 字段n注释 ] ) [ comment 表注释 ] ;注意: [ ] 中的内容为可选参数; 最后一个字段后面没有逗号
-- 创建表 create table user( id int comment 'ID 唯一标识', username varchar(50) comment'用户名', name varchar(10) comment'姓名', age int comment '年龄', gender char(1) comment '性别' )comment '用户信息表';若想要限制字段所存储的数据,就需要用到数据库中的约束
约束
作用在表中字段上的规则,用于限制存储在表中的数据。保证数据库当中数据的正确性、有效性和完整性。

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
主键自增:auto_increment——每次插入新的行记录时,数据库自动生成id字段(主键)下的值,具有auto_increment的数据列是一个正数序列开始增长(从1开始自增)
-- 创建表(约束) create table user( id int primary key auto_increment comment 'ID 唯一标识',-- 主键约束 自增 username varchar(50) not null unique comment'用户名',-- 非空 唯一约束 name varchar(10) not null comment'姓名',-- 非空 age int comment '年龄', gender char(1) default '男'comment '性别'-- 默认值 )comment '用户信息表';
MYSQL数据类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
数值类型:

字符串类型:

日期时间类型:

总结
关于表结构的查看、修改、删除操作,工作中一般都是直接基于图形化界面操作
②DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
增加(insert)
- 向指定字段添加数据
insert into 表名 (字段名1, 字段名2) values (值1, 值2);- 全部字段添加数据
insert into 表名 values (值1, 值2, ...);- 批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);- 批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);注意事项:插入数据时,指定的字段顺序需要与值的顺序是对应的。字符串和日期型数据应该包含在引号中。插入的数据大小,应该在字段的规定范围内。
修改(update)
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;注意事项:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。在修改数据时,一般需要同时修改公共字段update_time,将其修改为当前操作时间。
删除(delete)
delete from 表名 [where 条件] ;注意事项:DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。当进行删除全部数据操作时,会提示询问是否确认删除所有数据,直接点击Execute即可。
③DQL
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
语法结构如下:
SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数基本查询
- 查询多个字段
select 字段1, 字段2, 字段3 from 表名;- 查询所有字段(通配符)
select * from 表名;- 设置别名
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名;- 去除重复记录
select distinct 字段列表 from 表名;注意:* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)
条件查询
语法:
select 字段列表 from 表名 where 条件列表 ; -- 条件列表:意味着可以有多个条件学习条件查询就是学习条件的构建方式,而在SQL语句当中构造条件的运算符分为两类:
- 比较运算符
- 逻辑运算符
比较运算符:

逻辑运算符:

注意:查询为NULL的数据时,不能使用 = null 或 !=null 。得使用 is null 或 is not null。
聚合函数
聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)

注意 : 聚合函数会忽略空值,对NULL值不作为统计。
分组查询
按照某一列或者某几列,把相同的数据进行合并输出,语法如下:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];注意:分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。执行顺序:where > 聚合函数 > having。
where与having的区别——执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。判断条件不同:where不能对聚合函数进行判断,而having可以。
排查查询
对于数据进行降序(DESC),升序(ASC),或者一些排序,若未指明排序条件,则默认为升序排序,语法如下:
select 字段列表 from 表名 [where 条件列表] [group by 分组字段 ] order by 字段1 排序方式1 , 字段2 排序方式2 … ;注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
分页查询
分页操作在业务系统开发时,也是非常常见的一个功能,语法如下:
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;注意事项:
——起始索引从0开始。 计算公式 :起始索引 = (查询页码 - 1)* 每页显示记录数
——分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
——如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 条数
二、MyBatis
1、创建MyBatis
MyBatis是一款优秀的 持久层框架,用于简化JDBC的开发
导入Mybatis的起步依赖:

勾选后,将自动在maven里添加对应的依赖项。
在 application.properties 中配置数据库的连接信息。
#数据库访问的url地址 spring.datasource.url=jdbc:mysql://localhost:3306/web #数据库驱动类类名 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #访问数据库-用户名 spring.datasource.username=root #访问数据库-密码 spring.datasource.password=root@1234配置完就可以编写MyBatis的代码了,先创建一个User实体类(与数据库的内容要一致)
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private Integer id; private String username; private String password; private String name; private Integer age; } } 创建一个包 mapper 。在 mapper 包下创建一个接口 UserMapper ,这是一个持久层接口(Mybatis的持久层接口规范一般都叫 XxxMapper)。
import com.genshin.pojo.User; import org.apache.ibatis.annotations.*; import java.util.List; @Mapper//应用程序运行时,会自动创建UserMapper接口的实现类对象,并注入到IOC容器中-bean public interface UserMapper { /** * 查询所有用户 */ /* @Select("select * from user")*/ public List<User>findAll(); /** * 根据id删除用户 */ @Delete("delete from user where id = #{id}") public Integer deleteById(Integer id); /** * 插入用户 */ @Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})") public void insert(User user); /** * 根据id更新用户 */ @Update("update user set username=#{username},password=#{password},name=#{name},age=#{age} where id=#{id}") public void update(User user); /** * 根据用户名和密码查询用户 */ @Select("select * from user where username=#{username} and password=#{password}") //public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); public User findByUsernameAndPassword(String username, String password); }2、XML映射配置
MyBatis的开发方式主要有两种:注解和XML,使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。
使用XML开发需要有以下的规范:
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
- XML映射文件的namespace属性为Mapper接口全限定名一致
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

在上述的resource文件创建对应的xml文件,并写入对应的映射文件——xml映射文件中的dtd约束,直接从mybatis官网复制即可; 或者直接AI生成。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper> <!--resultType:指定查询结果的封装类型--> <select resultType="com.genshin.pojo.User"> select id,username,password,name,age from user </select> </mapper>