MySQL&JDBC(Java)基础知识

MySQL数据库

1.1、数据库的概述:

数据库就是存储数据的仓库,其本质是一个文件系统,数据库按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加、修改、删除及查询操作。

1.2、SQL语句
什么是SQL语句

结构化查询语言。关系数据库语言的国际标准。

SQL的分类

(1)数据定义语言:简称DDL(Date Definition Langguage),用来定义数据库对象;数据库 database, 表 table,列 column等;关键字:创建 create, 修改 alter,删除 drop等(结构);
(2)数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:插入 insert,删除 delete,更新 update等数据。
(3)数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录,关键字:select,from,where等。
(4)数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户:关键字:grant等。

1.3、对数据库的操作
创建一个数据库

create database 库名;(不带编码)
在这里插入图片描述
create database 库名 character set (编码utf8/gbk);
在这里插入图片描述

删除一个数据库

drop database 库名;

在这里插入图片描述

使用数据库

use 库名
在这里插入图片描述
查看当前正在使用的数据库
select database();
在这里插入图片描述

1.4、对数据库表的操作
创建表

create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
);
在这里插入图片描述

查看数据库表

查看数据库表
show tables;
在这里插入图片描述
查看表结构
desc 表名;
在这里插入图片描述

删除一张表

drop table 表名;
在这里插入图片描述

修改表

添加一列
alter table 表名 add 字段名 类型(长度) [约束];
在这里插入图片描述
修改列的类型(长度、约束)
alter table 表名 modify 被修改的字段名 新类型(长度)[约束];
在这里插入图片描述
修改列名
alter table 表名 change 旧列名 新列名 类型(长度)[约束];
在这里插入图片描述
删除表的列
alter table 表名 drop 想要删除的列名;
在这里插入图片描述
修改表名
rename table 旧表名 to 新表名;
在这里插入图片描述
修改表的字符集
alter table 表名 character set 编码(gbk/utf8);
查看当前的编码
在这里插入图片描述
修改后的编码
在这里插入图片描述

1.5、对数据库表记录的操作(插入(insert)、删除(delete)、更新(update))[DML]
插入记录:insert

insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……); //向表中插入某一列
在这里插入图片描述
insert into 表名 values(值1,值2,值3……); //向表中插入所有列
在这里插入图片描述
注意:
1、列名数与values后面的值得个数相等;
2、列的顺序与插入的值的顺序一致;
3、列名的类型与插入的值的类型要一致;
4、插入值的时候不能超过最大长度;
5、值如果是字符串或者日期需要加引号 ’ '(一般是单引号);

更新记录:update

不带条件的修改:
update 表名 set 字段名=新值,字段名=新值,字段名=新值… //将表中所有的值进行修改
在这里插入图片描述
带条件的修改:
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件 //将符合条件的值进行修改。条件在表中具有唯一性才可作为条件;

在这里插入图片描述
注意:
1、列名的类型与修改的值要一致;
2、修改值的时候不能超过最大长度
3、值如果是字符串或者日期需要加引号 ’ '(一般是单引号);

删除记录:delete

带条件的删除:
delete from 表名 where 条件;
在这里插入图片描述
在这里插入图片描述

不带条件的删除:
delete from 表名;
在这里插入图片描述
注意:说说delete与truncate的区别?
delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。
truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。
delete删除,uid不会重置!而使用truncate操作,uid会重置。

cmd中文乱码解决方法

将编码设置成gbk;
set names gbk;
在这里插入图片描述

1.6 对数据库表记录的查询(Query)操作 [DQL]
基本查询

查询所有商品
select * from product;
在这里插入图片描述
查询商品的名称和价格
select uname,uprice from product;
在这里插入图片描述
使用表别名查询所有商品信息
select * from product as pro; // as关键字可以省略不写
//别名只具有暂时性,不具有永久性
在这里插入图片描述
使用列别名,单独查询商品名;
select uname as name from product;
在这里插入图片描述
去掉重复值(按照价格)
select uprice from product;
在这里插入图片描述
将所有的商品的价格+10进行显示
select uname,uprice+10 from product;
在这里插入图片描述

条件查询

