单例设计模式:
-
始终在内存中始终只有一个对象! *
-
饿汉式和懒汉式 *
-
饿汉式: 单例设计模式中最安全的一种设计模式!(不会出现线程安全问题!) *
-
jdk提供了一个Runtime:是和计算机运行环境相关的类(典型的单例设计模式)
-
public class Runtime {
-
private static Runtime currentRuntime = new Runtime(); * *public static Runtime getRuntime(){ return currentRuntime; }
private Runtime(){}
}
-
1)在类的成员位置提供静态实例变量
-
2)当前类一定是具体类,构造方法私有化
-
3)对外提供公共的静态方法,返回这个实例!(返回值就是当期类本身)
-
懒汉式是可能出现安全问题的一种单例模式 *
-
特点:
-
1)当前这个类构造方法私有化
-
2)成员位置---提供了静态当前的类变量(此处只是声明了当前类型的一个变量)
-
3)提供一个静态的成员方法,返回值是当前类本身, (安全方法)
-
场景:按需加载或者延迟加载,需要用的时候才去创建对象
1.请描述静态代理
代理设计模式属于结构型设计模式的一种! 静态代理: 代理角色和真实角色需要实现同一个接口! 回想线程中的Thread类:代理角色 本身一个接口Runnable 自定义一个类 实现Runnable接口,实现里面的run方法---->真实角色
2.什么是jdk动态代理 (重点)
-
-
//jdk动态代理--->前提必须有一个接口 //是通过反射的动态的产生代理实例,完成对业务功能增加 // java.lang.reflect.Proxy--->提供静态方法 public static Object newProxyInstance(ClassLoadr cl,Class[] interfaces,InvocationHandler handler) package com.qf.reflect_03; /** * @author 高圆圆 * @date 2022/11/29 11:38 * 针对用户操作的数据访问接口 */ public interface UserDao { void add() ; void delete() ; void findAll() ; void update() ; } package com.qf.reflect_03; /** * @author 高圆圆 * @date 2022/11/29 11:39 * 数据接口实现 */ public class UserDaoImpl implements UserDao{ /** * 添加 */ @Override public void add() { System.out.println("添加用户"); } /** * 删除 */ @Override public void delete() { System.out.println("删除用户"); } /** * 查询 */ @Override public void findAll() { System.out.println("查询所有用户"); } /** * 修改 */ @Override public void update() { System.out.println("更新用户"); } } package com.qf.reflect_03; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * @author 高圆圆 * @date 2022/11/29 11:55 * 自定义一个类----->代理实例 调用处理程序实现的接口 * * //就完成真实角色的里面的add(),update(),findAll(),detete()这些方法调用并进行增强 */ public class MyInvocationHandler implements InvocationHandler { //目标对象--->真实角色 private Object target ; public MyInvocationHandler(Object target){ this.target = target ; } /** * 具体实现UserDao接口,调用里面的方法!完成业务方法增强 * @param proxy * @param method 调用的方法 add(),update(),findAll(),detete() * @param args 这些方法实际参数 * @return 从代理实例上的方法调用返回的值 * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("权限校验") ; //反射调用 Object obj = method.invoke(target, args); System.out.println("产生日志"); return obj; } } /** public static Object newProxyInstance( * ClassLoader loader, //参数1:当前接口对象的类加载器 * Class<?>[] interfaces, //参数2:代理实现接口列表字节码文件对象的数组 * InvocationHandler h //参数3:代理实例 调用处理程序实现的接口 * ) throws IllegalArgumentException */ UserDao ud = new UserDaoImpl() ; InvocationHandler handler = new MyInvocationHandler(ud) ; UserDao ud3 = (UserDao) Proxy.newProxyInstance( ud.getClass().getClassLoader(), //public Class<?>[] getInterfaces() ud.getClass().getInterfaces(), handler ); ud3.add(); ud3.delete(); ud.findAll(); ud3.update();
-
3.如何使用反射获取类的成员变量Field并去赋值
//获取当前类的字节码文件对象 Class clazz = Class.forName("包名.类名") ; //创建当前类实例---如果当前类的无参构造方法是公共的 Object obj = clazz.newIntance() ; //通过字节码文件对象获取指定的成员变量所在的Field类对象 Field field = clazz.getDeclaredField("属性名称") ; //如果私有肯定需要取消Java语言访问检查 field.setAccessiable(true) ; //赋值 field.set(obj,实际参数) ; System.out.println(obj) ;
4.如何使用反射获取类的成员方法Method并去调用
//获取当前类的字节码文件对象 Class clazz = Class.forName("包名.类名") ; //创建当前类实例---如果当前类的无参构造方法是公共的 Object obj = clazz.newIntance() ; //通过字节码文件对象获取指定的成员方法 所在的Method类对象 Method method = clazz.getDelcaredMethod("方法名名称",参数类型的class属性) ; //如果私有肯定需要取消Java语言访问检查 method.setAccessiable(true) ; //调用 method.invoke(obj,实际参数) ; //有返回值,直接返回;没有,可以的直接调用即可
第三十三天数据库Mysql
一.什么是数据库
数据库就是存储数据的一种仓库! 早期存储数据---->临时变量(局部变量)---->随着方法调用而存在,随着方法调用结束而消失 后面-------->成员变量(非静态) ----->随着方法对象的创建而存在,随着对象的创建完毕等待垃圾回收器回收而消失 容器---->数组---->长度固定(弊端) --->StringBuffer--->字符串缓冲区中存储各种字符序列,它长度可变,但是StringBuffer使用完毕等待回收 --->集合---->长度可变,它可以存储任意引用类型数据,使用完毕---->也要被回收掉 --->IO流---->永久存储,但是IO流的太耗时了
数据库存储数据---> 1)存储空间非常大,可以存储百万条,千万条甚至上亿条数据,用户可以对数据库中数据进行新增,查询,更新,删除等操作 2)数据独立性高 3)实现数据共享 4)减少数据的冗余度 5)通过数据库里面"事务"--->实现数据的一致性以及维护性!
二.市面上常见的数据库
数据库分为两大类: 关系型数据库--->MySQL,SqlServer,Oracle,SQLite,MariaDB(和mysql是同一个数据库引擎) sqlServer,oracle:收费 Oracle-->中大型公司使用居多--->金融方面互联网公司oracle
Mysql--->免费产品----> 中小型公司使用居多 非关系型数据库--->Redis,Memcache,MongoDb,HBase redis:后面讲(做数据缓存用的)
三.Mysql5.7下载地址---安装和卸载
MySQL :: Download MySQL Installer
要卸载:必须彻底卸载
1)从控制面板里面卸载---->卸载应用软件 2)在c盘隐藏文件夹 ProgramgramData--->Mysql---->将mysql这个目录全部干掉 3)cmd--->regedit--->进入注册表-->HKEY-LOCAL_MACHINE SYSTEM--->ControlSet001/ControlSet002/CurrentControlSet--->找里面有Mysql---删除掉
四.Mysql的安装
五. DDL语句的基础语法---库的操作
DDL语句:数据库定义语句 1.创建库,删除库,查询库,修改库字符集 2.创建表,删除表,查询表的结构,修改表相关的语法
DDL语句:数据库定义语句 库和表的基本操作 库的操作: 1)查询所有库 show databases; mysql> show databases ; +--------------------+
| Database | +--------------------+ | information_schema | mysql5.7对数据库元数据(创建时间,名称,访问权限..)的访问 | mysql | mysql的核心库,负责存储数据库的用户,权限,关键字等等 | performance_schema | mysql性能相关库---提供mysql性能相关的参数 | sys | 主要还是降低数据库各个之间的复杂度,让数据库运行更快 +--------------------+ 11 rows in set (0.00 sec)
2)创建库的语法 2.1)create database if not exists 库名 ; 如果没有这个库,则创建该库 mysql> create database if not exists EE_2211; Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+ | Database | +--------------------+ | information_schema | | ee_2208_01 | | ee_2208_02 | | ee_2208_projects | | ee_2211 | 创建的新库 | mybatis_01 | | mybatis_02 | | myee_2208 | | mysql | | performance_schema | | racemall | | sys | +--------------------+ 12 rows in set (0.00 sec) 2.2) 直接创建库 create database 库名; mysql> create database javaee_2211_mysql; Query OK, 1 row affected (0.00 sec)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | ee_2208_01 | | ee_2208_02 | | ee_2208_projects | | ee_2211 | | javaee_2211_mysql | 创建新库
| mybatis_01 | | mybatis_02 | | myee_2208 | | mysql | | performance_schema | | racemall |
| sys | +--------------------+ 13 rows in set (0.00 sec) 3)查询指定库的信息--包括它的字符集 show create database 库名; mysql> show create database ee_2211; +----------+------------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+------------------------------------------------------------------------------------------------+ | ee_2211 | CREATE DATABASE ee_2211
/*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
| +----------+------------------------------------------------------------------------------------------------+** 1 row in set (0.00 sec) 4)修改库的字符集 alter database 库名 default(省略) character set 字符集格式; mysql> alter database ee_2211 character set gbk; Query OK, 1 row affected (0.00 sec)
mysql> show create database ee_2211; +----------+-----------------------------------------------------------------+
Database | Create Database |
---|---|
+----------+-----------------------------------------------------------------+ | |
ee_2211 | CREATE DATABASE ee_2211 /*!40100 DEFAULT CHARACTER SET gbk */ |
------- | ------------------------------------------------------------ |
+----------+-----------------------------------------------------------------+ | |
1 row in set (0.00 sec) | |
5)删除库 | |
5.1)drop database if exists 库名; 如果存在库名,则删除 | |
mysql> drop database if exists ee_2211; | |
Query OK, 0 rows affected (0.00 sec) |
mysql> show databases; 没有这个库了 +--------------------+ | Database | +--------------------+ | information_schema | | ee_2208_01 | | ee_2208_02 | | ee_2208_projects | | javaee_2211_mysql | | mybatis_01 | | mybatis_02 | | myee_2208 | | mysql | | performance_schema | | racemall | | sys | +--------------------+ 12 rows in set (0.00 sec) 5.2)drop databse 库名 ; 直接删除库 mysql> drop database javaee_2211_mysql;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | ee_2208_01 | | ee_2208_02 | | ee_2208_projects | | mybatis_01 | | mybatis_02 | | myee_2208 | | mysql | | performance_schema | | racemall | | sys | +--------------------+ 11 rows in set (0.00 sec)
六.DDL语句的基础语法--表的操作
-- 普通注释 单行注释 # 特殊注释 /多行注释/ -- 创建表的前提------------------>必须现在使用库----相当于进入到库(库就是文件夹) -- use 库名; mysql> use myee_2211; Database changed -- 数据库改变了:进入到指定库中 mysql> /* mysql常见的数据类型: int,int(int类型的字符数) 前者:int--->默认11位,当前这个字段(列的名称) 值本身的实际位数 (推荐) 年龄这个字段-----> 25-->使用int就可以表示即可 后者:int(3)---->给用户id(编号:1,2....n)---->不够三位补0 (不推荐后者) id--->1---------------->001 varchar(字符长度):字符串类型 姓名这个字段---->varchar(20) ---->最大长度取到20, "高圆圆" 实际三个字符 在mysql中字符串写的时候---->可以使用""双引号,也可以使用''单引号 date:日期类型----->仅仅表示日期 datetime:日期+时间 timestap:时间戳--->当前插入数据或则修改/删除数据的即时时间 :2022-11-30 11:30:00 double:小数类型 double(3,2): 小数是3位数,小数点后保留2位 clob:大字符类型,某个表中某个字段---> 使用clob来存储大文本! blob:大字节类型:存储大图片文件---大字节类型 */
-- 创建表的语法 /* create table 表名( 字段名称1 字段类型1, 字段名称2 字段类型2, 字段名称3 字段类型3, .... 字段名称n 字段类型n ) ; */ mysql> create table student( -> id int, -> name varchar(10), -> age int, -> gender varchar(5), -> avg_socre double(3,1) -> ); Query OK, 0 rows affected (0.05 sec)
mysql> show tables; +---------------------+ | Tables_in_myee_2211 | +---------------------+ | student | +---------------------+ 1 row in set (0.00 sec)
-- 查询表的结构 -- desc 表名; -- 看到表的字段有哪些 mysql> desc student; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | age | int(11) | YES | | NULL | | | gender | varchar(5) | YES | | NULL | | | avg_socre | double(3,1) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 5 rows in set (0.01 sec)
-- 修改表的字段类型 -- alter table 表名 modify 字段名称 修改后字段类型; mysql> alter table student modify name varchar(8); Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(8) | YES | | NULL | | | age | int(11) | YES | | NULL | | | gender | varchar(5) | YES | | NULL | | | avg_socre | double(3,1) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec) -- 修改字段名称, (注意这个语法不要直接同时修改字段类型) -- alter table 表名 change 以前的字段名称 现在的字段名称 以前的字段类型; mysql> alter table student change gender sex varchar(5) ; Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings:0
mysql> desc student; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(8) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | varchar(5) | YES | | NULL | | | avg_socre | double(3,1) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
-- 修改表--->添加一个新的字段 -- alter table 表名 add 字段名称 字段类型; mysql> alter table student add address varchar(50) ; Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student ; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(8) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | varchar(5) | YES | | NULL | | | avg_socre | double(3,1) | YES | | NULL | | | address | varchar(50) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
-- 修改表--- 删除表中某个字段 -- alter table 表名 drop 字段名称 ; mysql> alter table student drop avg_socre; Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student ; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(8) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | varchar(5) | YES | | NULL | | | address | varchar(50) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec) -- 修改表名 -- alter table 表名 rename to 新表名; 也可以用 rename table 以前表名 to 新表名;
mysql> alter table student rename to stu; Query OK, 0 rows affected (0.02 sec)
mysql> show tables; +---------------------+ | Tables_in_myee_2211 | +---------------------+ | stu | +---------------------+ 1 row in set (0.00 sec) -- 查询表的字符集 -- show create table 表名; -- 修改表的字符集 -- alter table 表名 character set 字符集格式; -- 复制表---快速去创建有一个结构相同的表 -- create table 新表名 like 旧表名; mysql> create table teacher like student; Query OK, 0 rows affected (0.02 sec)
mysql> show tables; +---------------------+ | Tables_in_myee_2211 | +---------------------+ | student | | teacher | +---------------------+
2 rows in set (0.00 sec)
-- 删除表 -- drop table if exists 表名;如果存在表删除 mysql> drop table if exists teacher; Query OK, 0 rows affected (0.02 sec)
mysql> show tables; +---------------------+ | Tables_in_myee_2211 | +---------------------+ | student | +---------------------+ 1 row in set (0.00 sec)
七.需要改动mysql服务器端的核心配置文件my.ini文件
my.ini--->自定义目录或者默认的目录--->c判断 programdata--->Mysql--->mysqlserver5.7--->my.ini 1)停掉mysql57的服务---->dos黑窗口---管理员权限打开 C:\Users\Administrator>net stop mysql57 MySQL57 服务正在停止. MySQL57 服务已成功停止。 C:\Users\Administrator> 2)notepad++打开my.ini核心配置文件 下图为例 3)重启mysql服务器,改动的配置文件才生效 C:\Users\Administrator>net start mysql57 MySQL57 服务正在启动 . MySQL57 服务已经启动成功。 C:\Users\Administrator>
八.DML语句:数据库操作语句
插入数据 删除表中的数据 修改的表的数据 查询表相关--------------语法很多(数据库玩的就查询) 基本查询 高级查询 黑窗口先去使用------后面去使用图形界面化工具:sqlYog或者navicat
-- 面试题:delete from 表名 删除表中的数据,表结构还在,如果表中的id -- 有自增长约束存在,不会影响自增长约束的值,下一次插入数据之后 /在上一次id的基础上继续自增 TRUNCATE TABLE 表名 ,删除表结构和数据,创建一个空表,直接影响 了这种(非业务字段)主键的值,下一次插入数据的时候,从1开始 继续自增/
插入数据
全插入
INSERT INTO 表名 VALUES (值1,值2...);
部分插入
INSERT INTO 表名 (字段值1 ,字段值2....) VALUES (值1,值2...);
修改数据
带条件修改
UPDATA 表名 SET 字段值= 值 WHERE 字段值 =值;
不带条件全修改
UPDATA 表名 SET 字段值1=值1,字段值2=值2...;
查询数据
DESC 表名;查表的结构
SELECT * FROM 表名;*意思是全查 (企业里面不推荐使用)
删除数据
全删
DROP TABLE 表名;删表数据
TRUNCATE TABLE 表名;删表结构,全删
带条件删
DELETE FROM 表名 WHERE 字段值=值;
代码如下:(写完一段运行一段)
-- 单行注释 /* 多行注释 */
#特殊注释
-- 图形界面化,手动编辑sql语句 -- 创建库 CREATE DATABASE Myee_2211; USE Myee_2211; -- 创建表 CREATE TABLE student( id INT , -- 学生的编号 NAME VARCHAR(10), -- 姓名 age INT , -- 年龄 gender VARCHAR(3), -- 性别 avg_socre DOUBLE(3,1), -- 分数 address VARCHAR(50) ); -- DML语句:插入,修改,删除,查询 -- 查询表结果显示列名信息 DESC student ; -- 基本的查询:查询全表 -- select * from 表名; SELECT * FROM student; -- 插入数据 -- 插入 全表数据insert into 表名 values(值1,值2,值3...值n) INSERT INTO student VALUES(1,'香菱',32,"女",60,"西安市"), (2,'xiao',12,"男",60,"璃月市"),(2,'行秋',45,"男",60,"璃月市"); -- 插入 部分字段,没插入的字段值为null -- insert into 表名(字段名称1,字段名称2)values(值1,值2..) INSERT INTO student(id,NAME,age,gender,avg_socre) VALUES (10,"马报过",44,"男",89.2),(10,"蔡徐坤",44,"男",89.2), (10,"蔡徐坤",3,"",89.2); -- 修改数据 -- 带条件修改 UPDATE student SET NAME = "阿姐" WHERE id = 2; -- 倒数第八个整理代码 UPDATE student SET NAME = "张良", age = 32, avg_socre = 50.4 WHERE id = 10 ; -- 修改的时候如果不带where条件,属于批量修改
-- 删除数据 -- 待条件的删除 Delete FROM 表名 WHERE 字段名=值 ; DELETE FROM student WHERE id=1; -- 删表数据 DROP TABLE student ;