SSM的基础知识
cs架构:多个客户端可以访问一台服务器
- 请求:
协议://主机[: 端口][/路径][?查询参数]
- http就是一种协议,https是一种带加密的协议更加安全一点
- 主机:localhost
- 端口号:因为tomcat和mysql都是网络应用,会占据端口,如何区分是使用该服务器的哪个应用?tomcat是8080,mysql是3306
- 路径就是指定使用该项应用的什么功能add
- 查询参数 问号开头,多个参数&连接
springboot 内嵌了tomcat,并提供了方便处理cs架构中的输入和输出的类
- maven可以帮助我们下载和管理第三方jar包,需要将下载地址修改为国内的地址,可以通过加mirror加速
- 新加入的模块需要将pom文件添加为maven项目,才能正常使用
- 三种
- new String[2]
- new String[]{}
- {}
- 用maven下的package进行打包,打包完成后在命令行用java -jar xxx就可以运行
- @Controller
- @RequestMapping
- @ResponseBody
- @SpringBootApplication
类和对象
-
如果没有赋值的话,java会给出默认值
- byte,short,int,long,char 默认0
- float,double 默认0.0
- boolean 默认false
- 其余默认为null
-
可以通过构造函数参数不同进行不同的初始化构造,无参构造在没有别的构造时可以省略
-
当多个对象具有相同的元素,使用static,并且使用类名来调用,静态对象和静态方法不从属于任何对象,方法内使用的信息全部来自于参数
-
final的意思是这个变量只能赋值一次
-
变量类型:
- static:从类被虚拟机加载开始,static变量就一直存在能用
- 参数变量
- 局部变量
- 成员变量
-
继承:减少字段的定义和方法的重写
数据类型:
-
基本类型:byte,short,int,long,float,double,char,boolean
-
引用类型:对象,数组,String,包装类型(Byte,Character, Integer)
- 包装类型:有成员变量和方法
- null:nullpointexception空指针异常
-
数据类型转换:
-
1、基本类型
-
boolean不可以和其他转化
-
顺箭头java自动转换,逆着箭头需要进行强制转换(可能损失精度)
-
-
2、包装和基本类型的转换
- 包装类型和对应的基础类型可以直接转换
-
3、对象类型的转换
-
java中的继承只能是单继承
-
object是类的顶层父类,隐式继承
-
对象类型之间的向上转型:a is a b, now a transfer b 隐式转换:Animal a = new cat() :对象还是new的对象,只不过用父类型来代表。无法调用子类型的变量
-
对象类型之间的向下转型:由animal转化为cat时需要强制转换,Cat a = (Cat) a;是可以的, Dog d = (Dog) a: a还是指一只猫,猫 not is a 狗 ;Object b = new Cat; Animal g = (Animal) b是可以的,因为b实际指一只猫,猫 is a animal,所以正确【总结:逆着转化需要真正代表的对象和目标对象符合is a的关系】
-
向上转型可以使用同一的类型来表示子类型,比如在处理数组和传参参数的时候,而向下转型可以再还原回来
- a,getClass()获得代表对象的真实类型
- 对象a instanceof 类型:判断对象是否是一个xx类型,判断真实类型是否与类型满足is a的关系
-
-
4、不属于以上三种的类型转化
- String a = “1”; Integer.parseInt (a) + Integer.parseInt (b)
-
多态
-
同一个方法表现出了不同的行为,那么此方法具有多态性 poly morphism(多种形态)
-
Animal[] animals = getAnimals()
-
animals[i].say()
-
虽然表面上都是animals类型的say方法,但是在say的时候会去找对应的真正对象
-
能够产生多态的情况;
1、用父类型来代表子类型,用一个父类型统一操作子类对象
2、方法重写:子类和父类都有相同的方法say,父类一定要有,不然调用就会报错,子类如果有的话就调用子类的
- 同名,参数,和返回对象也要一致
- 注解:override 编译器帮忙检查该方法重写规则是否满足、
-
-
先看对象的真正类型
-
优先执行真正类型中的重写方法
-
没有重写就执行父类的方法
-
ctri+o对方法进行重写
-
-
多态的好处:加新方法的时候,对原有代码的改动非常小
封装:(对外隐藏实现细节)
-
为了保护成员变量不被外界恶意修改,可以将成员变量变为私有的
-
四种访问修饰符
- public:谁都能使用
- protected(不能加在类上):同包类可以使用,子类即使是跨包的但是也可以使用(这就要求原始父类的修饰类型为public,否则按照默认的访问修饰符是不可以访问的)
- 没有标识默认访问修饰符:只有同包类才能使用
- private(不能加在类上):只有本类可以使用
-
使用原则:尽可能让访问范围更小:private<默认<protected<public; 字段想让子类使用的话就是用protected
javabean
-
javabean是一种写java的规范
- 字段私有,可以通过公共的方法来访问私有字段 get set is
- 最好提供无参构造
- 最好实现一个接口 Serializable
-
javabean中一般只封装数据,除了getset没有别的复杂逻辑方法
-
行话:有getName/setName方法,Teacher这个javabean有name属性,有字段不一定有属性!
接口——解决单继承
-
一个类可以实现多个接口
-
接口:
- 放入接口的方式必须加上default
- default只能用public修饰,可以省略
- 接口中的方法可以直接给出实现方式,类implement后也具有了这种实现方式
-
接口多态:
- 用父类代表子类对象/用接口类型代表实现类对象
- 子类要重用父类方法,必须发生方法的重写
- 子类或者实现类的访问修饰符必须大于父类和接口的访问修饰符
-
抽象方法:只有方法声明,没有方法体
- 用abstract修饰,必须是public,abstract和public都可以省略
- public abstract void e();
- 实现类必须重写接口中的抽象方法
-
封装
- 接口对象可以代表实现类,但是只能拿到接口中有的成员方法,不能访问其他
-
在同一个文件下的限制:
- 多个接口和类中只能有一个是public
- public的这个类或者接口必须与java的原文件同名
-
真正实现的时候,很少用父子类来进行代码复用,而会使用接口来减少代码复用,并且会单独用javabean存数据,用service存储方法,实现数据和逻辑的分离
可以用Spring框架来代替new创建对象 @ Service
- 控制反转:Inversion of Control对象的创建权转移到Spring框架
- @Controller和@Service和JavaBean的创建都是交给spring来创建对象的
- 怎么拿到创建的sevrice对象呢?
- 依赖注入:通过框架来找依赖对象
- @Autowired 根据类型到Spring这儿找对象
- 因为创建的对象都可以转化为CalculatorService,所以这句话加了Autowired就会将Spring中产生的三个service对象放到数组中,产生的controller对象不会放入,而三个service对象的放置顺序与名字中标识的012有关
- 怎么创建javabean对象(一般是在控制器处理请求的时候,会将传入的参数根据一定的规则创建javabean对象)
- 优先调用JavaBean的无参构造,根据传入数据的标识符和set进行匹配,p寻找setP,m寻找setM等,没有对应接受的值还是需要通过reponsebody进行传参
- 没有无参构造嘞?spring会执行new Calculator(double p. int m, double yr),传入参数会寻找有没有p,m,yr等,有的话就传进去构造bean
- 传入的顺序和接受的顺序没有要求,但是名字一定要相同
- 如果是接口的话spring可以直接帮忙创建实现类
ArrayList,数组的容量是固定的
- 如果想要打印数组元素,不需要循环,而是用 Arrays.toString (arr0) 将数组转化为String再打印
- ArrayList扩容
- new ArrayList( 初始容量) // 默认为10
- list.add()
- 内部封装了扩容,每次会比原来大1.5倍,向下取整
- ArrayList的本质就是object数组,可以放置任意类型的对象
- 可以用直接list.toString或者增强for循环的方式进行遍历
- 泛型ArrayList 只能指引用类型
- ArrayList list = new ArrayList();
- 泛型限制了LIST中可以放入的类型
- List是ArrayList的父类,如果只有两个元素那么类型为List12,超过两个元素类型为ListN, 其中List12和ListN是不可变的list,通常用List.of()初始化
- 可以组合使用,list.addAll(别的类型)
Map映射
- key-value (键值对:entry)
- key要唯一
- Map声明的时候两个泛型分别限制key和value
- 不可变的Map集合:Map<String,String> map = Map.of()
- 可变的Map集合: Map<String,String> map = new HashMap<>();
- map.put的时候如果没有就新增
- 如果已经有了那么就是修改
- map.remove (key)
- map.get(key): 根据key查询value
- 遍历:for(map.Entry<Strign,String> e : map.entrySet())
- e.getKey e.getValue
异常
-
try-catch: 没有异常就照常执行,有异常的话可以通过执行catch语句处理异常
-
catch获取异常对象,让程序恢复正常流程
-
抛出异常是将异常对象交给了方法的上一层(Spring会自动向上抛出)
- 如果上一层的方法能够捕获异常,那就catch到了,就开始执行catch中的代码然后继续执行catch后的语句
- 否则的话就继续往上一层抛出,直到main的上一层java虚拟机,就说明无法处理,程序结束
-
-
异常分为两大类
- 运行时异常(红圈圈住的):自动交给上一层处理,不需要加说明
- 编译异常:自己处理异常/交给方法的上一层处理异常 throws Exception 需要显式说明
-
finally:无论是否出现异常都会执行finally 记得close关闭资源
MyBatis是将javabean和sql中用到的数据转换更加容易,连接数据库的步骤
- 加入mybatis和mysql依赖
- 加入recources下的application.properties
- 写javabean,类名对应表名,类名的字段对应表中字段
- StudentMapper类,要加Mapper注解,表明这是专用于数据库增删改查的接口(不需要写实现类,这里的实现不是由service和autowried实现的,而是mybatis和spring来实现的) @Select、@Insert 、@Update、@Delete