JAVA全栈开发 day21_JDBC与反射结合、设计模式

一、总结

一阶段

day01 java 发展,java 环境( path, java_home, class_path),java 原理, java 执行 , jvm , jre , jdk

day02 变量 标识符命名规则 数据类型 数据类型的转换 运算符

day03 选择结构 if , switch

day04 循环结构 for , while , do-while

day05 双重循环(打印星星)

day06 数组(一维数组):排序(冒泡,选择),数据的扩容与缩容

day07 ATM机

二阶段

面向对象

day08​            面向过程,**面向对象的思想**(基于对象 -》类), 类与对象的关系, 类是模板。​           类和对象的概念​           方法​             重载​           类的包括(成员变量,成员方法)day09 ​        封装​              this​              private ​              构造函数day10​     继承( 多个类重复的信息,提供一个公共类,使用继承去实现)​             extends ​             特点:只能单继承不能多继承​            子类可以继承父里哪些(私有的继承不了)​           重写day11​     多态​            要有继承 ​            要有重写​           要有父指子类的引用​           (编译看左边,除了方法运行看右边外,其它的运行也是看左边; 为什么方法运行看右边,因为它实现重写)day12​    抽象类与接口​     抽象类: 包括抽象方法类,一定要抽象 类,抽象类可以有构造方法,抽象 方法,还可以有普通方法; 只是不能实例化​    接口: 一定要抽象方法, jdk 1.8  default , static jdk 1.9 private 方法(主要指default使用)​       多态的分类​          具体类多态​          抽象 类多态​          接口多态 (用的最多)​       抽象类与接口区别​          关系 ​              类与类,接与接口,类与接口​          成员​              成员属性​              构造方法​              成员方法​           设计  is a  ,  like a day13 - day14 Math, String , Object ,  Date , Calendar , 包装类 , 正则表达式 , Scanner , Random 等day16代码块内部类成员内部类,局部内容部, 匿名内类部(本质是一个对象)lamda表达式day17 异常day 18 IOday 19 网络编程day20 多线程**day21-day22 集合** ​           				    单列 (Connection)                        双列(Map)​             list                                set                   HashMap    HashTable ... ​    ArrayList,  LinkedList, Vecktor       HashSet, TreeSet           put() :存值 ,如果 键名相同,就是修改值 .  键不能重复​           考原理:数组与链表               (底层HashMap, Jdk1.9 结合红黑树去实现)​                                                                        哈希表(数组+链表的结合)day 23-24 Mysql ​  关系型数据 ​  增删改查(mysql )约束(外键约束)查询 (表连接, join, left join ,right join )索引 ​    事务(ACID): 隔离性(脏读,不可重复读,幻读  =》  sql 隔离级别)mysql 存储引擎(不同引擎它的支持不一样)day 25 JDBCjava 去连接数据的一种技术 (JDBC api )不同数据库去实现JDBC 接口下载jar使用jarjdbc连接数据的步骤:1. 注册驱动
2. 创建连接对象
3. 创建sql执行对象  statement
4. 写sql 语句,且调用对象的方法执行。 excuteQuery()  , excuteUpdate();
5. 如果是查询,处理结果集
6. 释放资源 封装 1. 把重复,提成一个方法(创建连接的方法, 释放资源的方法)
2. 把提取方法专门一个独立的类里(JdbcUtils)
3. jdbc连接时,url , 驱动, 用户名,密码; 因为它们可能进行修改,所有独立配置文件,提高了代码的维护性day 26 反射使用Class 对象,获取成员属性,构造方法,成员方法(动态代理)1. 获取 Class 对象类名.class;对象名.getClass();Class.forName(类名-包括包名);2. 构造方法      3. 成员属性(在使用时,必须要有对象)4. 成员方法(在使用时,必须要有对象)(加s 的表示获取所有, 不加s表示获取单个) -- 默认这些方法都调用的public修饰如果要获取所有修饰的类型。 给方法一个Declared 注: 如果是私有的,即便获取 了,也不能使用,如果要使用,把java安全语法检查跳过.    xxx.setAccessable(true);

