JavaWeb学习(一)---MySQL数据库 - Go语言中文社区

JavaWeb学习(一)---MySQL数据库


MySQL

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标准定义了两种类型的触发器:行级触发器和语句级触发器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

JDBC

步骤:
在这里插入图片描述
在这里插入图片描述

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();

    }
}

JDBC详解

DriverManager 驱动管理类
1.注册驱动
2.获取数据库连接

在这里插入图片描述

Connection 数据库连接对象

1.获取执行sql的对象
在这里插入图片描述

2.管理事务(搭配try catch)
在这里插入图片描述

在这里插入图片描述

Statement sql执行

1.执行SQL语句

executeQuery(sql):执行DQL
executeUpdate(sql):执行DML DDL 返回受影响的行数(int)     0:失败 

数据查询语言DQL
数据操纵语言DML

插入
删除
修改

数据定义语言DDL
数据控制语言DCL
在这里插入图片描述

SQL注入:

SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。

ResultSet:结果集对象

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());
        }
    }
}

PreparedStatement:预编译SQL语句并且执行,预防SQL注入问题

SQL注入:通过操作输入来修改事先定义好的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+鼠标左键 整列编辑

练习:基于Druid连接池实现对mysql数据库的CRUD

//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);
    }
}

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_47109902/article/details/127251048
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2023-01-03 14:26:02
  • 阅读 ( 85 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