- 博客(37)
- 收藏
- 关注
原创 Java日志三十七「Spring MVC」
**Spring MVC简介**我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。那么在B/S 架构中,系统标准的三层架构包括:表现层、业务层、持久层。表现层:也就是我们常说的 web 层。它负责接收客户端请求,向客户端响应结果,通常客户端使用 http 协议请求 web 层,web 需要接收 http 请求,完成 http 响应。表现层包括展示层和控制层:控制
2020-11-25 10:52:12
181
原创 Java日志三十六「AOP通知的类型」
**Advice**AOP的advice分为五种:前置通知后置通知异常通知最终通知环绕通知先看前四种通知,直接上代码模拟一个业务层/** * 账户的业务层实现类 */public class AccountServiceImpl implements AccountService { public void saveAccount() { System.out.println("执行了保存"); }}切面public class Logg
2020-11-23 15:59:07
158
原创 Java日志三十五「AOP」
**Spring的AOP概念**在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。这样看概念可能感觉有些模糊,我举个例子。在我们操作后段数据库
2020-11-23 12:06:12
167
原创 Java日志三十四「基于注解的Ioc配置」
**基于注解的Ioc配置**上一篇大概讲了一下spring的IoC的概念和用法,这一篇我们用注解加xml的方式来简化我们的开发。首先我们使用注解的目的就是简化xml文件的书写。首先,我们先把xml文件中最重要的部分替代。就是把对象注入容器。这里有四个注解供我们使用@Controller: 一般用于表现层的注解。@Service: 一般用于业务层的注解。@Repository: 一般用于持久层的注解。@Component。这四个注解作用都是一样的,但是建议使用要有规范。使用注解配置把对象加
2020-11-22 19:45:20
100
原创 Java日志三十三「Spring入门」
**Spring**Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术。IoC的概念和作用耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少
2020-11-22 17:02:37
79
原创 Java日志三十二「Mybatis注解方式的多表查询」
**Mybatis注解方式的多表查询**我们之前通过配置xml文件的方式可以实现多表查询,现在我们也可以通过注解的方式达到一样的效果。我们还是先来看项目文件结构:与之前的xml方式多表查询很相似,只是少了UserDao.xml与AccountDao.xml两个配置文件。现在我们要通过注解的方式来实现之前的效果:UserDao://开启二级缓存@CacheNamespace(blocking = true)public interface UserDao { /** *
2020-11-08 11:13:53
143
原创 Java日志三十一「Mybatis注解的简单使用」
**Mybatis注解**注解的加入让我们的Mybatis开发简单了很多,我们直接来看项目文件,可以直接感到注解的便捷。不使用注解时(这里的QueryVo只是按照条件查询,可以忽略这个文件):使用注解时:最直观的感受就是resources包下少了UserDao.xml这个配置文件,那既然少了这个配置文件,那么我们就要用UserDao接口里面配置一些注解来达到之前的效果。下面是UserDao接口:public interface UserDao { /** * 查询所有用
2020-11-08 10:34:38
96
原创 Java日志三十「Mybatis多表查询」
**基于XML搭建的Mybatis多表查询**前两篇对Mybatis有一个大概的介绍,但是在实际操作中对数据库的查询不可能只查询一张表,往往是对多张表的查询,这一篇继续使用了前面的User表,但是关联了一个账户表。我直接把两张表粘出来这样看的直观一点。User表:account表:为了有一个清晰的结构下面是这个项目所有的文件截图:对用户的查询我们定义了一个查询所有用户的方法,查询方式与前面介绍的流程是一样的。但是因为我们现在关联了一张account表(UID是外键),所以我们希望在查询
2020-10-25 20:31:47
123
原创 Java日志二十九「Mybatis代理dao源码分析」
在上一篇我们使用mybatis框架的时候,操纵数据库的方式是通过mybatis框架解析xml文件后找到了UserDao接口对应的某一个方法,我们并没有实现这个接口,因为我们在test类中创建了一个代理对象,这篇我们就看一下这个代理对象到底是怎么操纵的数据库。我们先找到创建代理对象这一句:发现getMapper方法是SqlSession接口定义的一个抽象方法我们找实现SqlSession这个接口的实现类,发现有两个实现类我们打上断点debug启动一下,发现走的是DefaultSqlSession
2020-10-24 09:47:17
85
原创 Java日志二十八「Mybatis入门」
**Mybatis概述**简单来说mybatis就是一个持久层框架,我们可以先复习一下持久层和框架两个概念。框架是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。三层架构:表现层:是用于展示数据的业务层:是处理业务需求持久层:是和数据库交互的我之前也写了了一些关于持久层的技术,像JDBC技术,Spring的JdbcTemplate,Apache的DBUtils,但上述都不是框架。 J
2020-10-21 10:45:25
119
1
原创 Java日志二十七「Filter」
**Filter**Filter翻译为过滤器,当客户端向服务器端发送一个请求时,如果有对应的过滤器进行拦截,过滤器可以改变请求的内容、或者重新设置请求协议的相关信息等,然后再将请求发送给服务器端的Servlet进行处理。当Servlet对客户端做出响应时,过滤器同样可以进行拦截,将响应内容进行修改或者重新设置后,再响应给客户端浏览器。在上述过程中,客户端与服务器端并不需要知道过滤器的存在。下图说明了过滤器的原理:在上图,多个过滤器形成了一个过滤器链,每个过滤器执行自己的操作,直到到达Servle
2020-09-01 11:39:42
156
原创 Java日志二十六「EL表达式」
**EL表达式**EL表达式可以嵌入到jsp页面的内部,目的就是用来简化jsp页面的书写。看一下简化后的效果:jsp脚本:<%=request.getAttribute(name)%>EL表达式替代上面的脚本:${requestScope.name}下面看一下EL表达式的运算符<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>
2020-08-30 22:01:11
171
原创 Java日志二十五「Session」
**Session**上一篇说道,Session与Cookie都是会话技术。不同的是,Session是把数据保存到服务器的技术,而Cookie是把数据保存到客户端的技术。session原理:第一次获取Session时,没有Cookie,会在内存中创建一个新的Session对象,然后又一个id标示这个对象。当给客户端发送一个响应头(set-cookie)时,把这个id放到这个响应头里面,让浏览器获取。然后当浏览器访问服务器中另外一个servlet类时,会监测到这个id,保证了多次获取的sessi
2020-08-30 20:59:49
142
原创 Java日志二十四「Cookie」
**Cookie**在了解什么是Cookie前,我们现介绍一下一个概念:一次会话。一次会话:浏览器第一次给服务器资源发送请求,会话建立。直到有一方断开为止两种会话技术:客户端会话技术(Cookie)服务器会话技术(Session)Cookie是把数据保存到客户端的技术。作用:1.用于存储少量不敏感的数据2.在用户不登陆的情况下,完成服务器对用户的身份识别关于Cookie的一些细节:1.可以创建多个Cookie对象发送给浏览器2.默认情况下当浏览器关闭后,Cookie数据被销毁,而
2020-08-29 21:04:06
137
原创 Java日志二十三「request对象和response对象」
Servlet作为一个服务器,最主要的任务的就是与客户端进行交互。而request对象与response对象可以传递客户端与服务器的交互信息,实现交互功能。交互过程:1.tomcat会根据请求url中的资源路径创建对应的servlet实现类的对象2.tomcat会创建request对象与response对象,request对象中封装请求消息3.tomcat将request对象与response对象传递给service方法,并调用service方法4.程序员通过request对象获取请求消息数据,通
2020-08-28 22:31:10
271
原创 Java日志二十二「Servlet」
**Servlet**Servlet全称Java Servlet,是用Java编写的服务器端程序。当客户端(一般是浏览器)向服务器请求数据时,Servlet可以生成动态的Web内容发送给客户端。从现实上讲,servlet 可以响应任何类型的请求,但是绝大多数情况下Servlet只用于来扩展基于THHP协议的Web服务器。下面我们继承Servlet接口(Java已经定义好的)来写一个简单的Servlet:@WebServlet("/demo1")public class Servlet_pract
2020-08-28 10:58:31
333
原创 Java日志二十一「Druid连接池与JDBCTemplate」
**Druid连接池**数据库连接池的作用与之前说的线程池作用大同小异,都是为了提高查询效率,减少资源消耗。druid连接池是目前最好的数据库连接池技术,由阿里巴巴提供,这篇文章只是对Druid的使用做一个简单的介绍,想要深入研究Druid的朋友可以去看看其他大佬的文章。Druid使用步骤:1.导入jar包2.定义配置文件(任意名称)3.加载配置文件4.获取数据库连接池对象(DruidDataSourceFactory)5.获取连接配置文件:driverClassName=com.m
2020-08-26 14:35:11
305
原创 Java日志二十「PreparedStatement对象和一个简单的工具类」
在这篇正片开始前我先把数据库的事物操作简单说一下,(主要是为了引出做后一种没有介绍的JDBC对象与一个简单的JDBC工具类):大家肯定发现了每次连接数据库执行一些操作的都有很多重复的操作,我们可以自己定义一个工具类来完成这些重复的操作。我们先把一些必要的数据写道一个配置文件中url=jdbc:mysql:///Practice_affairuser=rootpassword=000222abcdriver=com.mysql.cj.jdbc.Driver工具类public class JD
2020-08-26 11:25:10
191
原创 Java日志十九「JDBC」
**JDBC**JDBC的全称呼为java database connectivity,是sun公司指定的java的数据库连接技术的简称。这篇日志我用的是mySQL数据库做的案例。我们先来看java连接数据库的步骤:1.导入驱动jar包2.注册驱动3.获取数据库连接对象4.定义sql5.获取执行sql语句的对象6.执行sql,接受返回结果7.处理结果8.释放资源这里先来一段代码来演示一下,后面对各个对象进行详解(jar包我已经导入了,从第二步开始)。 public static
2020-08-23 23:18:08
105
原创 Java日志十八「反射与两个简单的框架」
**反射**在介绍反射之前,我先简单说一下Java代码的三个阶段与一些必要的概念。Java代码的三个阶段:1.Source源代码阶段(此时的代码还没有进入内存)2.Class类对象阶段(通过类加载器把class文件加载入内存,此时会封装类的各个组成部分)3.Runtime运行时阶段(创建对象)框架:半成品的软件。在框架的基础上进行软件开发,简化编码反射:框架设计的灵魂,将类的各个组成部分封装为其他对象(在内存中封装)所有的成员变量封装为Field[] fields所有的构造方法封装为C
2020-08-18 21:30:27
142
1
原创 Java日志十七「注解」
**注解**我们在一开始写代码的时候,就会在复杂的代码前加上注释,这是为了方便我们阅读。而注解是为了方便计算机阅读,也就是说注解是给电脑看的**注解也叫元数据,是一种代码级别的说明。**是JDK1.5以后版本引入的一个特性,与类,接口,枚举在同一个层次分明。可以声明在包,类,字段,方法,局部变量,方法参数等的前面。注解的作用:1.编译检查:通过代码里标识的注解让编译器进行基本的编译检查2.代码分析:通过代码里标识的注解对代码进行分析3.编写文档:通过代码里标识的注解生成文档下面我们看一些J
2020-08-15 14:29:12
138
原创 Java日志十六「JUnit测试」
**JUnit测试**我们在写完代码后,总要检验代码的准确性质。之前我们都是在main方法中执行测试,非常的不方便且繁琐。现在我们要使用JUnit(一种白盒测试方法)来检测代码的正确性。Juint的使用:1.定义一个测试类2.定义一个测试方法(最好空参,返回类型是void)3.给方法加上@Test注解(这是为了让方法可以独立运行)测试类:public class Calculator { public int add(int a,int b) { return a+b;
2020-08-15 13:14:36
150
原创 Java日志十五「Stream」
**Stream**前面写了那么多关于I/O流的操作,我们不妨想一下,既然可以把数据变成‘流’的形式输入输出,那么我们可不可以直接把所要做的操作(当然包括输入输出)都变成流的形式呢?Stream接口实现了这样的想法。Stream属于管道流,只能被使用一次,一个stream流使用完数据就流到下一个stream上,前一个流就关闭了。这样说可能比较抽象,我们直接看一下使用stream和不使用stream的区别。现在有一个存储了一些人名的集合,要想把集合里面姓张的并且三个字的姓名筛选出来,先是我们已经知
2020-08-14 10:06:51
191
原创 Java日志十四「方法引用」
**方法引用**方法引用优化Lambda表达式,如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么可以通过双冒号来引用该方法作为Lambda表达式的替代者。这样可能比较抽象,我们直接看一个例子我们先定义一个函数式接口@FunctionalInterfacepublic interface Myinterface { public void print(String s);}一个方法,函数式接口作为参数public static void printSome(Myinte
2020-08-12 23:18:43
100
原创 Java日志十三「函数式接口」
**函数式接口**我们在使用lambda表达式的时候,有一个要求,就是接口中只有一个抽象方法。函数式接口就是指有且仅有一个抽象方法的接口函数式接口的作用就是用来简化编程模型函数式接口的使用:作为方法的参数或者返回值我们先定义一个函数式接口(也可以有其他非抽象的方法)//FunctionalInterface是一个注解,检测这是不是一个函数式接口@FunctionalInterfacepublic interface MyInterface { public abstract void
2020-08-12 21:57:42
155
原创 Java日志十二「I/O流」
上次简单介绍了一下关于文件读写的操作,今天把I/O流补全。**缓冲流**与文件流不同的是,文件流的读入读出是一个字节或字符来进行的,效率低且速度慢。缓冲流提供了一个缓冲区(数组),一次性搬运数据,效率高速度快下面是缓冲流的继承关系:BufferedOutputStream继承了OutputStreamBufferedInputStream继承了InputStreamBufferedWriter继承了WriterBufferedReader继承了Reader关于缓冲流的使用与文件流非常相
2020-08-10 13:17:23
95
原创 Java日志十一「I/O流」
**I/O流**所谓的I/O流就是在 java中,字节或者字符以流的方式输入和输出。I对应了input,O对应了output。Java中把字节与字符的输入和输出分成四个大类(一个字符=两个字节=16个二进制位)。字节的顶级父类:InputStream(所有输入字节流的父类),共性的方法包括read,close。 FileInputStream就是InputStream的一个子类。OutputStream (所有输出字节流的父类),共性的方法包括write,close,flush。FileOutp
2020-08-05 11:03:46
148
1
原创 Java日志十「File」
**File**这篇日志写了Java中File类的创建,常用方法以及FileFilter的使用。想要通过代码创建文件以及对文件操作,首先要知道文件的路径是什么,以我的电脑为例,看一下我桌面一个html文件的路径:/Users/dudududu/Desktop/ttt.html。这个路径除了包含了我们熟悉目录名称外,还包含了文件名称分隔符(/),而不同的OS有不同的文件名称分隔符,幸好我们可以用一个File类的静态方法查看此OS下的文件分隔符 //separator静态方法 String sep
2020-08-01 00:05:02
107
原创 Java日志九「线程之间的通讯」
**线程间通讯**一般来说,在一个应用程序中,一个线程往往不是孤立存在的,常常需要与其他线程通信,以执行特定的任务。Java通过等待通知机制实现了进程之间的通讯,有两点注意事项:1.必须保证等待和唤醒线程只能有一个在执行(我们可以使用同步代码块来保证这一点)2. 锁对象必须保持唯一我们来看一下代码的实现:具体的流程为:创建一个顾客线程:告知老板线程需要什么,然后调用wait方法,放弃cpu的执行。创建一个老板线程:准备好后调用notify方法唤醒顾客线程。public static v
2020-07-31 22:49:05
89
原创 Java日志八「线程」
**线程**在说线程之前,有必要提一下什么是进程。进程是具有一个独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个单独单位。而线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程。进程和线程的关系:1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。2.资源分配给进程,同一进程的所
2020-07-28 10:54:07
171
原创 Java日志七「Map,异常处理」
**Map**上一篇文章主要提到了Collection集合以及它的实现类们,而Collection都是单列集合,也就是一个集合中储存的元素都是一个一个的。而Map是一个双列集合,集合中的元素是一对一对的存储的。一个元素包含两个值(一个key一个value),数据类型可以相同也可以不同。key不可以重复,value可以重复,且一个key对应一个value。Map集合有三种实现类:1.HashMap集合是Map接口的一个实现类。底层是一个哈希表,所以它是无序的2.HashTable集合也是Map接
2020-07-27 00:14:37
606
1
原创 Java日志六「Collection接口及其多种实现类」
**Collection**Collection接口定义了一个集合的抽象形式,其中包括两个子接口——List接口与Set接口。List接口的实现类包括Vector,ArrayList与LinkedList。Set接口的实现类包括TreeSet,HashSet,LinkedHashSet。我们先来关注List的接口的实现类们。ArrayList首先是ArrayList这个实现类(我们不讨论Vector是因为Vector是最早出现的java中的集合,直到现在已经被基本代替不在使用它了。ArrayL
2020-07-23 22:31:26
314
1
原创 Java日志五「内部类和Lambda表达式」
**内部类**内部类就是定义在一个类里面的类。有三种:1.成员内部类2.局部内部类3.匿名内部类我们先来看第一种成员内部类:定义一个外部类(Body)和一个成员内部类(Heart),格式如下:public class Body { public class Heart { String name="heart"; public void methodHeart() { System.out.println("heart类方法"); System.out.p
2020-07-20 23:32:01
143
1
原创 Java日志四「多态和final关键字」
**多态**多态是Java面向对象三大特征的最后一个,在第二篇日志中提到,多态是通过继承/实现来完成的。所谓的多态就是一个对象的不同的形态。举个例子,我有一只猫,它是是动物类的,同时也是猫咪类的,这就展现了它的两个形态。我们为什么要使用多态呢?下面一张图展示了多态的好处:再图上我们可以看到,多态的出现让类的使用更加的简单,更加具备面向对象的特征,即只关心调用那个对象不关心具体过程。我们来看一下多态的代码实现,首先定一个一个父类(Parent类)public class Parent {
2020-07-18 17:09:54
169
2
原创 Java日志三「抽象类和接口」
**抽象类和接口**抽象类是一个泛泛的类。举个例子,现在有一个图形,并不告诉你是什么类型的图,然后让你求这个图形的面积。由于给的范围太不具体太抽象,导致我们没办法来求出这个图形的面积。这个图形就可以成为一个抽象的类。一个图形抽象类定义如下:public abstract class Graphic { public abstract void caculateAera(double l,double w);//计算面积肯定需要两个参数 //一个抽象方法,只有函数头,因为具体怎么实现不确定}
2020-07-14 23:31:49
201
1
原创 Java日志二「继承」
**继承**上一篇提到Java是面向对象的语言,有三大特征:封装,继承,多态。所谓的封装就是不关心内部实现的具体方式。继承是多态的前提条件,这次日志更新有关于继承的知识。我们假设有两名从业者,一名医生,一名程序员。尽管他们的工作不同,但是他们都是社会上的劳动群体,两人之间总有一些相似的特征。如果我们要编写关于这两人的两个类,他们之间的许多特征要被表述为成员变量,而我们需要吧这些相似的变量重复的写两遍,是很浪费时间的事情。所以我们需要用到继承。所谓继承就是类与类之间的关系,我们可以把多者之间相似的部
2020-07-12 16:35:10
188
1
原创 Java日志一「类」
重庆西南大学软件工程大二学生,暑假开始自学Java,之前学校有相关课程但是都是基础知识。这个日志从类开始更新,如有错误的地方还希望各位大佬指正。**类**
2020-07-11 00:02:16
178
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人