作业

  1. 写一个setProperty(Object obj, String propertyName, object value){}

  2. 给ArrayList的一个对象,添加一个字符串

  3. curd(增删改查)商品

    商品表(goods)

    ​ g_id,g_name,g_price,g_num

​ 思路:

        1.  创建表2.  接口(定义方法)3.  写一个Jdbc工具类4.  接口的实现5.  测试类,调用实现类的方法

二、JDBC 与反射结合

封装了两个方法: 增删改 excuteUpdate, 查询 excuteQuery

public class JdbcUntils {static {//1.注册驱动  告诉jdbc我们使用哪一个数据库厂商的驱动try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}//写一个jdbc 工具类Connection connection = null;PreparedStatement st = null;ResultSet rs = null;//分析:// 当前方法写完了,发现sql 语句是不是直接传过来,可以如果 有参数,直接进行sql拼接会产生sql注入风险// 所以,就考虑使用参数化// 将数据,传过来,传来后,使用PreparedStatement添加参数public int excuteUpdate(String sql,Object... params)   {int result = -1;try {//2. 创建连接connection = getConnection();//3. 创建statement对象//这个里包括了? ,所以需要参数指定st = connection.prepareStatement(sql);//要把参数加到PreparedStatement对象中//pst.setString(1,username);// pst.setString(2,pwd);for (int i = 0; i < params.length; i++) {st.setObject((i + 1), params[i]);}result = st.executeUpdate();//4. release 释放资源release();}catch (SQLException e){e.printStackTrace();result = -1;}finally {return result;}}public <T>  List<T> excuteQuery(String sql,Class<T> c,Object... prarms){//创建一个集合,存放所有的结果对象List<T> list  = new ArrayList<>();try {connection = getConnection();//	3. 获得执行对象  Statement// 查询 里的sql语句也可以能有参数st = connection.prepareStatement(sql);//添加参数for (int i = 0; i < prarms.length; i++) {st.setObject((i + 1), prarms[i]);}//	4. 执行sql并获得结果集(ResultSet)rs = st.executeQuery();// 4.1 得到结果集的元数据ResultSetMetaData ms = rs.getMetaData();//列的数量int colCount = ms.getColumnCount(); // 处理结果while (rs.next()){
//                int i = 1;//添加一个 T类的实例T t = c.getDeclaredConstructor().newInstance();// 1. 得到结果集,列名数组//2. 循环列名//   循环体里,根据列名,去找对象的对应的字段 ,然后在进行赋值for(int i=1;i<=colCount;i++){Object value = rs.getObject(i);if(value!=null){//将这对应的值,放到对象对应的字段中String colName = ms.getColumnName(i);//通过反射,设置字段的值//要求结果的列名,与实体对象的属性(字段名)相同Field field = c.getDeclaredField(colName);// 跳出java的语法检查 field.setAccessible(true);// 给字段设置对应的值 field.set(t,value);}}list.add(t);//给实例对象的每个属性,赋值// 方法一: 获取所有字段进行赋值,这个要求字段与数据的列的顺序要求一致
//                Field[] Fields = c.getDeclaredFields(); //获取所有的字段
//                for(Field field : Fields){
//                    //缺点: 实体的字段 与数据查询 出来的字段要一一对应
//                    //思路: 如果不对应怎么?
//                    // 最好,可以得到结果集的列名,根据列名,给对应的字段赋值
//
//                    // 这里值 ,应该从结果集
//                    field.set(t,rs.getObject(i++));
//                }//T对象加入到list中}// 	5. 处理结果集release();}catch (Exception e){e.printStackTrace();list = null;} finally {return list;}}//创建连接public Connection getConnection() throws SQLException {//2.通过驱动管理器获取一个链接Connection connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/j352", "root", "");return  connection;}//释放资源public  void release(){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}rs =null; //让jvm来回收它}if(st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}st =null; //让jvm来回收它}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}connection =null; //让jvm来回收它}}}

三、设计原则

1)创建软件应用程序是为了满足不断变化和发展的需求。一个成功的应用程序还应该提供一种简单的方法来扩展它以满足不断变化的期望。如果在设计和开发软件时应用一组面向对象的设计原则和模式,则可以避免或解决这些常见问题。

2)面向对象的设计原则也被称为 SOLID 。在设计和开发软件时可以应用这些原则,以便创建易于维护和开发的程序。