查询商品名称为"旺旺饼干"的商品信息
select * from product where uname=‘旺旺饼干’;
在这里插入图片描述
.查询价格>60元的所有商品信息
select * from product where uprice>60;
在这里插入图片描述
查询商品名称含有"饼干"字的商品信息 // 模糊查询 关键字 like
select * from product where uname like ‘%饼干%’;
在这里插入图片描述
查询商品id在(1,3,5)范围内的所有商品信息 //范围查询 关键字 in
select * from product where uid in(1,3,5);
在这里插入图片描述
.查询商品名称含有"饼干"字并且id为1的商品信息
select * from product where uname like ‘%饼干%’ and uid=1;

在这里插入图片描述
.查询id为2或者5的商品信息
select * from product where uid=2 or uid =5;
在这里插入图片描述

排序

格式:select * from 表名 order by 字段名 [降 desc] [升 asc];

查询所有的商品,按价格进行排序(升序、降序)
select * from product order by uprice asc;
在这里插入图片描述
select * from product order by uprice desc;
在这里插入图片描述

.查询名称有"干"的商品信息并且按照价格降序排序; //如果要同时对其进行条件查询和排序,排序应放最后
select * from product where uname like ‘%干%’ order by uprice desc;
在这里插入图片描述

聚合函数

常用的聚合函数:sum()求和、avg()求平均数、min()求最小数、max()求最大数、count()计数

.获得所有商品的价格的总和;在这里插入图片描述

.获得所有商品的平均价格
在这里插入图片描述
获得所有商品的个数;
在这里插入图片描述

分组操作

添加分类
alter table product add cid varchar(32); //给表格取个分组名cid
在这里插入图片描述
update product set cid=‘1’;
update product set cid=‘2’ where pid in (3,4,5); //将cid分为1、2组,1组的范围为(1,2,6),2组的范围为(3,4,5);
在这里插入图片描述
根据cid字段分组,分组后统计商品的个数。
select cid,count(*) from product group by cid;
在这里插入图片描述
根据cid分组,分组统计每组商品的平均价格,并且平均价格大于60元。
select cid ,avg(uprice) from product group by cid having avg(uprice)>60; //关键字 having,分组查询的条件,与where类似;
在这里插入图片描述

SQL查询语句关键字的优先级

select 一般在的后面的内容都是要查询的字段
from 要查询到表
where 查询条件
group by 分组字段
having 分组后带有条件只能使用having
order by 它必须放到最后面

1.7、MySQL多表操作

外键

现在有两张表“分类表”和“商品表”,为了表明右边的“商品表”中的商品属于左边“分类表”的那个分类,在左边的“商品表”中加入一列,用于存放分类cid的信息,我们将此列称为外键;
在这里插入图片描述
在这里插入图片描述

声明外键约束

外键约束语法:alter table 从表名 add [constraint] [外键名称] foreign key (从表外键字段) references 主表名 (主表的主键名)
注意:[外键名称] 为外键取一个名称,一般以" _fk "结尾,主要是用来删除外键约束时使用,但是若不需要删除外键约束操作时,可不必添加 [constraint] [外键名称];
删除外键约束语法:alter table 从表 drop foreign key 外键名称;

一对多,分类和商品

创建“分类表”和“商品表”,并添加数据。
在这里插入图片描述
在从表中添加外键字段
在这里插入图片描述
声明外键约束
在这里插入图片描述
添加表格数据
在这里插入图片描述
主从表更新问题:
当两张表没有建立任何关系的时候,那么可以随意删除其中任何一张表中的任何记录,但是一旦把两张表建立了关系(主外键约束)之后,那么不能删除主表中的数据(这些数据内容在从表中有关联关系的数据),只想执行删除(更新操作),那么就会出现下图中的错误。
在这里插入图片描述
如何解除主从键之间的约束关系,删除主表中的数据;
1.解除主从表的约束关系
删除外键约束语法:alter table 从表 drop foreign key 外键名称;
在这里插入图片描述
2.先删除从表中与主表有关系的数据,再删除主表中的数据。
在这里插入图片描述
在这里插入图片描述

多对多,订单和商品

在这里插入图片描述
创建订单表和订单项表
在这里插入图片描述
订单表和订单项表的主外键关系
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
在这里插入图片描述
商品表和订单项表的主外键关系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references products(pid);
在这里插入图片描述

多表查询

