Java从零开始 第16讲 MySQL基础,JDBC
从这一章开始,就到了JavaEE部分了,在本讲中我会首先介绍一些MySQL的基本知识,以及一些MySQL的基本语句,再然后介绍如何通过JDBC连接本机的数据库,以达到长久保存数据的效果
什么是MySQL
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
(以上来自于百度百科)
综上所述,不难看出MySQL的用途就是存储数据,不同于你将文件通过自定的方式存储(正如我们之间使用输出流存储数据到本地),它将数据通过一个规范的方式存储,并且为各种语言中数据的crud(即增删改查)提供了十分方便的API。
MySQL的安装
MySQL可以在这里进行下载
点我进入MySQL下载地址
目前最新的版本是8.0.23版本(2021/02/27),但是为了能够使用API,找到合适的教程(许多教程无法适配8.0的版本),还是推荐下载5.7.28或者33的版本

选择下载图上的版本就可以
在解压过后,在根目录我们需要干两件事:
- 新建一个空的data文件夹
- 新建一个txt文件,将其中内容改成如下,再将其更名为my.ini文件
(特别提示:不是1.txt.my.ini,文件全名应该为my.ini)
[mysql]
default-character-set=utf8
[mysqld]
port = 3306
basedir=E:\MySQL\mysql-5.7.28-winx64
datadir=E:\MySQL\mysql-5.7.28-winx64\data
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
explicit_defaults_for_timestamp=true
其中的basedir就是你存放MySQL的位置路径,datadir就是你刚刚创建的data文件夹的位置

左键点击此处空白位置就能直接复制路径,将你存放的路径替换上面我的路径即可,其他参数不用修改
接下来就是在你的电脑中安装MySQL,为了方便使用,我们先将bin目录的路径添加到环境变量中的path中

然后以管理员身份打开cmd

依次输入以下代码
- mysqld --initialize-insecure --user=mysql
- mysqld install
- net start mysql
第一段代码运行完后如果没有任何提示则是成功,第二段代码运行完后则会提升你安装成功,第三段代码结束后会提示你MySQL服务器启动了
安装成功后可以通过在cmd中键入
- mysql -u root -p
登录,默认密码为空,按下enter键即可

出现上述语句即为安装成功
MySQL的基本操作
相较于Java来说,MySQL的代码并不复杂,因为它对没有对于复杂逻辑的需求,在这一部分先让我们看看最简单的MySQL操作
在学习之前,先让我们理解以下MySQL的一些基础概念
- 数据库:存放表的库,一个MySQL中可以有无限个库,一个库中可以有无限个表
- 表:存放数据的表,其中每一行算为一条数据
- 字段:表头的每一项都可以被称为一个字段
- crud:create,retrieve,update,delete,增删改查
对数据库的操作
MySQL的一切操作都需要在数据库中进行,所以在输入具体操作指令前我们需要先进入某个数据库
- show database;
查看所有的数据库 - create database 库名 default charset=utf8;
创建一个数据库,编码方式为utf-8 - create database if not exists 库名 default charset=utf8;
如果不存在同名库,则创建该库 - use 库名;
进入指定的库 - drop database 库名;
删除指定的库
对表和表结构的操作
MySQL的所有数据都是存储在表中的,为了能够合理的存储数据,需要合理的创建表格,为表格定义合理的字段
MySQL的数据类型
和Java一样,MySQL也存在不同的数据类型用于存储不同类型的数据,主要有以下几类




