Database

发布时间 2023-10-07 01:33:28作者: 3DG

MySQL

Structure Query Language(结构化查询语言)简称SQL

1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP 2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE 3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY 4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT

三大范式

1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。 2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。 3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。

创建库

create database db001;

展示库

show create database db1;

删除库

drop database db1;

切换

use db1;

查看当前使用的数据库

select database();

在操作数据表之前应使用“USE 数据库名;”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。

create table student( id int,name varchar(255), gender varchar (10), birthday date);

查看数据表

show tables;

查看表的基本信息

show create table student;

查看表的字段

desc student;

修改表名

alter table student rename to stu;

修改字段名

alter table stu change name sname varchar(10);

修改字段数据类型

alter table stu modify sanme int;

增加字段

alter table stu add address varchar(20);

删除字段

alter table stu drop address;

删除表

drop table stu;

数据表的约束

primary key 主键:约束用于唯一标识对应的记录

foreign key 外键:外键约束

not null 非空约束

unique 唯一性约束

default 默认值约束,用于设置字段默认值

主键约束

create table student( id int primary key,name varchar(20));

非空约束

create table student (id int ,name varchar not null);

默认值约束

create table student (id int, name varchar,gendet varchar(10) default 'male');

唯一性约束

create table student(id int,name varchar unique);

外键约束

建立主表

create table student(id int primary key,name varchar(20));

建立副表

create table class(classid int primary key,studentid int);

alter table class add constraint fk_class_studntid foreign key(studentid) references student05(id);

数据一致性

主表中的数据发生变化,从表对应数据也应有相应操作

删除外键

alter table class drop foreign key fk_class_studentid;

外键约束注意

从表的外键常为主表主键

为表中字段插入数据

insert into student (id,name,age,gender) values(1,'a',18,'male')

更新表中部分数据

update student set age=19,gendet='female' where name='giegie';

更新表中全部数据

update studnet set age=20;

删除部分数据

delete from student where age=17;

删除全部数据

delete from student;

查询所有字段

select * from student;

查询指定字段

select age from student;

关系运算符查询

select * from student where age<=17;

BETWEEN ADD 关键字查询

select * from student age between 19 and 20;

ADD关键字查询

select *from student where age < 18 and gender ='female';

OR关键字查询

select *from student where age>18 or gender = 'male';

LIKE关键字

select * from student where name like 'a';

含%通配的字符串

%用于匹配任意长度的字符串

select * from student where name like 'a%';

select * from student where name like '%d';

select * from student where name like '%a%';

含有_通配符的字符串

一个_代表一个字符

select * from student where name like ' aaa__';

使用limit限制查询结果的数量j

查询学生表中年纪最小的3位同学

select * from student order by age asc limit 3;

表与关联的关系

一对一

一对多

多对一

关联查询

查询Java班所有学生的MySQL命令

select * from student where classid = (select cid from class where = 'Java');

关联关系删除数据

例如:从班级表中删除Java班

先删除学生表中相关联的学生,否则学生表中的cid就失去了关联

delete from student where classid = (select cid from calss where cname='Java');

delete from class where cname ='Java';

交叉连接查询(实际运用中无意义)

返回的记过是被链接的两个表中所有数据行的笛卡尔积,也称笛卡尔链接

SELECT * FROM 表1 CROSS JOIN 表2;

内连接查询

又称简单链接或自然链接,对两个表中的数据进行比较,列出条件匹配的数据行

select emplouee.ename,department.dname from department inner join employee

on department.did+empluyee.departmentid;

SELECT 查询字段1,查询字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段

外连接查询

需要返回符合条件的以及左表或右表或两个表中的所有数据

SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件

select class.cid,class.cname,student.sname from class left outer jion student on class.cid=

student.classid;

select class.cid,class.name,student.sname from class right outer join student on class.cid=

studnet.cid

子查询

一个查询语句嵌套在另一个查询语句内部

首先执行子查询中的语句,再将返回的结果作为外层查询的过滤条件

查询Лукич所在班级的信息

select * from class where cid=(select classid from student where sname='Лукич');

查询比Лукич所在班级编号还大的班级的信息

select * from class where cid>(select classid from student where sname='Лукич');

关键字EXISTS子查询

关键字后的参数可以是任意一个子查询,不返回任何数据只返回TRUE或FALSE,返回为TRUE时,外层查询执行

select * from class where exists (select * from student where sname ='Лукич');

关键字ANY子查询

表示满足其中任意一个条件就返回一个结果作为外层查询条件

select * from class where cid > any (select classid from student);

关键字ALL子查询

满足所有内层查询条件返回结果

select * from class where cid> all( select classid from student);

MyBatis

一款半自动的ORM持久层框架。

ORM : Object Relation Mapping 对象关系映射。在Java对象和数据库的关系模型之间建立一种对应关系。

半自动:手动编写SQL语句。提供了输入映射和输出映射,可以方便地进行SQL参数设置,以及结果集封装。

持久层:可以立即保存在磁盘上,在这里可以理解为与数据库相关操作。

Hibernate : 全自动,只需定义ORM映射关系,就可直接进行CRUD操作。

步骤

  1. 编写全局配置文件

  2. 编写mapper映射文件

  3. 加载全局配置文件,生成SqlSessionFactory

  4. 创建SqlSession,调用mapper映射文件中的SQL语句来执行CRUD操作

例子

创建数据库
创建maven项目
导入依赖jar包

<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.10</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies>

根据数据表创建POJO类

import lombok.*;

@Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public class Student {

private Integer id;

private String name;

private Integer score;

private Integer age;

private Integer gender;

} 编写mapper映射文件(编写SQL)

<!-- StudentMapper.xml --> <?xml version="1.0" encoding="UTF-8" ?>

 

<mapper namespace="test"> <select id="findAll" resultType="com.yogurt.po.Student"> SELECT * FROM student; </select>

<insert id="insert" parameterType="com.yogurt.po.Student">
  INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});
</insert>

<delete id="delete" parameterType="int">
  DELETE FROM student WHERE id = #{id};
</delete>

</mapper>

编写数据源properties文件
db.url=jdbc:mysql://192.168.183.129:3306/yogurt?characterEncoding=utf8
db.user=root
db.password=root
db.driver=com.mysql.jdbc.Driver
编写全局配置文件(主要是配置数据源信息)

db.url=jdbc:mysql://192.168.183.129:3306/yogurt?characterEncoding=utf8 db.user=root db.password=root db.driver=com.mysql.jdbc.Driver

1
2
3
4

编写全局配置文件(主要是配置数据源信息)

<?xml version="1.0" encoding="UTF-8" ?>

 
<environments default="development">
  <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
          <!-- 从配置文件中加载属性 -->
          <property name="driver" value="${db.driver}"/>
          <property name="url" value="${db.url}"/>
          <property name="username" value="${db.user}"/>
          <property name="password" value="${db.password}"/>
      </dataSource>
  </environment>
</environments>

<mappers>
  <!-- 加载前面编写的SQL语句的文件 -->
  <mapper resource="StudentMapper.xml"/>
</mappers>

</configuration>

编写dao类
测试
注意:

1.编写mapper.xml,书写SQL,并定义好SQL的输入参数,和输出参数 2.编写全局配置文件,配置数据源,以及要加载的mapper.xml文件 3.通过全局配置文件,创建SqlSessionFactory 4.每次进行CRUD时,通过SqlSessionFactory创建一个SqlSession 5.调用SqlSession上的selectOne,selectList,insert,delete,update等方法,传入mapper.xml中SQL标签的id,以及输入参数 6.全局配置文件中各个标签按以下顺序配置(因为mybatis加载配置文件的源码按此顺序解析)

<configuration> <!-- 配置顺序如下 properties

<!--一般将数据源的信息单独放在一个properties文件中,然后用这个标签引入,在下面environment标签中,就可以用`${}`占位符快速获取数据源的信息-->

 settings
<!--用来开启或关闭mybatis的一些特性,比如可以用<setting name="lazyLoadingEnabled" value="true"/>来开启延迟加载,可以用<settings name="cacheEnabled" value="true"/>来开启二级缓存-->

typeAliases
<!--在mapper.xml中需要使用parameterType和resultType属性来配置SQL语句的输入参数类型和输出参数类型,类必须要写上全限定名,比如一个SQL的返回值映射为Student类,则resultType属性要写com.yogurt.po.Student,这太长了,所以可以用别名来简化书写-->

typeHandlers
<!--用于处理Java类型和Jdbc类型之间的转换,mybatis有许多内置的TypeHandler,比如StringTypeHandler,会处理Java类型String和Jdbc类型CHAR和VARCHAR。这个标签用的不多-->

objectFactory
<!--mybatis会根据resultType或resultMap的属性来将查询得到的结果封装成对应的Java类,它有一个默认的DefaultObjectFactory,用于创建对象实例,这个标签用的也不多-->

plugins
<!--可以用来配置mybatis的插件,比如在开发中经常需要对查询结果进行分页,就需要用到pageHelper分页插件,这些插件就是通过这个标签进行配置的。在mybatis底层,运用了责任链模式+动态代理去实现插件的功能-->

environments
<!--用来配置数据源-->

  environment
      transactionManager
      dataSource

mappers
<!--用来配置mapper.xml映射文件,这些xml文件里都是SQL语句-->
-->

</configuration>

#与$的区别

默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数(就像使用 ? 一样)。

这样做更安全,更迅速,通常也是首选做法,不过有时你就是想直接在 SQL 语句中直接插入一个不转义的字符串。

比如 ORDER BY 子句,MyBatis 就不会修改或转义该字符串了。

别名映射

起因:parameterType 和 resultType 的值 需要使用类的完全限定名 太麻烦 希望使用 简短的名字来替代 类的完全限定名

清空某个表

truncate 某个;

侵入式延迟 积极加载

侵入式延迟 访问主对象及主对象里面的属性时,不光会加载主对象(即从数据库中查询主对象的信息),还会一同加载关联对象。 积极加载

深度延迟 访问主对象属性时,只加载主,只有当访问关联对象的属性时,才会去加载关联对象。 按需加载

映射配置文件中子查询设置fetchType

fetchType=“eager” 不支持懒加载

fetchType=“lzsy” 支持懒加载

二级缓存

mybatis一级缓存默认开启,同一个SqlSession中查询条件一致则走一级缓存,一级缓存不能跨SqlSession

MyBatis如果想跨SqlSession缓存则可以采用将查询结果缓存至第三方,

例如:ehcache

memcached

redis

maven项目提前在pom.xml增加依赖
在核心配置文件中加入
<settings>
<setting name="cacheEnabled" value="true" />
</settings>
在映射配置文件中加入
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
缓存遇到commit失效
ehcache二级缓存在映射配置文件中加入
<cache type="org.mybatis.caches.ehcache.LoggingEhcache" />
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

回收策略: LRU – 最近最少使用的:移除最长时间不被使用的对象。 FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。 WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。