SOLID 原则包括,单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。

单一职责原则:每个类只负责做一件事

专业的人做专业的事。每个类只负责做一件事

单一职责原则,其它就是“高内聚”的体现。

每个类只负责做一件事, 对外只提供一个功能,而引起类的变化 的原因应该只有一个。

开闭原则 : 对扩展开放,对修改关闭

核心思想:一个对象 对扩展开放,对修改关闭

对类的改动是通过增加代码进行,而不是修改代码

如何实现?这就需要借助于抽象 和多态。即把可能变化 的内容抽象 出来.

因为抽象的部分是相对稳定

里氏替换原则

子类可以扩展父类的功能,但不能改变父类原有的功能

子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

接口隔离原则

别人不需要的东西不要强加给人家。

接口隔离原则是为了约束接口,降低类对接口的依赖。

接口隔离原则是为了约束接口,降低类对接口的依赖。
接口隔离原则的优点:
1)灵活性,可维护性增强
2)高内聚,低耦合
3)减少代码冗余(减少了方法的实现)
4)体现对象层次

依赖倒置原则

依赖于抽象,而不是依赖于具体,依赖注入模式

依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的一个原则,它是SOLID原则中的一部分。依赖倒置原则的核心思想是:

高层模块不应该依赖于低层模块,二者都应该依赖于抽象; 抽象不应该依赖于具体细节,而具体细节应该依赖于抽象。

(依赖于抽象)

简而言之,依赖倒置原则要求我们通过抽象来解耦高层模块和低层模块之间的依赖关系,从而使系统更加灵活、可扩展和易于维护。

核心思路: 要依赖于抽象 ,不要依赖于具体

为了实现这一原则 ,在编程时针对抽象类或者接口编程,而不是具体要求实现

四、设计模式

设计模式是一套反复被使用,经过验证的,代码的总结 ;

设计模式不是具体的方法,而一种思想.

学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使程序实现复用

设计模式的几个要素

  1. 名字, 必须有一个简单,有意义的名称
  2. 问题 描述在何使用
  3. 解决方案 如何去解决问题
  4. 效果 模式优点缺点

设计模式分类:

创建型模式 对象的创建

结构型模式 对象的组成(结构)

行为型模式 对象的行为

创建型模式: 简单工厂模式, 工厂模式,单例模式等。。。

**结构型模式:**外观模式,适配器模式,装饰模式 。。。

**行为型模式:**模板方法模式,观察者模式,状态模式。。。

1.常见设计模式

简单工厂模式

静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例

优点:客户端不需要负责创建对象,明确了各位类的职责

缺点:静态工厂负责创建对象,如果有新的对象增加,或者创建方式不同,需要不断的修改工厂类,不利于后期维护

public class AnimalFoctory {private AnimalFoctory(){}public static Animal createAnimal(String type){if("dog".equals(type)){return new Dog();}else if("cat".equals(type)){return new Cat();}else{return null;}}public static Dog createDog(){return  new Dog();}public static Cat createCat(){return  new Cat();}
}
工厂模式

工厂模式: 抽象工厂类负责定义创建对象的接口,具体对象的创建由继承抽象工厂的具体类实现

优点:客户端不需要负责创建对象,明确了各位类的职责 ; 如果 新的对象增加,不修改已有的代码,增加了维护性和扩展性

缺点:需要额外编写代码,增加了工作量

单例模式

单例模式: 确保类在内存中只有一个对象,此实例必须自动创建,并且对外提供

优点:

缺点:

(饿汉式): 类加载的就创建对象

public class Student {// 为了让静态方法可以访问此对象,所以把它变成静态的// 为了让外界不能直接访问,加privateprivate static Student s = new Student();private Student(){}public static Student getStudent(){return s;}
}

(懒汉式):用的时候,才去创建

public class Student2 {private static Student2 s = null;private Student2(){}public static Student2 getStudent(){if(s==null){s = new Student2();}return s;}
}

面试题:单例模式的思想是什么?请写一代码体现。

​ 开发:饿汉式(是不会出现问题的)

