1、什么叫做笛卡尔积?笛卡尔积后所有结果都是有效的么?怎么去除无效数据?
什么叫做笛卡尔积?
笛卡尔积是指在数学中,两个集合,A集合 和 B集合的所有组合情况。
笛卡尔积后所有结果都是有效的么?
并不是所有结果都是有效的,在多表查询中,我们是需要消除无效的笛卡尔积,只保留两张表关联部分的数据。
怎么去除无效数据?
给多表查询加上连接查询的条件即可。
select * from emp , dept where emp.dept_id = dept.id;
2、多表查询有几种方式?各自什么含义?
连接查询
内连接:
隐式内连接:使用where子句来指定连接条件
显式内连接:使用join关键字来指定连接条件
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
根据子查询结果不同,分为:
A. 标量子查询(子查询结果为单个值)
B. 列子查询(子查询结果为一列)
C. 行子查询(子查询结果为一行)
D. 表子查询(子查询结果为多行多列)
3、事务是什么?举例说明
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
举例子:
比如学生部解散了,要删除部门及部门以下的员工, 如果删除部门成功了,而删除该部门的员工时失败了,此时就造成了数据的不一致。 要解决上述的问题,就需要通过数据库中的事务来解决。 此时只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。
4、MySQL默认事务是怎么提交的?
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句时,MySQL会立即隐式的提交事务
如果需要显式地控制事务的提交,可以使用start transaction 或 begin语句来开始一个事务,并使用commit语句来手动提交事务。同时,可以使用rollback语句来回滚事务,撤销已经执行的操作。
需要注意的是,如果在一个事务中执行了start transaction 或 begin语句,但没有显式地执行commit或rollback语句,那么事务将会在会话结束时自动回滚。这是因为MySQL默认使用的是自动提交模式,如果没有显式地提交或回滚事务,系统会自动回滚以保持数据的一致性。
如果需要关闭自动提交模式,可以使用set autocommit = 0语句来禁用自动提交,然后使用commit或rollback语句来手动控制事务的提交或回滚。
5、如何自己开启事务,提交事务,回滚事务?
命令 介绍
start transaction 或 begin 开启事务
commit 提交事务 (成功时执行)
rollback 回滚事务 (出错时执行)
例如
-- 开启事务
start transaction ;
-- 删除学工部
delete from dept where id = 1;
-- 删除学工部的员工
delete from emp2 where dept_id = 1;
-- 提交事务 (成功时执行)
commit ;
-- 回滚事务 (出错时执行)
rollback ;
6、事务的四大特性是什么含义?
【重点】事务的四大特性(ACID)
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
7、MyBatis是什么,作用是什么?
MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。
MyBatis的作用主要有以下几个方面
数据库访问
对象映射
缓存管理
事务管理
8、如果要创建一个SpringBoot项目要处理数据库数据需要哪些依赖?
Spring Boot Starter依赖:这是Spring Boot的核心依赖,包含了Spring Boot的基本功能和自动配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Spring Boot JDBC依赖:这个依赖提供了与数据库进行交互的功能,包括连接数据库、执行SQL语句等。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
数据库驱动依赖:根据你要使用的数据库类型,需要添加相应的数据库驱动依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
如果我们想把默认的数据库连接池切换为 Druid 数据库链接
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
9、简要描述我们如何创建一个SpringBoot项目支持MyBatis操作?
模拟需求:查询所有用户数据
①创建模块
创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包。
②数据准备
创建用户表user,创建对应的实体类 User。
# 用户表
create table user(
id int unsigned primary key auto_increment comment 'ID',
name varchar(100) comment '姓名',
age tinyint unsigned comment '年龄',
gender tinyint unsigned comment '性别, 1:男, 2:女',
phone varchar(11) comment '手机号'
) comment '用户表';
insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005');
//实体类
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
//省略GET, SET方法
}
③配置
配置数据库连接信息
#驱动类名称
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=1234
④持久层接口
创建一个接口 UserMapper 。
@Mapper
public interface UserMapper {
@Select("select * from user")
public List<User> list();
}
⑤测试
在创建出来的SpringBoot工程中,已经自动帮我们创建好了测试类要测试那个bean对象,直接通过@Autowired注解直接将其注入进行,就可以测试了。
@SpringBootTest
class Day09MySqlMybatisApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List<User> list = userMapper.list();
list.forEach(System.out::println);
}
}