社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
1.排序:order by
ASC:升序
DESC:降序
2.聚合:
count(列名) 统计数量
max(列名) 最大值
min(列名) 最小值
sum(列名) 求和
avg(列名) 平均值
3.分组:
having用于分组之后,可以执行聚合函数
4.分页查询:limit
//查询三条数据
select * from table limit 0,3;
** 重要公式:起始索引=(当前页码-1)*每页的条数 **
5.约束
6.外键:
7.多表查询
1.select * from 表1,表2;
查询的结果为笛卡尔积,取两个表的全部组合情况
2.select * from 表1,表2 where 表1.属性=表2.属性
来消除无效属性
3.内连接
隐式内连接:select 字段列表 from 表1,表2 ... where 条件;
显示内连接:select 字段列表 from 表1 [INNER] JOIN 表2 ON 条件;
4.外连接
//左外连接:查询表1的全部数据以及表1和表2的交集数据
左外连接:select 字段列表 form 表1 left [OUTER] join 表2 ON 条件;
//右外连接:查询表2的全部数据以及表2和表1的交集数据
右外连接: select 字段列表 from 表1 right [OUTER] join 表2 ON 条件;
8.子查询
//查询小王的工资
select salary from emp where name="xiaowang";
结果为3600
//查询高于小王工资的员工信息
select * from emp where salary>3600;
//使用子查询
select * from emp where salary>(select salay from emp where name="xiaowang");
数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,这一组数据库命令要么同时成功,要么同时失败
事务是一个不可分割的工作逻辑单元
原子性:事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性:事务完成时,必须使所有的数据都保持一致
隔离性:多个事物之间,操作的可见
持久性:事务一旦提交或者回滚,它对数据库中的数据的改变就是永久的
//查询事务的默认提交方式
select @@autocommit;
//修改事务的自动提交方式
set @@autocommit=0;
ENGINE即引擎,而是数据库存储引擎.数据库引擎是用于存储、处理和保护数据的核心服务。
数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是插件式存储引擎。
注意:修改mysql数据库的引擎使用ALTER关键字
ALTER TABLE testalter_tbl ENGINE = MYISAM;
在大型数据库中,一组为了完成特定功能的SQL语句集,它存储在数据库中,一次编译,永久有效。用户通过指定存储过程的名字并且给出参数(有的无参)来执行它。 它可以极大的提高数据库的效率
存储过程分类:
1.系统存储过程:以sp开头,用来进行系统设定,取得信息和相关管理工作。
2.本地存储过程:用户创建的
3.临时存储过程
本地临时存储过程:以#开头,谁创建谁使用
全局临时存储过程:以##开头,任意用户都可以使用且不需要特定的权限
4.远程存储过程:
5.扩展存储过程:以xp开头
基本语法:
MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。
//创建
create procedure 存储过程名([ IN | OUT | INOUT ] <参数名> <类型>,.....)
......
begin
要执行的操作
end
//执行
call 存储过程名(参数);
//删除存储过程
drop procedure 存储过程名;
注意:在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。
为解决以上问题,通常使用 DELIMITER 命令将结束命令修改为其他字符。语法格式如下:
DELIMITER $$
语法说明如下:
$$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个“¥”等。
当使用 DELIMITER 命令时,应该避免使用反斜杠“\”字符,因为它是 MySQL 的转义字符。
若希望换回默认的分号“;”作为结束标志,则在 MySQL 命令行客户端输入下列语句即可:
DELIMITER ;
创建无参的存储过程:
创建in类型的参数
执行call b(2);
创建OUT类型的存储过程:
结果:
inout参数存储过程说明
总结:存储过程主要有参数模型 in out inout
in 是输入参数
out 是输出参数
inout 是输入并输出
用户变量
定义在当前客户端的连接下的变量,其作用域在当前客户端连接下均有效,当当前客户端断开连接后则该变量结束生命周期。其对其他客户端连接不可见
变量赋值:
注意:
returns:返回值类型
return:返回值
MySQL触发器是与表关联的数据库存储程序,用于响应关联表中发生的事件(例如插入,更新或删除)而自动调用。
SQL标准定义了两种类型的触发器:行级触发器和语句级触发器。
步骤:
package com.itheima;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* JDBC快速入门
*/
public class JDBC_demo1 {
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接(三个参数:url username password)
String url="jdbc:mysql://127.0.0.1:3306/db1";
String username="root";
String password="1234";
Connection conn=DriverManager.getConnection(url,username,password);
//定义SQL语句
String sql="update salary_staff set money=500 where id=1";
//4.获取执行sql对象 Statement
Statement stmt=conn.createStatement();
//5.执行sql 如果更新操作,会返回int类型的数值,代表受影响的行数
int count=stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
}
}
1.注册驱动
2.获取数据库连接
1.获取执行sql的对象
2.管理事务(搭配try catch)
1.执行SQL语句
executeQuery(sql):执行DQL
executeUpdate(sql):执行DML DDL 返回受影响的行数(int) 0:失败
数据查询语言DQL
数据操纵语言DML
插入
删除
修改
数据定义语言DDL
数据控制语言DCL
SQL注入:
SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。
1.封装了DQL查询的结果
ResultSet rs=stmt.executeQuery(sql);
//返回处理结果
//next()方法:光标向下移动一行,判断当前 行 是否有数据
while(rs.next())
{
//获取数据 getXXX()
int id=rs.getInt(1);
String name=rs.getString(2);
String money=rs.getString(3);
或者
int id=rs.getInt("id");
String name=rs.getString("name");
String money=rs.getString("money");
//打印数据,返回每一行的数据
System.out.println(id+"==>"+name+"==>"+money);
}
实现代码如下:
package com.itheima;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 查询salary_staff表中的数据封装到Account对象中,并且存储到list集合中
*/
public class JDBC_demo2 {
public static void main(String[] args) throws Exception {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
String url="jdbc:mysql://127.0.0.1:3306/db1";
String username="root";
String password="1234";
Connection conn=DriverManager.getConnection(url,username,password);
//定义sql
String sql="select * from salary_staff";
//获取执行sql对象 Statement
Statement smtt=conn.createStatement();
//执行sql
ResultSet rs=smtt.executeQuery(sql);
//返回结果集并且将数据封装入Account对象中,之后将数据加入list集合
List<Account> list=new ArrayList<>();
while (rs.next())
{
int id= rs.getInt("id");
String name=rs.getString("name");
String money=rs.getString("money");
Account account=new Account(id,name,money);
list.add(account);
}
//释放资源
smtt.close();
conn.close();
//遍历list集合
for(Account element:list)
{
System.out.println(element.toString());
}
}
}
SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
String sql="select * from student where name=? and password=?";
//通过Connection对象获取sql执行对象,并且传入相应的sql语句
PreparedStatement prtt=conn.preparedStatement(sql);
//设置?的值
String name="zhangsan";
String password="123456";
//1代表第一个问号,2代表第二个问号
prtt.setString(1,name);
prtt.setString(2,password);
//执行sql,不需要传入sql
prtt.executeQuery();
PreparedStatement原理:
1.在获取PreparedStatement对象的时候,将Sql语句发送给mysql服务器进行检查,编译(耗费时间)
2.执行时就不用再进行这些步骤了,速度较快
3.如果sql模板一样,则只需要进行一次检查、编译
Druid连接池使用:
package com.itheima;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class Druid_demo1 {
public static void main(String[] args) throws Exception {
//导入jar包
//定义配置文件
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("JDBC-demo/src/druid.properties"));
//获取连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接对象
Connection connection=dataSource.getConnection();
}
}
字段替换:CTRL+R
alt+鼠标左键 整列编辑
//sql文件
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
-- id 主键
id int primary key auto_increment,
-- 品牌名称
brand_name varchar(20),
-- 企业名称
company_name varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(100),
-- 状态:0:禁用 1:启用
status int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
('小米', '小米科技有限公司', 50, 'are you ok', 1);
SELECT * FROM tb_brand;
##############################################################
//实体类Brand
package com.itheima;
/**
* 商品品牌
*/
public class Brand {
// id 主键
private Integer id;
// 品牌名称
private String brand_name;
// 企业名称
private String company_name;
// 排序字段
private Integer ordered;
// 描述信息
private String description;
// 状态:0:禁用 1:启用
//建议使用Integer,包装类型默认值为null,int类型默认值为0
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrand_name() {
return brand_name;
}
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
}
public String getCompany_name() {
return company_name;
}
public void setCompany_name(String company_name) {
this.company_name = company_name;
}
public Integer getOrdered() {
return ordered;
}
public void setOrdered(Integer ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Brand()
{
}
public Brand(Integer id, String brand_name, String company_name, Integer ordered, String description, Integer status) {
this.id = id;
this.brand_name = brand_name;
this.company_name = company_name;
this.ordered = ordered;
this.description = description;
this.status = status;
}
@Override
public String toString() {
return "Brand{" +
"id=" + id +
", brand_name='" + brand_name + '\'' +
", company_name='" + company_name + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}
#################################################################
//业务实现代码
package example;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.itheima.Brand;
import org.junit.jupiter.api.Test;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/*
品牌数据的增删改操作
*/
public class BrandTest {
//查询
@Test
public void testSelectAll() throws Exception
{
//导入包
//定义配置文件
//加载配置文件
Properties properties=new Properties();
properties.load(new FileInputStream("src/druid.properties"));
//获取Druid连接池对象
DataSource dataSource =DruidDataSourceFactory.createDataSource(properties);
//获取连接对象
Connection conn=dataSource.getConnection();
//定义sql
String sql="select * from tb_brand";
//获取sql执行对象
PreparedStatement pre=conn.prepareStatement(sql);
//执行sql,处理结果集
ResultSet rs=pre.executeQuery();
//定义集合用来存储Brand对象
List<Brand> list=new ArrayList<>();
while(rs.next())
{
Integer id=rs.getInt(1);
String brand_name=rs.getString(2);
String company_name=rs.getString(3);
Integer ordered=rs.getInt(4);
String description=rs.getString(5);
Integer status=rs.getInt(6);
//将数据封装到Brand对象中
Brand brand=new Brand(id,brand_name,company_name,ordered,description,status);
list.add(brand);
}
//释放资源
pre.close();
conn.close();
//遍历集合
for(Brand element:list)
{
System.out.println(element.toString());
}
}
//添加
@Test
public void testInsert() throws Exception
{
//接收数据
String brand_name="香飘飘";
String company_name="香飘飘";
Integer ordered=1;
String description="绕地球一圈";
Integer status=1;
//加载配置文件
Properties pro=new Properties();
pro.load(new FileInputStream("src/druid.properties"));
//获取德鲁伊连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(pro);
//获取连接对象
Connection conn=dataSource.getConnection();
//定义sql
String sql="insert into tb_brand(brand_name,company_name,ordered,description,status)values(?,?,?,?,?)";
//获取执行sql对象
PreparedStatement pre=conn.prepareStatement(sql);
//设置参数
pre.setString(1,brand_name);
pre.setString(2,company_name);
pre.setInt(3,ordered);
pre.setString(4,description);
pre.setInt(5,status);
//执行sql
//返回数据,受影响的行数
int count=pre.executeUpdate();
System.out.println(count);
//释放资源
}
//修改
@Test
public void testUpdate() throws Exception
{
//接收参数
String companyName="香飘飘plus";
Integer status=0;
//加载配置文件
Properties pro=new Properties();
pro.load(new FileInputStream("src/druid.properties"));
//获取连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(pro);
//获取连接对象
Connection conn=dataSource.getConnection();
//定义sql
String sql="update tb_brand set company_name=?,status=?";
//获取执行sql对象
PreparedStatement pre=conn.prepareStatement(sql);
//设置参数
pre.setInt(2,status);
pre.setString(1,companyName);
//执行sql,返回结果
int count=pre.executeUpdate();
System.out.println(count);
System.out.println(count>0);
}
//删除
@Test
public void testDelete() throws Exception
{
//接收参数
Integer id=5;
//加载配置文件
Properties pro=new Properties();
pro.load(new FileInputStream("src/druid.properties"));
//获取Druid连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(pro);
//获取连接对象
Connection conn=dataSource.getConnection();
//定义sql
String sql="delete from tb_brand where id=?";
//获取sql执行对象
PreparedStatement pre=conn.prepareStatement(sql);
//设置参数
pre.setInt(1,id);
//执行sql,返回结果
int count=pre.executeUpdate();
System.out.println(count);
System.out.println(count>0);
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!