​ 面试:懒汉式(可能会出现问题的)

​ A: 懒加载(延迟加载)

​ B: 线程安全问题

public class Student2 {private static Student2 s = null;private Student2(){}public static synchronized Student2 getStudent(){if(s==null){s = new Student2();}return s;}
}
Runtime类
public class Runtime {private static Runtime currentRuntime = new Runtime();public static Runtime getRuntime() {return currentRuntime;}/** Don't let anyone else instantiate this class */private Runtime() {}}
模式设计模式

需求: 计算出一段代码的运行时间

优点: 满足用户需求,灵活多变

缺点:如果算法需要改变,需要修改抽象 类

装饰设计模式(扩展对象)

优点:

可以提供比继承更灵活的扩展对象的功能

缺点:可以任意组合

已经学过的装饰:

Scanner scanner = new Scanner(System.in);

2.枚举

枚举是指变量的一一列出来,只能在指范围内取值;

如: 一周只有7天,一年12个月

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分割回文串

分割回文串 描述 : 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 题目 : LeetCode 131.分割回文串 : 131. 分割回文串 分析 : 字符串如何判断回文本…

20 Redis进阶 - 运维监控

1、理解Redis监控 Redis运维和监控的意义不言而喻&#xff0c;可以以下三个方面入手 1.首先是Redis自身提供了哪些状态信息&#xff0c;以及有哪些常见的命令可以获取Redis的监控信息; 2.一些常见的UI工具可以可视化的监控Redis; 3.理解Redis的监控体系;2、Redis自身状态及命…

Vue3-02-ref() 响应式详解

ref() 是什么 ref() 是一个函数&#xff1b; ref() 函数用来声明响应式的状态&#xff08;就是来声明变量的&#xff09; ref() 函数声明的变量&#xff0c;是响应式的&#xff0c;变量的值改变之后&#xff0c;页面中会自动重新渲染。ref() 有什么特点 1.ref() 可以声明基础…

VUE语法--toRefs与toRef用法

1、功能概述 ref和reactive能够定义响应式的数据&#xff0c;当我们通过reactive定义了一个对象或者数组数据的时候&#xff0c;如果我们只希望这个对象或者数组中指定的数据响应&#xff0c;其他的不响应。这个时候我们就可以使用toRefs和toRef实现局部数据的响应。 toRefs是…

算一算并输出2到正整数n中每个数的质因子(for循环)

计算并输出2到正整数n之间每个数的质因子&#xff0c;并以乘法形式输出。 输入格式: 输入只有1个正整数即n。 输出格式: 把2到正整数n间的每一个数分解成它的质因子&#xff0c;并以乘法的形式输出。例如&#xff0c;输入的正整数n值为10&#xff0c;则应输出如下&#xff…

MIT线性代数笔记-第28讲-正定矩阵,最小值

目录 28.正定矩阵&#xff0c;最小值打赏 28.正定矩阵&#xff0c;最小值 首先正定矩阵是一个实对称矩阵 由第 26 26 26讲的末尾可知正定矩阵有以下四种判定条件&#xff1a; 所有特征值都为正左上角所有 k k k阶子矩阵行列式都为正&#xff08; 1 ≤ k ≤ n 1 \le k \le n …

DDD系列 - 第6讲 仓库Repository及Mybatis、JPA的取舍(一)

目录 一、领域层定义仓库接口1.1 设计聚合1.2 定义仓库Repository接口二 、基础设施层实现仓库接口2.1 设计数据库2.2 集成Mybatis2.3 引入Convetor2.4 实现仓库三、回顾一、领域层定义仓库接口 书接上回,之前通过一个关于拆解、微服务、面向对象的故事,向大家介绍了如何从微…

简单的WEB服务器

优质博文&#xff1a;IT-BLOG-CN 目的&#xff1a; 了解Java Web服务器是如何运行的。Web服务器使用HTTP与其客户端&#xff0c;也就是Web浏览器进行通信。基于Java的Web服务器会使用两个重要类&#xff1a;java.net.Socket类和java.net.ServerSocket类&#xff0c;并通过发送…

详解Keras3.0 Models API: Model class