(1)交叉连接查询(基本不会用,得到的是两个表的乘积,作用不大)
语法:select * from 表1,表2;
(2)内连接查询
隐式内连接:select * from 表1,表2 where 条件;
在这里插入图片描述
显式内连接:select * from 表1 inner join 表2 on 条件;
在这里插入图片描述
(3)外连接查询:
左外连接:select * from 表1 left outer join 表2 on 条件;
在这里插入图片描述
右外连接:select * from 表1 right outer join 表2 on 条件;
在这里插入图片描述

子查询

一般子查询会存在于两张关联的表中,那么我们可以先把带有条件的那张表与另外一张表的关联关系字段查出来,并作为另外一张表查询的条件值,然后再次进行查询。

例:查询“服装服饰”分类上架商品详情。

先查主表的主键(根据指定的条件(<服装服饰,cname>)
select cid from categorys where cname=’服装服饰’;
在这里插入图片描述
根据查询得出的主键查询所有商品的详细信息(根据分类id查询):
select * from products where categorys_id=‘c003’;
在这里插入图片描述
最后根据两个条件查询“服装服饰”分类上架商品详情。
select * from products where categorys_id=( select cid from categorys where cname=’服装服饰’);
在这里插入图片描述

分页查询

分页查询使用的是limit关键字进行查询。它后面有两个参数。
第一个参数是起始的位置,取值为:(需要查看第几页的页数-1)*第二个参数值;
第二个参数是每页需要显示的条目数。

举例:商品表中有9条记录,现在需要进行分页显示,每页显示3条数据。现在需要查看第2页的数据。那么应该使用的sql语句是:
select * from products limit 3,3;
在这里插入图片描述

JDBC(Java)

1.1、JDBC的概念

JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

1.2、JDBC开发步骤

(1)导入mysql数据库的驱动jar包
mysql-connector-java-5.1.39-bin.jar;

(2)注册驱动
class.forName(“com.mysql.jdbc.Driver”);

(3)获得连接
DriverManager.getConnection(url,username,password);,
解释:url相当于要连接的数据库的网址,MySQL的连接网址为:
jdbc:mysql://localhost:3306/web;
 第一部分是jdbc,这是固定的;
 第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
 第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及连接的数据库的名称(web)组成。
username:用户名:一般为"root";
password:用户密码:自定义;
最终的获取连接语句为:
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/web”,”root”,”自定义”);

(4)获得语句执行对象
Statement stmt = con.createStatement();

(5)执行SQL语句·
String sql = “ select * from products ”;
ResultSet rs = stmt.executeQuery(sql);

(6)处理结果
rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据

(7)释放资源
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.close();

JDBC连接的完整代码(不建议使用)

package cn.zzq.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**

  • 测试查询所有用户的类
  • @author Administrator

*/
public class QueryAll {
public static void main(String[] args) {
QueryAll qa = new QueryAll();
qa.testQueryAll();
}
public void testQueryAll(){
Connection conn= null;
Statement stmt = null;
ResultSet rs = null;
try {
//1.注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2.获取连接
String url =“jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=utf8”;
String username=“root”;
String password=“1234”;
conn = DriverManager.getConnection(url,username,password);
//3.获取执行sql语句对象
stmt = conn.createStatement();
//4.编写sql语句
String sql = " select * from user “;
//5.执行sql语句
rs = stmt.executeQuery(sql);
//6.处理结果集
while(rs.next()){
System.out.println(“用户名:”+rs.getString(2)+” 密码:"+rs.getString(“upassword”));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

1.3、进一步完善JDBC,解决注入攻击问题(建议使用)

package cn.zzq.testjunit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestLogin {
public static void main(String[] args) {
TestLogin test = new TestLogin();
try {
test.login1(“zs ‘or’ zs”,“43994”);
} catch (Exception e) {
e.printStackTrace();
}
}

public void login1(String username,String password) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2.获取连接
Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/web”, “root”, “1234”);
//3.编写SQL语句
String sql = “select * from tbl_1 where uname=? and upassword=?”;
//4.创建预处理对象
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
//5.执行处理对象
ResultSet rs = pstmt.executeQuery();
//6.处理结果集
if(rs.next()) {
System.out.println(“登陆成功:”+" "+username);
System.out.println(sql);
}else {
System.out.println(“登陆失败”);
}
if(rs!=null)rs.close();
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值