发表于: 2019-11-06 21:31:01
1 957
一、今天完成的事
复习java任务深度思考问题
1.Mybatis有哪些常用标签?怎么使用标签来完成动态查询?
1、where、if标签
根据条件进行动态查询
<select id="selectByAll" resultType="com.student.Student"**>
select * from it_learn
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="name != null and name != '' ">
and name = #{name}
</if>
</where>
</select>2、choose(when、otherwise)标签
根据条件选择进行,一般用于二选一
<select id="selectByAll" resultType="com.student.Student">
select * from it_learn
<where>
<choose>
<when test =“id = null">
and id = #{id}
</when>
<otherwise>
and job=#{job}
</otherwise>
</choose>
</where>
</select>3、set标签
根据 id 设置某项值,进行更新
<update id="updateStudent" parameterType="com.student.Student">
update it_learn
<set>
<if test="name != null and name != '' ">
name = #{name},
</if>
<if test="job != null and job != '' ">
job = #{job},
</if>
</set>
where id = #{id}
</update>4、trim标签
定义sql片段,进行相应操作
<!-- 定义第一个 sql 片段,对应字段名,id属性值任意且唯一,后续引用 -->
<sql id="key">
<trim suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="job != null">
job,
</if>
</trim>
</sql>
<!-- 定义第二个 sql 片段,对应具体的值,id属性值任意且唯一,后续引用 -->
<sql id="value">
<trim suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="name != null and name != '' ">
#{name},
</if>
<if test="job != null and job != '' ">
#{job},
</if>
</trim>
</sql>
<!-- 插入语句 insert into it_learn(name,qq) values(#{name}, #{qq}) -->
<!-- <include refid="key"/> 和 <include refid="value"/> 表示引用 sql 片段 -->
<insert id="insertStuTrim" parameterType="com.student.Student">
insert into it_learn(<include refid="key"/>) values(<include refid="value"/>)
</insert>5、foreach标签
遍历数据库, 可进行批量操作
<insert id="insertStudent" parameterType="com.student.Student">
insert into it_learn(name,qq) values
<foreach collection="list" item="item" separator=",">
(#{item.name},#{item.qq})
</foreach>
</insert>
<!-- 查询语句 select * from it_learn where id in (xx,xx,xx) “in 操作符允许我们规定多个值”-->
<select id="selectStudent" resultType="com.student.Student">
select * from it_learn
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>6、bind标签
进行模糊查询
<select id="findStudent" resultType="com.student.Student">
<bind name="likename" value="'%' + name + '%'" />
select * from it_learn where name like #{likename}
</select>
2.什么叫反射?反射的坏处是什么?有哪些反射的应用场景?
- 什么是反射?
反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能调用这个对象的属性和方法,这种动态获取信息及动态获取信息的能力称之为java语言的反射机制。
反编译:.class-->.java
通过反射机制访问java对象的属性,方法,构造方法等;
- 反射的坏处:
当我们使用反射时,其实是在动态的获取信息,那么对于被获取信息的一方来说,其实是不安全的,内部的所有东西在反射面前都无处遁形,非常的不安全,相当于我们在别人面前没有秘密可言。
可暴力获取类中方法类
-反射应用场景:
Jdbc 加载驱动-----
Spring ioc
框架
-对于反射,我们常用的方式是一般能不用就不用,用的话也是用在框架上面,底层已经给我们写好了,我们直接填写全类名调用即可,非常的方便。
3.什么是AOP,适用于哪些场景,AOP的实现方案有哪些?
AOP(Aspect Oriented Programming),面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善。
OOP是开发者定义纵向关系,但是并不允许开发者定义横向关系,所以有部分代码是横向的分布在所有对象层次中,例如日志功能等而与它对应的对象的核心功能毫无关系对于其他类型的代码,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
-Spring AOP的一些基本概念
(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
(3)Advice(通知):AOP在特定的切入点上执行的增强处理
(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
有五种类型的通知:
Before(前置):在方法被调用之前调用通知;
After(后置):在方法调用之后调用通知;(不管该方法是否执行成功)
After-returning(返回结果通知):在方法返回结果后;
After-throwing(异常通知):在方法抛出异常后;
Around(环绕):在方法调用之前和之后都会调用通知;
4.Map,List,Array,Set之间的关系是什么,分别适用于哪些场景,集合大家族还有哪些常见的类?
-LIST , SET, MAP都是实现了COLLECTION接口,是一个集合
ARRAY就是数组,也就是长度固定的容器
当我们需要保持一组类型相同的元素的时候,应该使用一个容器来保存,数组就是这样一个容器。 数组一旦定义,长度将不能再变化。
-集合和数组的关系?
相同点:
都是数据的容器,一个在数组或集合中可以储存多个数据。
不同点:
1.长度, 数组固定,集合可变
2.内容, 数组可以是基本类型或引用类型,集合是引用类型
3.元素, 数组只能存储同一种类型,集合可以存储不同类型
-LIST 接口
有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,可通过索引来访问List中的元素, 第一个元素的索引为 0,允许有相同元素。
List 接口存储不唯一,有序(插入顺序)的对象。
LinkedList:基于链表的数据结构
ArrayList:实现了基于动态数组的数据结构
-SET
具有与 Collection 完全一样的接口,只是行为上不同
不保存重复的元素
接口存储唯一,无序的对象
HashSet:采用Hashtable哈希表存储结构 无序 添加速度快、查询速度快、删除速度快
TreeSet:采用二叉树(红黑树)的存储结构。有序 查询速度比List快,比HashSet慢
-MAP
存储一组键值对象,提供key(键)到value(值)的映射。
HashMap:
Key无序、唯一(Set)Value 无序、不唯一(Collection)
TreeMap:
有序 速度没有hash快
ITERATOR是什么?能做什么?
Iterator 是一个接口,所有实现了collection接口的容器类都有一个iterator方法,用以返回一个实现了Iterator接口的对象,Iterator对象称做迭代器,用以对容器内元素进行遍历.
也就是说Iterator的作用就是为实现collection接口的容器类提供一个统一的遍历方法
5.Spring的IOC有几种方式?它们之间的差别是什么,应该选择Annonation还是应该选择XML?
-IOC的两种配置形式:基于XML文件,基于Annonation。
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率
为了解决这两个问题,Spring引入了注解,通过”@XXX”的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
6.JDBCTemplate和JDBC
jdbc需要每次进行数据库连接, 然后处理SQL语句,传值,关闭数据库.甚至有时还可能会出现数据库忘记关闭导致连接被占用.在以后的工作中,客户的需求肯定不是一成不变的,这就导致经常会改动数据库内容.通过JDBCtemplate我们只需更改需要更改的那一部分内容就可以了,不需要进行全局修改.Spring将替我们完成所有的JDBC底层细节处理工作.
7.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
-IOC是什么?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)
简单来说,Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期
-为什么不用new来创建对象
使用new来创建对象,每次需要使用都要重新创建对象,导致程序夯杂,高度耦合。
8.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
1、简单、规范性:如果一个项目比较庞大,那么就需要一个工程师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。
2、维护、拓展性:如果以后你想修改这个类甚至完全删除了,放弃这个类,但是其他地方引用了这个类name这样修改起来会非常麻烦,如果一开始就定义了一个接口,把主要的功能放在接口里面 你只需要用这个类去实现其他类就好了,以后需要换的只不过是其他引用类,这样就达到了维护和拓展的方便性。
3、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。
9.为什么要处理异常,Try/Catch应该在什么样的场景下使用
-为什么要处理异常
1)以业务逻辑功能为单位,在最上层加Try-Catch机制。为什么要这样做呢?这主要是增加程序的健壮性,防止因抛出异常过多,导致程序崩溃。
2)底层代码,在可能出错的地方加Try-Catch机制,用Catch侦测具体的异常,然后就具体的异常,采取相应的解决方案。
3)底层代码,在需异常追踪时加Try-Catch机制,在Catch块中抛出自定义异常,调试时可迅速定位到错误代码段。
Try-Catch机制会将异常屏蔽掉,必须根据具体的应用场景,具体分析。
10.什么是贫血模型,什么是充血模型?
-充血模型
充血模型就是把业务逻辑都写到pojo类中,优点是更符合面向对象的原则,service层很薄。缺点是dao层和充血对象形成了双向依赖,service层逻辑和dao层逻辑混乱,不利于开发。
-贫血模型
贫血模型就是再pojo类中只有set,get方法,不在里面写逻辑。这种模型的优点是各层单向依赖,结构清楚,易于实现和维护,设计简单易行,底层模型非常稳定。缺点是原来的操作数据层的代码被分离到service层,不符合面向对象原则,service层过于厚重。
11.为什么不可以用Select * from table?
使用*无法利用index类型的单表查询。在mysql中不同的查询条件,经mysql优化器优化后可能会利用不同的查询类型。
连接查询时,* 无法进入缓冲池
12.clean,install,package,deploy分别代表什么含义?
mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。
mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。
13 .自增ID有什么坏处?什么样的场景下不使用自增ID?
(1) 不具有连续性,表中auto_increment最大值被删除,将不会被重用。就是说会跳号(如果设定的auto_increment_increment是1,那么下一次插入的id值将会从被删除的最大值算起,也就是被删除的最大值+1) (2)历史数据表的主键id会与数据表的id重复,两张自增id做主键的表合并时,id会有冲突,但如果各自的id还关联了其他表,这就很不好操作。 (3) 很难处理分布式存储的数据表,尤其是需要合并表的情况下 (4) 在系统集成或割接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重;
14.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
mysql索引的四种类型:主键索引、唯一索引、普通索引和全文索引。
必须建索引的条件:
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
15.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
-普通索引
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。 因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。 只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。 mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {column} )
-唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 在对该列进行增或改时,首先会检查是否重复,在执行增改操作,否则报出duplica错误,拒绝操作。 mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {lolumn} )
16.varchar类型的长度怎么确定?
1.根据需求与实际情况来考虑,不能千篇一律。 比如:用户名,谁的名字会有255/3=85个字符?所以也没必要那么长,但又不能定义成CHAR(),所以给个够用的长度varchar(20)或更少varchar(10)即可,考虑少数民族可以长点。 varchar的长度,最好是在够用(需要适当预测未来需求)且方便管理的前提下尽可能短。
2.经常变化的字段用varchar;知道固定长度的用char;尽量用varchar;超过255字节的只能用varchar或者text;能用varchar的地方不用text;(效率上: char>varchar>text)。
二、遇到的问题
三、收获
1.学习计算机基础
网络通信的 5 层模型
物理层
一台计算机通过光纤电缆双绞线等介质连接,物理层负责把两台计算机连起来,然后在计算机之间通过高低电频来传送电信号
数据链路层
物理层只是把计算机连接起来,并通过高低电频传输0,1电信号
数据链路层就是用来标识这些电信号,让计算机能够准确解读
1. 以太网协议
以太网协议规定,一组电信号构成一个数据包,我们把这个数据包称之为帧。每一个桢由标头(Head)和数据(Data)两部分组成。
2. MAC 地址
连入网络的每一个计算机都会有网卡接口,每一个网卡都会有一个唯一的地址,这个地址就叫做 MAC 地址。计算机之间的数据传送,就是通过 MAC 地址来唯一寻找、传送的。
3. 广播与ARP协议
(1). 广播
意思就是计算机A要向B发送数据包,这个数据包包含了B的MAC地址,同时C和D也收到了数据包,但是地址是唯一的,通过解析MAC地址,B的MAC地址和A发送的MAC地址对应,所以B收到了数据,这个过程就叫广播。
(2). ARP 协议
那么上面A如何知道B的MAC地址的?这个时候就的由ARP协议来解决,通过他我们可以知道子网中其他计算机的MAC地址
网络层
计算机 A 通过广播的方式发一个数据包给计算机 B , 其他所有计算机也都能收到这个数据包,然后进行对比再舍弃。世界上有那么多它计算机,每一台计算机都能收到其他所有计算机的数据包,那就不得了了。那还不得奔溃。 因此产生了子网这么一个东西。
那么如何区分MAC地址是否属于同一个子网?
为了解决这个问题,于是,有了 IP 协议。
IP协议
每一台想要联网的计算机都会有一个IP地址。这个IP地址被分为两部分,前面一部分代表网络部分,后面一部分代表主机部分。并且网络部分和主机部分所占用的二进制位数是不固定的。
假如两台计算机的网络部分是一模一样的,我们就说这两台计算机是处于同一个子网中。例如 192.168.43.1 和 192.168.43.2, 假如这两个 IP 地址的网络部分为 24 位,主机部分为 8 位。那么他们的网络部分都为 192.168.43,所以他们处于同一个子网中。
可是问题来了,你怎么知道网络部分是占几位,主机部分又是占几位呢?也就是说,单单从两台计算机的IP地址,我们是无法判断他们的是否处于同一个子网中的。
这就引申出了另一个关键词————子网掩码。子网掩码和IP地址一样也是 32 位二进制数,不过它的网络部分规定全部为 1,主机部分规定全部为 0.也就是说,假如上面那两个IP地址的网络部分为 24 位,主机部分为 8 位的话,那他们的子网掩码都为 11111111.11111111.11111111.00000000,即255.255.255.0。
传输层
通过物理层、数据链路层以及网络层的互相帮助,我们已经把数据成功从计算机A传送到计算机B了,可是,计算机B里面有各种各样的应用程序,计算机该如何知道这些数据是给谁的呢?
这个时候,端口(Port)这个家伙就上场了,也就是说,我们在从计算机A传数据给计算表B的时候,还得指定一个端口,以供特定的应用程序来接受处理。
也就是说,传输层的功能就是建立端口到端口的通信。相比网络层的功能是建立主机到主机的通信。
也就是说,只有有了IP和端口,我们才能进行准确着通信。这个时候可能有人会说,我输入IP地址的时候并没有指定一个端口啊。其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如http的传输默认端口是80,这些端口信息也会包含在数据包里的。
传输层最常见的两大协议是 TCP 协议和 UDP 协议,其中 TCP 协议与 UDP 最大的不同就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输。
应用层
虽然我们收到了传输层传来的数据,可是这些传过来的数据五花八门,有html格式的,有mp4格式的,各种各样。你确定你能看的懂?
因此我们需要指定这些数据的格式规则,收到后才好解读渲染。例如我们最常见的 Http 数据包中,就会指定该数据包是 什么格式的文件了。
四、明天的计划
复习任务二中深度思考内容,学习shiro
评论