复习:异常,JDBC, mysql数据库

异常

异常:程序在运行过程中出现的不正常情况

代码写错了,不属于异常

出现异常,会导致jvm(虚拟机)停止运行,后续程序无法运行

java中默认的异常处理机制:将出现的异常按不同的类型分类,为每一种异常封装了一个类来进行表示。出现某种异常情况时,会抛出此类的对象,然后终止虚拟机的运行

使用异常处理机制,对程序运行过程中出现的异常情况进行捕捉并处理

算术异常

int a=10;
int b=0;
System.out.println(a/b);

数组越界异常

int[] c=new int[2];
c[3]=0;

字符串索引越界异常

String s="abc";
s.charAt(4);

类型转化异常

Object s=new Integer(10);
String s1=(String)s;

数字格式化异常

Integer.parseInt("abc");

空指针异常

String s=null;
s.lenght;

java.lang.Throwable

异常体系中的超类

Error错误

是虚拟机和java代码无法解决的问题,例如虚拟机内存不够用或内部错误

StackOverflowerError

栈溢出错误,栈空间不够用

OutOfMemoryError

堆溢出错误,堆空间不够用

Exception异常

这类异常是可以通过异常处理机制进行处理的一般异常

1.运行期异常:

在编译期间,编译器不会主动的提示程序员进行异常处理

2.编译器异常:

在编译期间,编译器会主动的提示程序员进行异常处理

两者的区别在于异常类有没有继承RuntimeException

异常处理

在编码时,就针对可能出现的问题预习编写一些处理机制

程序运行

出现异常

执行处理机制

继续运行后续程序

try{
    //编写可能出现异常的代码
}catch(//异常类型){
    //处理机制
    }
    
    
    public class Demo2 {
    public static void main(String[] args) {
        int a=10;
        int b=0;
        try{
            System.out.println(a/b);
        }catch (ArithmeticException s){
            s.printStackTrace();
            System.out.println("错误");
        }
        System.out.println("朱师磊暗区出不了机密");
    }
}
catch

一个try可以对应多个catch

finally
try{
    //编写可能出现异常的代码
}catch(/*异常类型*/){
    //处理机制
    }finally{
    //finally代码块中的内容总能运行,一定会运行
    }
throws关键字

用在方法声明部分,声明方法要抛出的各种异常。表明此方法中可能会出现的异常,并且该方法不处理异常,谁调用谁处理

throw关键字

在方法体中,用于显示抛出异常,抛出一个具体的异常对象,该方法终止运行

在异常对象的构造方法中,声明异常原因

自定义异常

根据自己的需求,自定义一个异常类,与java中的异常类进行区分

    public static class SoreException extends Exception {
        public SoreException(String message) {
            super(message);
        }
    }
}

JDBC

1.在项目中添加jar文件

2.加载驱动类

3.建立与数据库的连接,获得连接对象

4.发送sql

5.关闭数据库连接

//2.加载驱动类
     

   Class.forName("com.mysql.cj.jdbc.Driver");
 
        //3.建立与数据库的连接,获得连接对象
        String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user="root";
        String password="root";
        Connection connection= DriverManager.getConnection(url,user,password);
 
        //4.发送sql
        Statement st =connection.createStatement();
        st.executeUpdate("insert into major(college)values('外国语学院')");
 
        //5.关闭数据库连接
        st.close();
        connection.close();

从idea向数据库中添加,删除,修改数据

import java.sql.*;
 