以及修饰这些数据的一些关键字
- unsigned 无符号(给数值类型使用,表示只能为正数,不写可以表示正负数都可以)
- 字段类型后面加括号限制宽度
char(5). varchar(7) 在字符类型后面加限制 表示 字符串的长度
int(4) 没有意义,默认无符号的int为int(11),有符号的int(10)
int(4) unsigned zerofill只有当给int类型设置有前导零时,设置int的宽度才有意义。 - not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
- default 设置为默认值
- primary key 主键不能为空且唯一,一般和自动递增一起配合使用。
- auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
- unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速
创建和修改表
让我们创建一个名字为students的表来看看吧
create table students(
id int unsigned not null primary key auto_increment,
name varchar(20) not null,
password char(16) not null,
gender char not null default 'M',
age tinyint unsigned not null default 18,
gradeid int unsigned not null,
telephone int unsigned not null,
address varchar(32) not null,
birth date not null,
email varchar(32) not null
)engine=innodb default charset=utf8;
在这个表中,我们设定了id为主键,且是自增的,选用的引擎是innodb,默认编码格式是utf-8,其中加了很多数据
(特别提示:上一行输错的代码无法修改,只能输入\c然后enter取消此次操作)
创建完表格后,可以使用
-
desc 表名;
查看表结构 -
show create table 表名;
查看建表语句
创建完表之后,我们同样可以使用一些指定来修改表的结构
- alter table 表名 rename as 新表名
//更改表名 - alter table 表名 auto_increment = 1000;
//更改表中的自增值 - alter table 表名 engine = ‘myisam’;
//更改表所使用的引擎 - alter table 表名 add num int not null;
//追加一个字段num并在后面输入其数据类型 - alter table 表名 add email varchar(50) after age;
//在指定字段后面追加字段,在age字段后面添加email字段 - alter table 表名 add 字段名 int first;
//在表的最前面添加一个字段 - alter table 表名 drop 字段名;
//删除表中的指定字段 - alter table 表名 modify num tinyint not null default 12;
//修改表中的num字段的数据类型 - alter table 表名 change num newnum int;
// 修改表中的num字段的数据类型,并更名为newnum - drop table 表名
//删除表
上述所有的方法都可以在之后加上where限定条件,where将在下一节的查询数据部分详解
对表中数据的操作
插入数据-增
- insert into 表名(id,name,age) values(1,‘zhangsan’,20);
//标准添加,需要指定所有字段 - insert into 表名(name) value(‘zhangsan’);
//指定部分字段添加,如果有not null关键字的数据未被选中,则无法添加 - insert into 表名 value(null,‘wangwu’,21);
//快速添加(常用) - insert into stu values
-> (null,‘zhaoliu’,25),
-> (null,‘sunqi’,26);
//批量添加(常用)
查找数据-查
- select * from 表名;
//查询表中所有数据 - select * from 表名 where 条件;
//条件查询,where之后可以接
where age>20(年龄大于20)
where name=‘zhangsan’(name为zhangsan)
where age>25 and age<30或者where age between 25 and 30(年龄在25和30之间)
where age<25 or age>30(年龄不在25和30之间)
where name like ‘%wang%’(name包含wang)
where name like ‘wang%’(name以wang开头)
where name like ‘%wang’(name以wang结尾)
where name like ‘__’(name只有两个字符)
where name like ‘_w’(name只有两个字符,且第二个字符为w) - select max(age),min(age),sum(age),avg(age) from 表名;
//使用聚合函数查询表中的age字段的最大值,最小值,算术和,平均值,还有一个count()用于计算数据的个数,还可以使用max(age) as oldest使得查询出来的结果名字改为oldest - select classid,count(*) from users group by classid;
//查询各个班的人数,group by可以根据一个或多个列对结果进行分组,一般都是配合聚合函数使用 - select classid,count(*) from users group by classid having age>20;
//查询各个班大于20岁的人数,having就类似于where - select * from 表名 order by age;
//按年龄大小进行排序,从小到大 - select * from 表名 order by age desc;
//按年龄大小进行排序,从大到小 - select * from 表名 order by age,id;
//先按age进行排序,如果age相同则按id进行排序 - select * from 表名 limit 3;
//只查询3条数据 - select * from users limit 4,3;
//跳过前四条,查询三条数据
删除数据-删
- delete from 表名 where 条件;
//删除指定数据
更新数据-改
- update 表名 set 字段1=值1,字段2=值2…where 条件;
//更新指定数据
MySQL的进阶操作
- 嵌套/子查询
select cust_id,cust_name,(select count(*) from orders) from customers;
SQL支持在查询中创建子查询,即嵌套在其他查询中的查询 - 联结
如果数据存储在多个表中,想同时得到两个表中的数据,则需要联合两个表单,联结表主要有两个方法:
select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id = products.vend_id;
//将vendors和products表联结,使用vend_id作为匹配列,且因为两个表都有vend_id字段,我们需要用vendors.vend_id和products.vend_id区分
select vend_name,prod_name,prod_price from vendors,products inner join orders on vendors.vend_id = products.vend_id;
还有一种联结名为外部联结,可以包含没有关联行的那些行,需要将inner join改为left join,就可以让查询结果出现没有关联的数据行 - 组合查询
select vend_id,prod_id,prod_price from products where prod_price=5
union
select vend_id,prod_id,prod_price from products where vend_id in(1001,1002)
将两个sql语句一并执行,使用union可以过滤相同的项目,而使用union all则不会
MySQL还有很多更复杂的概念和操作,如事务,索引,SQL优化等等,这里我们就不详细讲解了,因为暂时用不到,如果有兴趣可以自己查查
JDBC类
引入JDBC的jar文件后,连接数据库的标准操作
String username = "admin";
String password = "admin";
Class.forName("com.mysql.jdbc.Driver"); //加载数据库驱动
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cw","root","");
//获取JDBC连接对象
//三个参数分别为数据库连接地址,账号,和密码
//地址格式为 主协议:子协议://ip地址:端口号/数据库名称
//这个地址是MySQL版本的标准连接地址
Statement state = conn.createStatement();//创建SQL语句执行条件
String sql = "update account set password='"+password+"' where username='"+username+"';";//构建你的MySQL语句
state.execute(sql);//执行这个语句
/*
//如果需要执行查找语句则需要
ResultSet rs = state.executeQuery(sql);//获取结果集
while(rs.next()){//如果有下一行
int id = rs.getInt("id");//获取字段名为id的int类型数据
//int id = rs.getInt(1);//获取表中第一个字段的数据,不推荐使用
String name = rs.getString("name");//获取字段名为name的String类型数据
}
使用完之后不能忘记释放连接
state.close();
conn.close();
为了解决sql注入问题,也可以改用PrepareStatement代替Statement,对sql语句进行预处理,代码上区别不是很大
String sql = "update account set password='?' where username='?';";
PreparedStatement state = conn.prepareStatement(sql);
state.setString(1, password);//在第一个问号处填充password
state.setString(2, username);//在第二个问号处填充username
state.execute(sql);//执行
JDBC中还有一些十分实用的功能,如Connection类中的事务操作(用于构建和执行事务)和Statement类和PreparedStatement类的批处理操作(同时执行多条语句),这里我们就不详解了,了解即可
本文介绍了MySQL数据库的基础知识,包括MySQL的安装、基本操作,如创建、修改数据库和表,以及对数据的增删改查。此外,还简述了JDBC在Java中连接和操作MySQL数据库的方法。
1395





