第三十三天

单例设计模式:

  • 始终在内存中始终只有一个对象! *

  • 饿汉式和懒汉式 *

  • 饿汉式: 单例设计模式中最安全的一种设计模式!(不会出现线程安全问题!) *

  • 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; +----------+-----------------------------------------------------------------+

DatabaseCreate Database
+----------+-----------------------------------------------------------------+
ee_2211CREATE 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 ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值