public class Demo2 {
    public static void main(String[] args) {
        Demo2 demo2=new Demo2();
        try {
            //demo2.save("崔渭阳","男","123425", "渭南",4);
            //demo2.update(3);
            //demo2.delete(10);
            demo2.saves("朱京宝","男","123426", "安康",2);
            //demo2.updates(5,"123419", "延安");
            //demo2.deletes(12);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
 
    //添加
    public void save(String name,String gender,String phone,String address,int majorid) throws ClassNotFoundException, SQLException {
        //加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建立与数据库的连接
        String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user="root";
        String password="root";
        Connection connection= DriverManager.getConnection(url,user,password);
        //发送sql
        Statement st=connection.createStatement();
        st.executeUpdate("INSERT INTO student(NAME,gender,phone,address,TIME,majorid)"+" VALUES('"+name+"','"+gender+"','"+phone+"','"+address+"',now(),"+majorid+")");
        //关闭数据库连接
        st.close();
        connection.close();
    }
 
    //修改
    public void update(int num) throws ClassNotFoundException, SQLException {
        //加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建立与数据库的连接
        String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user="root";
        String password="root";
        Connection connection= DriverManager.getConnection(url,user,password);
        //发送sql
        Statement st=connection.createStatement();
        st.executeUpdate("update student set height=1.89,address='汉中'"+" where num = +"+num+"");
        //关闭数据库连接
        st.close();
        connection.close();
    }
 
    //删除
    public void delete(int num) throws ClassNotFoundException, SQLException {
        //加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建立与数据库的连接
        String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user="root";
        String password="root";
        Connection connection= DriverManager.getConnection(url,user,password);
        //发送sql
        Statement st=connection.createStatement();
        st.executeUpdate("delete from student"+" where num = +"+num+"");
        //关闭数据库连接
        st.close();
        connection.close();
    }

PreparedStatement和Statement的区别:

相同点:都是向数据库发送sql

不同点:

Statement:将参数直接拼接到sql中,要拼接字符串,写起来麻烦,安全性差

PreparedStatement:先用?占位,再通过setObject()赋值,写法简单,安全性强

MySQL

数据库管理系统(DBMS)

为了方便数据的存储和管理,将数据按照特定的规则存储在硬盘上,是一个存储数据的仓库

关系型数据库

以数据表为单位,表与表之间存在关联关系

Mysql是一个关系型数据库

具有快速,可靠和易于使用的特点

非关系数据库 redis

缓存 Key:value

SQL(结构化查询语言)

是一种特殊目的的编程语言;

是一种标准的数据库操作语言;

用于数据的存取,查询,更新,和管理关系型数据库

SQL语句

根据操作的不同,分为不同类型的SQL语句

1.DDL

数据(结构)定义语言

创建和修改数据库表结构的语言

常用的语句:create ,alter,drop,rename

数据库名一旦创建就不能被修改,只能修改字符集

-- 创建数据库
create database  test;
​
-- 创建数据库并设置字符集编码,判断数据库是否存在
create database if not exists test charset utf8;
​
-- 删除数据库
drop database test;
​
-- 修改字符集
alter database test charset utf8;
数据表

表是数据存储的最常见和最简单的形式,是构成关系型数据库的基本元素。

表的最简单形式是由行和列组成,分别都包含着数据。

每个表都有一个表头和表体,表头定义表名和列名 .表中的行被看作是文件中的记录,表中的列被看作是这些记录的字段。

设计表(数据类型)
1.字符型

char(n) 长度为n的定长字符串,最大长度255个字符

varchar(n) 最大长度为n的可变长字符串

date 日期, 包含年月日

datetime 年月日 时分秒

2.整型

3.浮点型

decimal

数据类型(M,D)

M:精度,数据的总长度;

D:标度,小数点后的长度

4.TEXT列字符字符串

长文本类型

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。

添加约束
PRIMARY KEY -- 设置为主键
​
AUTO_INCREMENT -- 设置主键列自然增长,只能修饰主键列,而且主键列类型为整数
​
not null  -- 不能为空约束 可以添加到多个普通列
​
unique  -- 唯一性约束     可以添加到多个普通列
​
check (height<2.60) -- 检查约束


2.DML

数据操纵语言DML(Data Manipulation Language)

常用语句: insert,delete,update


-- 修改语句 需要注意条件的准确性,否则修改全部数据
update student set address='陕西',height=1.23 where num = 1

-- 删除语句
delete from student -- 没有条件全部删除
delete from student where num=1

插入数据
方式1: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n);

方式2: INSERT INTO 表名 set 列名1=值1,..列名n=值n;

方式3: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n),(值1,值2…..,值n);

方式4:INSERT INTO 表名(列1,列2……,列n) 查询语句(查询的列数与插入列数匹配)

3.DQL

查询列表可以是:表中的字段、常量、表达式、函数

查询的结果是一个虚拟的表格

查询结果处理:

特定列查询:select column1,column2 from table

全部列查询: select * from table

算数运算符:+ - * /

排除重复行: select distinct column1,column2 from table

查询函数:select 函数; / 例如version()

sum()称为聚合函数,把多行数据放到一个中

sql中 +-*/ 只能用做算术运算, +不能连接字符串

逻辑处理

case when 条件 then 结果1 else 结果2 end; 可以有多个when

ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回

原本的值

if函数:if else的 效果 if(条件,结果1,结果2)

条件查询

select 结果列 from 表名 where 条件

比较

=, != 或<>, >, <, >=, <=

逻辑运算

and 与

or 或

not 非

模糊查询

like %字符%

%:通配符,任意多个字符

between .... and ... 表示在两个区间,包含临界值

in 判断某字段的值是否属于in列表中的某一项

in(... , ... , ...)

IS NULL(为空的)或 IS NOT NULL(不为空的)

排序

查询结果排序,使用 ORDER BY 子句排序 order by 排序列 ASC/DESC

asc代表的是升序,desc代表的是降序,如果不写,默认是升序

什么排序都没有,默认按主键进行升序排列

order by子句中可以支持单个字段、多个字段

数量限制

limit 开始位置(开始位置为0),查询的数量

SELECT * from table LIMIT 0,5

 
分组查询

语法:

select 分组函数,列(要求出现在group by的后面)

from 表

[where 筛选条件]

group by 分组的列表

[having 分组后的筛选]

[order by 子句]

注意:查询列表比较特殊,要求是分组函数和group by后出现的字段

数据库设计范式

第一范式:列保证原子性

例如:联系方式:QQ,地址,邮箱......

第二范式要有主键,要求其他字段都依赖于主键

第三范式:要求一个数据库表中不包含已在其他表中包含的非主关键字信息

这里的senum 称为外键,外键必须与另一个表的主键相关联,且数据类型一致

添加外键约束,如果没有添加约束,数据与数据之间没有任何束缚,可以随意操作

添加外键约束后,操作时就不能随意操作,要保证数据的完整性

关联查询

含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n

发生原因:没有有效的连接条件

如何避免:添加有效的连接条件

按功能分类:

1.自连接

2.内连接

3.外连接

左外连接:将左边的表中的全部列都列出来,右边的只列出满足条件的

右外连接:将右边的表中的全部列都列出来,左边的只列出满足条件的

子查询

含义:出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或外查询.

在一个查询语句中又出现了查询语句

分类:

按子查询出现的位置:

from后面:支持表子查询

where:支持标量子查询,列子查询

按功能、结果集的行列数不同:

标量子查询(结果集只有一行一列)

列子查询(结果集只有一列多行)

表子查询(结果集一般为多行多列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值