本文总结:MySQL是一种关系型数据库管理系统,支持SQL语言操作数据。文章介绍了MySQL的基本概念、安装连接方法、数据库创建及数据模型。重点讲解了SQL语句分类(DDL、DML、DQL、DCL)及其常用操作语法,包括表创建、约束设置、数据类型选择等。同时介绍了DataGrip等数据库管理工具的使用,以及JDBC和MyBatis框架的基本原理和操作方式。文章还涉及数据库连接池、XML映射配置等内容介绍。
MySQL简单介绍
MySQL数据库(DB),存储和管理数据的仓库。数据库管理系统(DBMS),操纵和管理数据库的大型软件。SQL,操作关系型数据库的编程语言,定义了一套统一标准。
MySQL安装:根据官方文档安装。
MySQL连接命令:mysql -hxxx -Pxxx -uxxx -pxxx(h数据库地址,P端口号,u数据库名字,p数据库密码)。
创建MySQL数据库命令:create database 名字;
关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
注:如果不是由二维表组成,则不是关系型数据库。
MySQL数据模型:客户端连接MySQL数据库服务器,再通过SQL语句操作数据。
SQL语句分为四类
DDL:数据定义语言,用来定义数据库表的对象(数据库,表,字段)
DML:数据操作语言,用来对数据库表的数据进行增删改
DQL:数据查询语言,用来查询数据库表的记录
DCL:数据控制语言,用来创建数据库用户,控制数据库的访问权限
DDL:对数据库、对表操作,创建表、数据类型、查询修改删除
数据库操作语法:
show databases;查询所有数据库
select database();查询当前数据库
use 数据库名;使用/切换数据库
create database [if no exists] 数据库名 [default charset utf8mb4];创建数据库
drop database [if exists] 数据库名;删除数据库
注:database可以替换成schema。default charset utf8mb4是创建字符集,MySQL8默认字符utf8mb4
DataGrip:数据库管理工具,管理和开发MySQL、Oracle、PostGreSQL,用来和数据库连接,和idea都是jetbrain旗下的,所以idea也集成了这个工具。因为用cmd窗口太单调,而且退出后没有记录的保存,所以用这款图形化工具编写SQL。
(重点)表操作语法:
1.创建表
create table tablename(
字段1 字段类型 [约束] [‘字段1注释’],
......
字段2 字段类型 [约束] [‘字段2注释’]
)comment ‘表注释’;
约束:作用于表中字段的规则,用于限制存储在表中的数据,保证数据库中数据的正确性,有效性,完整性,有些需要唯一性例如id、用户名。要指定多个约束,中间用空格隔开。
数据库中常见的5种约束:
约束 描述 关键字
1.非空约束 限制该字段值不能为null not null
2.唯一约束 保证字段的所有数据都是唯一 unique
3.主键约束 主键是一行数据的唯一标识,非空且唯一 primary key
4.默认约束 保存数据时,如果未指定字段值,则采用默认值 default ‘值’
5.外键约束 让两张表的数据建立连接,保证数据一致性和完整性 foreign key
补充:主键约束,一张表只能有一个主键,还可以在primary key后加auto_increment表示主键自增,如给id添加主键约束,则不需要手动输入1,2,3...会自动添加,会从最大值开始往后自增,避免主键值重复。
2.数据类型
MySQL中的数据类型主要分三类,数值类型、字符串类型、日期时间类型。
数值类型:tinyint、smallint、mediumint、int、bigint、float(单精度)、double(双精度)、decimal(精度更高),小数型的写法例如float(整个数字长度,小数位个数)
数值类型的选取原则:在满足业务需求的前提下,尽可能选占据最小磁盘空间的。如,年龄就可以选无符号的整型tinyint写法:age tinyint unsigned
字符串类型:char(定长字符串)、varchar(变长字符串)、tinyblob、tinytext、blob、text、mediumblob、mediumtext、longblob、longtext
例如,char(10)为固定占用10个字符空间,varchar(10)为最多占用10个字符空间,如存入A,则char型占10个空间,varchar型占1个空间。
日期类型:date、time、year、datetime、timestamp
3.查询修改删除
show table; ---查询当前数据库的所有表
desc table; ---查询表结构
show create table 表名; ----查询建表语句
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束]; ---添加字段
alter table 表名 modify 字段名 新数据类型(长度); ---修改字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
---修改字段名与字段类型
alter table 表名 drop column 字段名; ---删除字段
alter table 表名 rename to 新表名; ---修改表名
drop table [if exists] 表名; ---删除表
DML:对数据库中表的数据进行操作,增删改
增(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 条件];
[where 条件]意思是满足这个条件才更新,可写可不写,不过如果不写条件则会把整个数据表都更新修改。
删(delete):delete from 表名 [where 条件];
删掉的是指定条件的那一整行的数据,delete操作不能删除某个字段的值,如果要删只能用update将这个字段设为NULL。
DQL(常用):对表中的数据进行查询操作,关键字select
完整的DQL语句语法:
select 字段列表
from表名列表
where条件列表
group by分组字段列表
having分组后条件列表
order by排序字段列表
limit 分页参数
基本查询(select...from...):
查询多个字段:select 字段1,字段2,字段3 from 表名;
查询所有字段2种:select * from 表名; select 列所有字段 from表名;(推荐)
为查询字段设置别名,as可以省略:select 字段1[as 别名1] from 表名;
去除重复记录:select distinct 字段列表 from 表名;
条件查询(where):select 字段列表 from 表名 where 条件列表;
条件涉及到比较运算符和逻辑运算符:
>、<、=、>=、<=、!=或<>、between...and...(在某个范围内,含最大最小值)、in(...)(满足在in中的值,多选一类似or)、like 占位符(模糊匹配,_匹配单个字符,%匹配任意个字符)、is null(是null)、is not null(不是null)、and或&&、or或||、not或!
分组查询(group by):select 字段列表 from 表名 where 条件列表 group by 分组字段名 [having 分组后过滤条件];
分组会涉及到聚合函数:就是将一列数据作为一个整体,进行纵向计算,数据为null值的不参与所有聚合函数的计算。count函数有三种同样效果的方法优先推荐使用*然后常量再是字段,count(字段)、count(*)、count(常量)、max(字段)、min(字段)、avg(字段)、sum(字段)。
where和having之间的区别:where是分组之前过滤的,不满足where条件的不参与分组,having是分组之后过滤的条件,where不能对聚合函数进行判断,而having可以。
排序查询(order by):select 字段列表 from 表名 where 条件列表 group by 分组字段名 [having 分组后过滤条件] order by 排序字段 排序方式;
分为升序(asc)和降序(desc),默认为升序,asc可以不写。
分页查询(limit):select 字段列表 from 表名 where 条件列表 group by 分组字段名 [having 分组后过滤条件] order by 排序字段 排序方式 limit 起始索引,查询记录数;
起始索引为0,为0时可以省略不写,查询记录数是每页展示的个数。工作中前端传过来的是页码要转起始索引,起始索引计算公式:(页码-1)*查询记录数。
分页查询是方言,每个数据库都有自己的关键字,MySQL是limit。
JDBC(了解即可)
用Java程序操作数据库,就是用Java语言操作关系型数据库的一套API
JDBC是最底层的,像Mybatis、MybatisPlus、Hibernate、SpringDataJPA都是操作数据库的,它们底层都基于JDBC。
使用步骤:创建Maven项目,引入依赖,准备数据库表,在idea编写JDBC程序
1.//注册驱动Class.forname(className:”...”); 2.//获取数据库连接String url=”jdbc:mysql://localhost:3306/数据库表的文件名:”; String username=”root”; String password=”123456”; Connection connection=DriverManager.getConnection(url,username,password); 1. //获取SQL语句执行对象 Statement statement = connection.createStatement(); 2. //执行SQL statement.executeUpdate(sql:”写DML语句”); 3. //释放资源 statement.close(); connection.close();基础JDBC执行DQL语句,将查询结果封装到表的对象中:
ResultSet(结果集对象):ResultSet rs=statement.executeQuery()。
它的查询后解析方法有next(),将光标从当前位置向前移动一行,并判断当前行是否为有效行,返回值为boolean。getXxx(),获取数据,可以根据列的编号获取,也可以根据列名获取(推荐),Xxx为类型。通常用while循环来查询。
预编译SQL(推荐)
PreparedStatement ps = conn.preparedStatement(“......where username=? and password=?”);
优势一:可以防止SQL注入,更安全。
SQL注入:通过控制输入来修改预先设置好的SQL语句,以达到执行代码对服务器攻击的方法。
优势二:性能更高
Mybatis:优秀的持久层(dao)框架,用于简化JDBC的开发
使用步骤:创建springboot工程,引入Mybatis相关依赖,准备数据库表、实体类,application.properties中配置数据库连接信息,定义Mapper接口(@Mapper),编写SQL,在springboot的单元测试类上需要添加@SpringBootTest。
Mybatis的辅助配置:
配置SQL提示,提高开发效率:在idea中右击选择show context actions然后选择inject language or reference,然后还要和数据库建立连接,在idea中的database的source中选择MySQL。
配置Mybatis的日志输出:在application.properties中输入mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
Mybatis的优势:解决了JDBC的硬编码(配置)、繁琐、资源浪费、性能降低。
数据库连接池:它是个容器用来分配、管理数据库连接,类似于线程池。
连接池作用:允许应用程序重复使用一个现有的数据库连接,而不是重新再建一个,就是用完后不会关闭这个连接资源,而是返回连接池,下一个要连接再从连接池拿出来。还可以避免用户长久占用连接而没有归还连接池,导致的数据库连接遗漏问题,通过预设占用SQL连接而不执行的空闲时间,时间到则归还。
数据库连接池标准接口:DataSource,由第三方组织实现此接口,
获取连接:Connection getConnection() throws SQLException;
常见数据库连接池产品:Druid(德鲁伊)、Hikari(追光者)、C3P0、DBCP,常用前两种连接池,Hikari是springboot默认自带的,不需要配置。
切换数据库连接池步骤:引入连接池的依赖,然后再在application.properties中配置连接池,spring.datasource.type=连接池路径
Mybatis中的增删改查操作
在Mapper接口中书写
删除操作:
@Delete(“delete from user where id=#{id}”) //#{}类似预编译 public void deleteById(Integer id);也可以有返回值把void替换掉,返回的是DML语句执行影响的记录数。
#{}(推荐)和${}的区别:#{}是占位符,会替换成?,生成预编译SQL,通常用在动态修改数据。而${}是字符串拼接符,将参数值直接拼在SQL中,通常用于动态修改表名和字段名。
新增操作:
@Insert(“insert into user(name,age,password) values(#{name},#{age},#{password})”) public void insert(User user);由于可能新增的字段数据比较多,如果在方法里一个一个写比较麻烦,所以使用User对象来把字段封装进去,那么字段就变成对象里的属性名来使用。
更新操作:
@Update(“update user set name=#{name},age=#{age} where id=#{id}”) public void update(User user);查询操作:
@Select(“select * from user where username=#{username} and password=#{password}”) public user findUserNameAndPassword(@Param(“username”)username, @Param(“password”) String password);因为Java执行后将它编译成字节码文件后,例如username、password名字不会保留下来,如果是多个形参,那#{username}、#{password}就找不到对应的名字的值,所以要用@Param()来起对应别名。而如果是单个形参就不需要。基于官方骨架创建的springboot项目,@Param注解可以省略不写。
XML映射配置
在Mybatis中既可以通过注解来配置SQL语句,也可以通过XML配置文件配置SQL语句。
XML默认规则:1.XML映射配置文件名与Mapper接口名称一致,并且都放在相同包下(相同包名)。xml文件配置信息去Mybatis官网copy。
2. XML文件中的namespace属性为Mapper接口全限名一致(包名和接口名都要写)。
3. XML文件中sql语句的id与Mapper接口的方法名一致,并保持返回类型一致。
例
<mapper namespace=”com.itheima.mapper.userMapper”> <select id=”findAll” resultType=”com.itheima.pojo.User”> //resultType写封装的对象 select id,name,username,password,age from user </select> </mapper>开发中,如果是简单的增删改查就用注解,如果要实现复杂的SQL功能,用XML。
辅助配置XML映射文件位置:如果没有按规则配置xml,可在application.properties中指定位置,mybatis.mapper-locations=classpath:目录下的文件名/*.xml
辅助配置快速开发提高效率:MybatisX是一款插件,可以快速定位Mapper接口以及Mapper映射配置文件。