🧡🤎🧡🤎
感谢各位一直以来的支持和鼓励 , 制作不易
求点赞 收藏 关注
一键三连走起 ! ! !
🧡🤎 🧡🤎
一、深入理解MySQL
1.SQL语句的执行顺序
(1)SQL语句
SQL全称Structured Query Language,为 结构化查询语言,是非过程性语言。而SQL语句是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能,它可以分为四类:
- ①:DDL 数据定义语言(Data Definition Language)是专门用来定义数据库的对象的语言,如(创建,修改,删除)数据表、视图、索引等;
- ②:DML数据处理语言(Data Manipulation Language)该语言主要用于在数据库表中更新,增加和删除记录,例如 update, insert, delete;
- ③:DCL数据控制语言 ( Data Control Language)该语言是用于设置用户权限和控制事务语句的例如:grant,revoke,if…else,while,begin transaction;
- ④:DQL数据查询语言(Data Query Language) :主要是select;
(2)SQL执行顺序
执行SQL语句,我们最常用的关键字有六个,而这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,他们的执行顺序如下:
from——>where——>group by——>having——>select——>order by
- from:表示需要从哪个数据表检索数据
- where:是用来过滤表中数据的筛选条件
- group by:用来将上面过滤出的数据进行分组的
- having:主要对上面已经分组的数据进行过滤的条件
- select:用于查看结果集中的哪个字段列,或字段列的计算结果
- order by :表示按照什么样的顺序来查看返回的数据,desc降序 asc升序
2.视图(VIEW)
(1)了解视图
- 视图是由查询结果形成的一张虚拟的表。
- 视图是对若干张基本表的引用,它是一张虚表,是查询语句执行的结果。
- 视图不能存储具体的数据,如果基本表数据发生了改变,那么视图也会跟着改变。
- 视图可以与基本表一样,进行增删改查操作,但是视图增删改操作是有条件限制的。
(2)视图的创建
- 1.创建视图
视图创建的格式:
CREATE VIEW 视图名 AS 查询语句;
例如:
create view tmp as select * from student_info where age=25;
- 2.查看视图结构
格式;
DESC 视图名;
或者:
SHOW CREATE TABLE 视图名;
- 3.删除视图
格式;
DROP VIEW 视图名;
- 4.修改视图
格式:
alter view as select * from ...
- 5.修改视图的值
MySQL是可以对视图进行添加(insert)的,但不是全部的视图都可以进行insert,视图必须要满足以下的条件才可以进行insert:- ①:视图的数据和表为一一对应的关系时可以修改
- ②:视图必须要包含表中所有没有默认值的列。
(3)视图的作用
当我们的某个需求需要频繁的调用一个查询结果时,而每次都要调用一次查询,这样会比较麻烦,所以我们可是使用视图将该查询结果保存,这样就避免了频繁的使用查询语句,节省了很多时间。
- 视图的作用主要有以下4点:
- (1)用来简化查询。
- (2)用于权限控制。
- (3)用于大数据分表。
- (4)用于多表合并(使用union)。
3.索引
索引是用于快速找出在某个列中有一特定值的行,若不使用索引,那么MySQL就必须要从第一条记录开始读完整个表,一直到找出相关的行为止,这样的话,表越大,查询到数据所花费的时间就会越多;那么如果表中查询的列有一个索引,这样,MySQL就能够快速的到达索引的位置去搜索数据文件,而不需要再查看所有的数据,这样就会节省很大一部分的执行时间。所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引,这样可以大大的加快对数据的查询速度。
索引的使用格式;
ALTER TABLE 表名 ADD INDEX 索引名 (字段(列)名)
例如:
alter table shudent add index '总成绩' score;
SQL 索引的原理深入理解,可以参考链接:
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
4.事务和锁
-
事务就是指一段sql 语句的批处理操作,但是这个批处理必须要是一个atom(原子)并且不可分割,也就是说要么都执行,要么回滚(rollback)都不执行。
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才能支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
-
锁是计算机协调多个进程或线程并发访问某一资源的机制。
二、JDBC连接MySQL
1.实现JDBC连接MySQL登录
详细实现步骤代码演示
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
//jdbc连接mysql,获取到数据库中的数据
public class demo1_loginmysql {
public static void main(String[] args) throws Exception {
//1.加载第三方工具jdbc
Class.forName("com.mysql.jdbc.Driver");
//2.使用jdbc建立连接(ip 端口号 用户名 登录密码),获取connection连接对象
/* * String url="jdbc:mysql://master:3306/shujia"; * jdbc:数据库://ip(主机名):mysql端口号/要使用的数据库名 * String username="root"; 用户名 * String password="123456"; 密码 * Connection connection = DriverManager.getConnection(url, username, password); * */
Connection connection = DriverManager.getConnection(
"jdbc:mysql://master:3306/beimuchen","root","123456");
//3.写sql,并执行
String sql1="select * from student";
String sql2="select * from student where id=? and name=?";//用?通配符匹配字符
//获取执行器preparedStatement,传递sql语句
PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
preparedStatement2.setInt(1,1012);
//name给中文会查询不到但不报错,因为编码集不同,可以修改
preparedStatement2.setString(2,"jack");
//4.获取结果打印
ResultSet resultSet1 = preparedStatement1.executeQuery();//获取sql1执行的结果集
while (resultSet1.next()){
//遍历打印
String string = resultSet1.getString("name");
int id = resultSet1.getInt("id");
String sex = resultSet1.getString("sex");
int age = resultSet1.getInt("age");
System.out.println("id:\t"+id+"\tname:\t"+string+"\tsex:\t"+sex+"\tage:\t"+age);
}
System.out.println("------------------------------------------");
ResultSet resultSet2 = preparedStatement2.executeQuery();//获取sql2执行的结果集
while (resultSet2.next()){
//遍历打印
String string = resultSet2.getString("name");
int id = resultSet2.getInt("id");
String sex = resultSet2.getString("sex");
int age = resultSet2.getInt("age");
System.out.println("id:\t"+id+"\tname:\t"+string+"\tsex:\t"+sex+"\tage:\t"+age);
}
//5.关闭连接,从下往上
resultSet1.close();
preparedStatement1.close();
resultSet2.close();
preparedStatement2.close();
connection.close();
}
}
示例运行结果
2.使用封装优化JDBC连接数据库,以及操作
使用jdbc对数据进行增删改查,每执行一条数据,都要进
行一次连接,获取执行器结果集等操作,那么再写代码时就会造成代码冗余,那么我们可以将这些重复的代码封装起来,提高代码的复用性,那么具体该如何封装呢?看代码,就知道了》》》
import java.sql.*;
public class JDBCUtil {
//将各属性封装成变量,这样后期再次使用连接新的数据库时,仅需要修改很少代码(变量的值)
private static String DRIVER="com.mysql.jdbc.Driver";
private static String URL="jdbc:mysql://master:3306/beimuchen";
private static String USERNAME="root";
private static String PASSWORD="123456";
private static Connection connection;
private static PreparedStatement ps;
private static ResultSet rs;
//使用静态代码块,封装连接步骤
static {
try {
Class.forName(DRIVER);
connection =
DriverManager.getConnection(URL,USERNAME,PASSWORD);
}catch (Exception e){
e.printStackTrace();
}
}
//下面就是一些方法,来实现jdbc连接数据库的步骤分解
//获得连接Connection
public Connection getConn(){
return connection;
}
//获取执行器PreparedStatement
public PreparedStatement getPS(String sql)throws Exception{
ps=connection.prepareStatement(sql);
return ps;
}
//获取结果集resuleSet
public ResultSet select()throws Exception{
rs= ps.executeQuery();
return rs;
}
//将修改更新到数据库中
public int update() throws SQLException {
int i = ps.executeUpdate();
return i;
}
//使用完毕,关闭连接
public void close(){
if(rs!=null){
//如果有结果集,关闭结果集
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null){
//如果有执行器,关闭执行器
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
//如果有连接,关闭数据库连接
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
文章评论