面向对象
面向过程和面向对象是什么
面向过程和面向对象都是程序设计的一种风格(思想)
面向过程(procedure-Oriented Programming)POP
是以函数(一个一个的功能)为结构进行代码组织,是解决问题时,分析实现所需的步骤,然后一步一步实现即可,代表语言:c语言
语言扩展能力差,后期维护难度较大(相对于面向对象语言)
面向对象(Object Oriented Programming)OOP
是以类为单位进行组织,每种事物都具备自己的属性和行为/功能 ,类:一类问题/分类(String,math,Arrays。Scanner),代表语言:c++,c#,java,python……
是一种设计者思维,适合结局复杂问题,代码扩展性强,可维护性高
面向对象可以从宏观上把控,从整体上分析整个系统。但是,具体到实现部分的微观操作,仍然需要面向过程的思路去解决,面向对象适合复杂问题,先宏观的分类设计,具体某一个步骤落地时,有需要面向过程,他们是相辅相成的
面向对象
类和对象
类(Class)和对象(Object)是面向对象的核心概念
类
具有相同特征的事物的抽象描述,对同一类事物的抽象描述
对象
实际存在的该事物的每个个体,是具体的,因而也称为实例
类的创建规则
public class 修饰类 Car(类名)
类名:类名首字母大写
实例
下面的代码是创建一个Car类:
public class Car {
String name;
int price;
}
下面的代码是创建一个对象:
public class Test_Car {
public static void main(String[] args) {
Car car=new Car();
}
}
API——常用类
javaAPI概述
API(Application Programming Interface)应用程序编程接口
API:指的就是官方给开发人员提供的一个说明文档,对语言有哪些类,类中有哪些方法进行说明(API文档)
Object类
java.lang.Object
是java类体系结构中最顶层的类
toString方法
输出一个对象,但是对象在内存中存储,是不能输出的,当输出一个对象时,会默认调用此对象的toString(),如果类中没有定义toString(),会调用Object类中的toString(),OBject类中toString(),是把对象在内存的哈希值返回(以十六进制返回),把对象信息以字符串形式输出
我们自己类中可以对Object类中的toString()进行重写,后面调用时,就调用我们自己类中重写过的toString()
equals方法
== 比较等号两边是否相等
当==用于基本类型比较时,比较的是变量值是否相等
当==用于引用类型比较时,比较的是对象的地址是否相等
equals方法是判断两个对象是否相等
如果想要比较两个对象的属性值是否相同,需要对equals方法进行重写
Arrays类
equals方法
比较两个数组的内容是否相等
copyOf方法
数组复制,将原数组内容复制到一个指定长度的新数组中
fill方法
将指定的int值分配给指定的int数组的每个元素
toString
将数组中的元素内容拼接为一个字符串输出
sout方法
对指定数组进行升序排序
binarySearch方法
使用二分查找算法找出指定的元素,如果找到则返回索引,如果未找到则返回负数,使用之前需要对数组进行排序
compareTo方法
用来指定排序规则,可以执行用类中哪个属性作为排序的项,这个方法在sort()方法的底层调用,来判断大小
String()类
java.lang.String
java中所有字符串都是此类的实例
1.String s="abc";
创建字符串时,先去字符串常量池中去查找有没有相同值的对象,如果没有,就创建一个字符串对象,并返回地址,如果字符串常量池中已经存储,不用创建新的,直接返回已存在对象的地址(已创建的字符串)
2.Strinig s1=new String("abc");
new每次都是在堆中创建新的字符串
字符串不变,它们的值在创建后不能被修改
编码
getBytes()方法
把字符串转为字节数组(数字)
解码
String类的构造方法
把字节数组转为字符
toCharArray()方法
把字符串转为字符数组
equalsIgnoreCase()方法
比较字符串对象中内容是否相等,忽略大小写
contains()方法
判断字符串中是否包含指定的子串
isEmpty()方法
判断字符串值是否为" "
startsWith()方法
判断是否以指定的字符串开头
endsWith()方法
判断是否以指定的字符串结尾
length()方法
获取字符串长度
charAt()方法
获取指定位置上的字符
indexOf(String str)方法
返回的是指定字符串首次出现的位置
indexOf(String str,int fromIndex)方法
从指定的位置开始查找,返回的是指定字符串首次出现的位置
lastIndexOf(String str)方法
从后向前找,返回的是指定字符串首次出现的位置
lastIndexOf(String str,int fromIndex)方法
从指定位置从后向前找,返回的是指定字符串首次出现的位置
substring(int start)方法
从指定位置开始截取到字符串结束
substring(int start,int end)方法
从指定位置开始截取到指定位置(不包含结束位置)
valueOf()方法
将传入的参数转为字符串类型
toLowerCase()方法
将传入的字符串中的英文字母转为小写
toUpperCase()方法
将传入的字符串中的英文字母转为大写
concat()方法
拼接指定的字符串内容到原字符串的末尾,并返回一个新的字符串对象
split()方法
将一个字符串用指定的符号分割开
replace()方法
用新内容替换字符串中指定的字符串
replaceAll()方法
用新内容替换字符串中正则表达式匹配的字符
replaceFirst()方法
用新内容替换字符串中正则表达式匹配的字符,只替换第一个
trim()方法
去除字符串两端空格
StringBuffer类
因为String声明的字符串对象对象值一旦给定就不能改变了,每次拼接都会创建新的字符串对象,耗时,占用空间
StringBuffer是内容可以改变的字符串
char[] value:没有使用final修饰,每次添加内容都是对此数组进行操作,不会创建新的字符串对象
append()方法
向字符串末尾添加内容
insert()方法
向指定的位置上插入指定的字符串
deleteCharAt()方法
删除指定位置上的字符
delete()方法
删除指定区间的元素,不包含结尾
replace()方法
替换指定区间的字符串
reverse()方法
反转字符串
StringBuilder类
同StringBuffer类一样
这三个类的区别
String类:是一个值不可以改变的字符串
StringBuffer类:值可以改变且不需要创建新对象,方法上都加了锁,是在多线程(任务)执行时是线程安全的
StringBuilder类:值可以改变且不需要创建新对象,由于方法上都没有加锁,在多线程(任务)执行时是线程不安全的,适合单线程
Math类
floor()方法
向下取整
ceil()方法
向上取整
round()方法
四舍五入
max()方法
取最大值
random()方法
返回0-1之间的随机数,可能会等于0,小于1
Random类
nextBoolean()方法
随机返回一个布尔值
nextInt()方法
在int的取值范围内,随机返回一个整数
nextLong()方法
在long的取值范围内,随机返回一个整数
nextInt(int bound)方法
在给定范围内随机获取一个数,0=<res<给定数
Date类
date()
获取程序运行时刻的时间
Calendar类
可以设定时间
SimpleDateFormate类
把字符串日期转为Date对象
parse()
BigInteger类
以字符串类型输入数值
可以不被限制
BigDecimal类
当double和float不能准确表示小数时,可以用此类
集合/容器
集合概念
为了解决数据存储单一的情况,java中提供了许多不同结构的集合类,让我们可以根据不同的场景进行数据存储选择
集合API
集合体系概述
java的集合框架是由很多接口,抽象类,具体类组成的,都位于java.util包中
单列集合
一次放进去一个值(对象)
List接口及实现类
继承了Collection类,可以有重复元素
ArrayList:数组列表
底层有一个数组,可以动态扩展数组长度,并提供一个一系列方法操作
查询快,插入和删除慢
add()
默认是向末尾添加元素,先判断是否满,如果不满则添加元素,如果满了,则扩容
LInkedList:链表列表
底层是一个链表结构
查询慢,插入和删除快
Vector:数组列表,线程安全的
List接口集合迭代,List集合遍历方式
for循环
允许操作元素,注意索引的变化与元素位置的移动
增强for循环
不允许对元素进行操作
迭代器遍历
创建迭代器对象,使用迭代器中的.next方法
Set接口
Set中存储的元素是不重复的
HashSet
元素是无序的
我们向集合中添加一个元素时,如果每次都使用equals比较内容是否相等效率会很低
一般用的是hashcode(不是Object中的),会调用的是类中重写的hashcode,返回的是根据内容计算的哈希值,遍历时,会用哈希值先比较是否相等,但是哈希值会存在问题,内容不同,哈希值相同,此种情况下再调用equals来比较内容
TreeSet
可以给Set集合中的元素进行指定方式的排序,存储的对象必须实现Comparable接口,重写compareTo(),每次添加元素时,调用compareTo()进行元素大小判断(小于0放在左节点,等于0表示元素重复(不会覆盖原来的元素),大于0放到右节点)
双列集合
Map接口
共性:键不能重复,值可以重复,通过键可以找到值,一个键只能映射一个值
HashMap
可以存储一个为null的键,值可以为null
底层使用的是Node类型的数组,数组默认长度为16,数组的每个位置上都是一个链表,当链表长度大于8且数组长度大于64时,链表会转化为红黑树,添加元素的时,会通过键的哈希值来确定数组的位置,如果添加的元素与已有的元素重复,那么覆盖原有的元素,如果没有重复,则添加到next节点上
键是无序的,key不能重复
TreeMap
底层使用的是树结构
Hashtable
方法上都添加了锁
不能存储为null的键和为null的值
Map遍历
1.先拿到所有的键,遍历键,根据键寻找值
2.使用entryset遍历
Collections类
addAll
添加一个能改变长度的数值到集合里
swap
交换对应位置上的元素
copy
集合复制,将源集合复制到目标集合,要求目标集合size大于等于源集合
fill
用指定的值,替换到集合中的所有元素
shuffle
随机排序
异常
程序在运行过程中出现的不正常情况(例如用户输入数据有问题),如果不处理最终会导致JVM的非正常停止(代码错误并不属于异常)
异常处理机制
默认:将出现的异常按不同的类型分类,为每一种异常封装了一个类来进行表示,当出现某种类型的异常情况时,会抛出此类的对象,然后终止程序的运行
使用异常处理机制,对程序运行过程中出现的异常情况进行捕捉并处理
ArithmeticException:算数异常
ArrayIndexOutOfBoundsException:数组索引越界
StringIndexOutOfBoundsException:字符串索引越界
ClassCastException:类型转换异常
NumberFormatException:数字格式化异常
NullPointerException:空指针异常(使用null中的方法/属性)
java异常体系结构
Throwable(超类)
Error(错误)
StackOverFlowError:栈溢出错误,占空间内存不够用
OutOfMemoryError:堆内存溢出
Exception(异常)
检查期异常
调用期间就会提示异常
RuntimeException运行时异常
编码期间不会提示异常
异常处理
java的异常处理是通过5个关键字来实现的:try,catch,finally,throw,throws
在编码时,就针对可能出现问题的代码预编写一些处理机制
try——catch———finally
try{
编写可能出现异常的代码
}catch(异常类型){
处理机制
}finally{
finally中的代码总能执行
}
Exception可以捕获任意的异常类型,但是必须放到最后面
throws
定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处
MySQL
MySQL中的函数
字符函数
-- length():获取参数值的字节个数
SELECT num,NAME,LENGTH(num) FROM student;
-- char_length():获取参数值的字符个数
SELECT num,NAME,CHAR_LENGTH(NAME) FROM student;
-- concat():拼接字符串 as 别名
SELECT num,CONCAT(NAME,':',gender,'*',birthday)AS information FROM student;
-- upper()/lower():将字符串变成大写/小写
SELECT num,UPPER(NAME),LOWER(NAME) FROM student;
-- substring(str,pos,length):截取字符串,从位置1开始
SELECT num,SUBSTRING(NAME,2,3) FROM student;
-- instr(str,指定字符):返回子串第一次出现的索引,如果找不到返回0
SELECT num,INSTR(NAME,'三') FROM student;
-- trim(str):去掉字符串前后的空格或子串,trim(指定子串 from 字符串)
SELECT num,TRIM('m' FROM NAME) FROM student;
-- lpad(str,length,填充字符):用指定的字符实现左填充将str填充为指定长度
SELECT num,LPAD(phone,20,'a') FROM student;
-- rpad(str,length,填充字符):用指定的字符实现右填充将str填充为指定长度
SELECT num,RPAD(phone,20,'a') FROM student;
-- replace(str,old,new):替换,替换所有的子串
SELECT num,REPLACE(NAME,'三','a') FROM student;
case when then end语句
-- case when 条件 than 结果1 else 结果2 end————(可以有多个when)
SELECT NAME,
(CASE WHEN height>=1.70 THEN '高个子'
WHEN height>=1.60 THEN '正常'
ELSE '低个子' END)AS height,gender
FROM student;
-- ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回原本的值
SELECT NAME,
IFNULL(height,'暂未录入') AS height,gender
FROM student
if函数
-- if函数:if(条件,结果1,结果2)
SELECT NAME,
IF(NAME='李宏杰','智叟','聪明')AS idea,gender
FROM student
数学函数
-- 数学函数
-- round(数值):四舍五入
SELECT NAME,ROUND(height)AS height FROM student;
-- 指定保留小数位数
SELECT NAME,ROUND(height,1)AS height FROM student;
-- ceil(数值):向上取整,返回>=该参数的最小整数
SELECT NAME,CEIL(height) FROM student;
-- floor(数值):向下取整,返回<=该参数的最大整数
SELECT NAME,FLOOR(height) FROM student;
-- truncate(数值,保留小数的位数):截断,小数点后截断到几位,不会四舍五入
SELECT NAME,TRUNCATE(height,1) FROM student;
-- mod(被除数,除数):取余,被除数为正,则为正,被除数为负,则为负
SELECT NAME,MOD(num,2) FROM student;
-- rand():获取随机数,返回0-1之间的小数
SELECT NAME,RAND() FROM student;
日期函数
-- now()
SELECT NAME,NOW(),CURDATE(),CURTIME() FROM student;
-- year()month()day()日期格式化
SELECT NAME,YEAR(rig_time),MONTH(rig_time),DAY(rig_time) FROM student;
-- str_to_date()将字符串格式转化为日期类型
SELECT NAME,STR_TO_DATE('2001-1-30','%Y-%m-%d')AS TIME FROM student;
-- date_format()将日期格式类型转化为指定的字符串
SELECT NAME,DATE_FORMAT(birthday,'%Y-%m-%d') FROM student;
-- datediff()计算两个日期之间相差的天数
SELECT NAME,DATEDIFF(CURDATE(),birthday) FROM student;
SELECT NAME,DATEDIFF(STR_TO_DATE('2004-5-28','%Y-%m-%d'),birthday) FROM student;
分组函数/聚合函数
-- 分组函数/聚合函数,统计函数(都忽略null)
-- sum求和,avg平均值(一般用于处理数值型)
-- max最大值,min最小值,count计数(可以处理任何类型)
SELECT SUM(height),AVG(height) FROM student;
SELECT MAX(height),MIN(height) FROM student;
-- 统计行数 count(*):推荐 count(1) count(列名):如果列的值为空不统计
SELECT COUNT(*) FROM student;
SELECT COUNT(height) FROM student;
SELECT NAME FROM student WHERE height=(SELECT MIN(height) FROM student)
MySQL中的查询语法
条件查询
-- 条件查询 select 结果列 from 表名 where 条件
SELECT * FROM student WHERE height>=1.80;
-- and 所有条件都要满足
SELECT * FROM student WHERE height<1.80 AND gender ='女';
-- or 满足一个条件即可
SELECT * FROM student WHERE height=1.80 OR gender='女';
模糊查询
-- 模糊查询 like %字符% 通配符
SELECT NAME FROM student WHERE NAME LIKE '%杰';
-- between 1.70 and 2.0== height>=1.70 and height<=2.0
SELECT NAME FROM student WHERE height BETWEEN 1.70 AND 2.0;
in/not in语句
-- 查询身高1.80,1,57,1,55
SELECT NAME FROM student WHERE height IN(1.80,1.57,1.55);
SELECT NAME FROM student WHERE height NOT IN(1.80,1.57,1.55);
空值查询&联合查询
-- 查询值为空的数据
SELECT NAME FROM student WHERE height IS NULL;
-- 查询值不为空的数据
SELECT NAME FROM student WHERE height IS NOT NULL;
-- union 合并多个查询的结果 重复的会自动去除
SELECT NAME FROM student WHERE height=1.80
UNION
SELECT NAME FROM student WHERE gender='女'
-- union all 合并多个查询的结果 重复的不会去除
SELECT NAME FROM student WHERE height=1.80
UNION ALL
SELECT NAME FROM student WHERE gender='男'
排序
-- 排序
-- asc 升序(默认) desc降序
SELECT * FROM student ORDER BY height;
SELECT * FROM student ORDER BY height DESC;
有数量限制的查询
-- 数量限制 limit 开始位置,查询的数量
-- 实际使用场景,数据分页显示 一次只查询一部分数据,提高查询效率
SELECT * FROM student LIMIT 0,1;
SELECT * FROM student LIMIT 1,3;
分组查询
-- 分组查询
-- 将某类数据分到一个组中进行处理
-- group by 分组条件(列名)
SELECT COUNT(*),gender FROM student GROUP BY gender;
SELECT SUM(height) FROM student GROUP BY gender;
SELECT AVG(height) FROM student GROUP BY gender;
MySQL中表的插入,修改,删除语法
插入
插入数据有四种方法,代码如下
-- 给表中添加元素
-- insert into 表名 (列名) values(数据)
INSERT INTO student(NAME,gender,birthday,phone)VALUES('张三','男','2003-2-10','13333333333')
INSERT INTO student(NAME,gender,birthday,phone,address,height,rig_time)
VALUES('张三','男','2003-2-10','13333333334','西安',1.80,NOW())
INSERT INTO student(NAME,gender,birthday,phone,address,height,rig_time)
VALUES('李四','男','2004-1-6','12222222222','西安',1.80,NOW()),
('王五','女','2003-1-12','13434343433','深圳',1.67,NOW()),
('赵六','女','2004-3-12','12233455667','上海',1.57,NOW())
INSERT INTO student SET NAME='李宏杰',gender='女',phone='15498512645'
INSERT INTO stu(NAME,gender,birthday,phone,address,height,rig_time)
SELECT NAME,gender,birthday,phone,address,height,rig_time FROM student
修改
-- 修改语句 需要注意条件的准确性,否则默认修改所有的数据
UPDATE student SET address='北京',gender='女',phone='19845625487' WHERE num=1
删除
-- 删除语句
DELETE FROM stu -- 没有条件 删除所有数据
DELETE FROM student WHERE num = 11
MySQL中的多表查询
数据库设计范式(范例)
好的数据库设计,事倍功半,不会有歧义
第一范式
列保证原子性(列不可再分解)
联系方式:电话,微信,QQ,邮箱
这些都不可分解
第二范式
要有主键,其他字段必须依赖于某个列(主键列)
通过主键可以精确的定位到某行数据
第三范式
确保每列都和主键列直接相关
不同的信息放在不同的表中
如果两张表有关系的话,只需要在一张表放置另一个表的主键进行关联,关联表中其他非主键信息不需要
major称为外键,外键必须是与另一个表的主键关联,且数据类型一致
通过学生表中的major列,把学生与专业关联起来,在学生表中只需要添加专业编号即可
其他信息不需要添加到学生表中
表与表关系:多对一关系,也可称为一对多
添加外键约束,如果没有添加约束,数据与数据之间,没有任何的约束,可以随意操作
为外键添加约束后,操作时就不能随便操作,要保证数据的完整性
代码如下
ALTER TABLE student ADD CONSTRAINT fk_student_major_on_majorid FOREIGN KEY(majorid) REFERENCES major(id)
MySQL中的子查询
,在一个查询语句中又出现了查询语句
子查询可以出现在from和where后面
from 表子查询(结果一般为多行多列)把查询结果继续当一张表对待
where 标量子查询(结果集只有一行一列)查询身高最高的学生,查询到一个最高身高
列子查询(结果集只有一行多列)
对上表进行如下操作
查询身高最高的学生
-- 查询身高最高的学生
SELECT
NAME,
height
FROM
student
WHERE height =
(SELECT
MAX (height)
FROM
student)
SELECT
NAME,
height
FROM
student
WHERE height IN
(SELECT
height
FROM
student
WHERE height = 1.80
OR height = 1.57)
查询姓名重复的学生
-- 查询姓名重复的学生
SELECT
*
FROM
(SELECT
NAME,
COUNT (*) c
FROM
student
GROUP BY NAME) t
WHERE t.c > 1
查询身高大于平均身高的学生
-- 查询身高大于平均身高的学生
SELECT
NAME,
height
FROM
student
WHERE height >
(SELECT
AVG (height)
FROM
student)
查询与李四同专业的学生
-- 查询与李四同专业的学生
SELECT
*
FROM
student
WHERE majorid =
(SELECT
majorid
FROM
student
WHERE NAME = '李四')
查询每个专业中升高最高的学生
-- 查询每个专业中身高最高的学生的信息
SELECT
*
FROM
student s
INNER JOIN
(SELECT
MAX (height) mt,
majorid,
COUNT (*)
FROM
student
GROUP BY majorid) t
ON s.height = t.mt
AND s.majorid = t.majorid
JDBC
1. JDBC的概念
Java Database Connectivity,Java数据库连接,用于Java程序与数据库进行交互。
2. JDBC API
DriverManager:管理JDBC驱动。
Connection:代表与数据库的连接。
Statement:执行静态SQL语句并返回结果。
PreparedStatement:执行预编译的SQL语句,效率更高,且支持参数化查询,防止SQL注入。
ResultSet:保存查询结果集。
3. JDBC编程步骤
加载并注册JDBC驱动。
建立数据库连接。
创建Statement或PreparedStatement对象。
执行SQL语句。
处理ResultSet。
关闭连接、Statement和ResultSet对象。
首先先新建一个lib目录并导入数据库MySql的jar包
import java.sql.*;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
//DriverManager.registerDriver(new Driver());
String url = "jdbc:mysql://127.0.0.1:3306/gra_stu?serverTimezone=Asia/Shanghai";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url,user,password);
//发送sql
Statement statement = connection.createStatement();
statement.executeUpdate("INSERT INTO book(bname,state) VALUES ('书库西通','已借出')");
statement.close();
connection.close();
}
}