1、语法 keras.Model() 将不同层组为具有训练/推理特征的对象的模型 2、示例一 inputs keras.Input(shape(37,)) x keras.layers.Dense(32, activation"relu")(inputs) outputs keras.layers.Dense(5, activation"softmax")(x) model keras.Model…

58.Nacos源码分析2

三、服务心跳。 3.服务心跳 Nacos的实例分为临时实例和永久实例两种&#xff0c;可以通过在yaml 文件配置&#xff1a; spring:application:name: order-servicecloud:nacos:discovery:ephemeral: false # 设置实例为永久实例。true&#xff1a;临时; false&#xff1a;永久ser…

MySQL-备份+日志:介质故障与数据库恢复

目录 第1关&#xff1a;备份与恢复 第2关&#xff1a;备份日志&#xff1a;介质故障的发生与数据库的恢复 第1关&#xff1a;备份与恢复 任务描述 本关任务: 备份数据库&#xff0c;然后再恢复它。 test1_1.sh # 你写的命令将在linux的命令行运行 # 对数据库residents作海…

【C/C++笔试练习】多态的概念、虚函数的概念、虚表地址、派生类的虚函数、虚函数的访问、指针引用、动态多态、完全数计算、扑克牌大小

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;多态的概念&#xff08;2&#xff09;虚函数的概念&#xff08;3&#xff09;虚表地址&#xff08;4&#xff09;派生类的虚函数&#xff08;5&#xff09;虚函数的访问&#xff08;6&#xff09;分析程序&#xff08;7&…

C# WPF上位机开发(会员管理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 好多同学都认为上位机只是纯软件开发&#xff0c;不涉及到硬件设备&#xff0c;比如听听音乐、看看电影、写写小的应用等等。如果是消费电子&#…

HibernateJPA快速搭建

1. 先创建一个普通Maven工程&#xff0c;导入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depe…

Java 匿名内部类使用的外部变量,为什么一定要加 final?

问题描述 Effectively final Java 1.8 新特性&#xff0c;对于一个局部变量或方法参数&#xff0c;如果他的值在初始化后就从未更改&#xff0c;那么该变量就是 effectively final&#xff08;事实 final&#xff09;。 这种情况下&#xff0c;可以不用加 final 关键字修饰。 …

报错:Parsed mapper file: ‘file mapper.xml 导致无法启动

报错 &#xff1a; Logging initialized using class org.apache.ibatis.logging.stdout.StdOutImpl adapter. Registered plugin: com.github.yulichang.interceptor.MPJInterceptor3b2c8bda Parsed mapper file: file [/Mapper.xml] application无法启动 我这边产生原因是项…

K8S学习指南(4)-minikube的使用

文章目录 简介安装 Minikube启动 Minikube 集群基本概念创建和管理资源1. 创建 Pod2. 创建 Deployment3. 创建 Service 监视和调试1. 查看集群状态2. 查看集群信息3. 访问 Kubernetes Dashboard4. 使用 kubectl 命令 清理资源1. 删除 Pod2. 删除 Deployment3. 删除 Service4. 停…

! [remote rejected] master -> master (pre-receive hook declined)

! [remote rejected] master -> master (pre-receive hook declined) 如图&#xff1a; 出错解决方法 首先输入命令 git branch xindefenzhi然后&#xff0c;进入这个新创建的分支 git checkout branch然后重新git push就可以了

爬虫学习-基础库的使用(urllib库)

目录 一、urllib库介绍 二、request模块使用 &#xff08;1&#xff09;urlopen ①data参数 ②timeout参数 &#xff08;2&#xff09;request &#xff08;3&#xff09;高级用法 ①验证 ②代理 ③Cookie 三、处理异常 ①URLError ②HTTPError 四、解析链接 ①urlparse ②…

LeetCode-10. 正则表达式匹配

LeetCode-10. 正则表达式匹配 问题分析算法描述程序代码CGo 问题分析 这道题的难点主要在于*号的匹配&#xff0c;这里记dp[i][j]表示s[1...i]和p[1...j]能否完成匹配&#xff0c;先根据特殊情况归纳总结&#xff1a; *号匹配 0 次&#xff0c;则dp[i][j] dp[i][j-2]*号匹配…