
Java基础
文章平均质量分 72
is_Peng
编程就是将自己的思维赋予计算机
展开
-
代理设计模式(静态代理、JDK动态代理、Cglib动态代理)
代理设计模式是一种常用的设计模式,属于结构型模式的一种。代理对象通过持有真实对象来达到访问真实对象的功能,从而保护真实对象,并且可以扩展真实对象的功能。代理设计模式一般有三种:静态代理、JDK动态代理和Cglib动态代理。静态代理静态代理中,真实对象和代理对象需要实现同一个接口。接口类:package com.test.staticproxy;public interface FunctionInterface { void function();}真实对象类:package com.原创 2020-10-10 21:33:16 · 268 阅读 · 0 评论 -
Spring AOP Aspectj实现
Spring AOP 已经集成了 AspectJ,使用AspectJ实现时,不需要让自定义的通知类实现特定接口,需要在配置<aop:config>标签的时候使用<aop:aspect>标签配置切面,引用通知提供类。我们先自定义一个定义了所需的通知方法的通知提供类。package com.test.advice;import org.aspectj.lang.ProceedingJoinPoint;public class MyAdvice { public void原创 2020-10-09 15:31:04 · 268 阅读 · 0 评论 -
Spring AOP面向切面编程
AOP是Aspect Oriented Programming的简称,中文一般叫做面向切面编程,是通过实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。以往我们正常编写程序和执行程序的时候一般都是纵向的,即程序从上往下执行,例如:例如上面的Demo,我们创建一个Demo类对象,然后调用它的三个方法,这三个方法依次执行。而AOP则是需要在不改变原有代码的情况下,可以在拓展程序的功能,例如我们可以在function2调用的前后增加其他功能形成一个“横切面”。在AOP中,function原创 2020-10-08 23:30:17 · 402 阅读 · 0 评论 -
Spring整合MyBatis和web
导包Spring整合MyBatis除了导入Spring核心包外,还需要导入MyBatis所需要的所有包和MyBatis整合包。整合MyBatisSpring整合MyBatis主要是要简化MyBatis,提高开发效率,这就需要将原本需要程序员手动配置和编写的部分交由Spring管理。配置数据库变量首先,使用MyBatis需要先编写mybatis.xml全局配置文件,在全局配置文件中最主要的是需要配置数据库变量。在Spring整合jdbc的jar包中有一个叫DriverManagerDataSour原创 2020-09-29 10:42:05 · 378 阅读 · 0 评论 -
Spring简单使用
Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。Spring Core: 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。Spring Aspects : 该模块为与AspectJ的集成提供支持。Spring AOP :提供了面向切面的编程实现。Spring JDBC : Java数原创 2020-09-27 17:18:49 · 635 阅读 · 0 评论 -
MyBatis多表查询
使用mybatis访问数据库,将数据库表与pojo对象映射的方式有两种:Auto Mapping特性自动映射和resultMap标签手动映射。Auto Mapping特性当数据库表列名与实体类的属性名一致时可以使用自动映射。例如,数据库表结构为:实体类设计为:Sql映射文件:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"原创 2020-09-24 10:58:17 · 1050 阅读 · 0 评论 -
OpenSessionInView
在实际的业务开发中,访问数据库的操作肯定是很频繁的,意味我们可以将数据库访问的相关代码进行封装调用,减少代码冗余。使用ThreadLocal存储SqlSession使用MyBatis访问数据库,生成SqlSession的部分是通用的流程,我们可以对其进行封装,将其封装成MyBatisUtil类,对外提供获取SqlSession和关闭SqlSession的方法。package com.test.util;import java.io.IOException;import java.io.Input原创 2020-09-22 14:28:17 · 218 阅读 · 0 评论 -
MyBatis缓存机制
程序与数据库交互的过程也是一个比较耗费性能的的过程,所以一般都会通过缓存来减少与数据库的直接交互,提升程序的运行效率。一级缓存MyBatis中默认开启了SqlSession缓存,即同一个SqlSession对象调用同一个<select>时,只有第一次访问数据库,第一次之后把查询结果缓存到SqlSession缓存区(内存)中。缓存的是statement对象,在mybatis中一个<select>对应一个statement对象,且缓存的有效范围必须是同一个SqlSession对象。原创 2020-09-22 10:35:26 · 220 阅读 · 0 评论 -
mybatis动态sql
动态sql即可以根据条件动态地执行不同的sql语句,mybatis是通过在mapper.xml中添加逻辑判断来实现动态sql的,逻辑判断的标签主要有、、、等。if标签动态sql语句通常的表现就是判断sql语句中where子句部分,例如:<select id="selByAccinAccout" resultType="log"> select * from log where 1=1 <!-- OGNL表达式,直接写key或对象的属性.不需要添加任何特字符号 -->原创 2020-09-12 12:37:00 · 311 阅读 · 0 评论 -
MyBatis接口绑定方案
MyBatis接口绑定,指的是实现创建一个接口后,把mapper.xml 由mybatis 生成接口的实现类,通过调用接口对象就可以获取mapper.xml 中编写的sql。在SSM框架中,MyBatis 和Spring 整合时使用的就是这个方案。使用接口绑定方式需要创建一个接口,接口包名需要和接口名需要与mapper.xml中<mapper>的namespace属性相同。并且接口中的方法名要和mapper.xml标签的id属性相同。同时需要在mybatis.xml中使用<package原创 2020-09-09 15:01:25 · 624 阅读 · 0 评论 -
MyBatis中parameterType属性及参数传递
Mybatis中mapper文件中的sql语句映射是可以传递参数的,在<select>等标签中的parameter属性可以声明参数的类型,可以是基本数据类型,也可以是集合类型,还可以是pojo对象。例如:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-原创 2020-09-09 11:40:55 · 1729 阅读 · 0 评论 -
MyBatis配置log实现
Log4j是由Apache推出的开源免费日志处理的类库。可以在全局配置文件mybatis.xml中通过<settings>标签控制mybatis全局开关。<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">&l原创 2020-09-08 15:06:24 · 1390 阅读 · 0 评论 -
MyBatis01
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。MyBatis主要用到的基础技术是:xml解析和反射。MyBatis环境搭建1、导入jar包使用MyBatis框架需要将Mybatis的jar包和它依赖的原创 2020-08-31 18:02:03 · 176 阅读 · 0 评论 -
使用JDBC操作数据库
JDBC是Java数据库连接(Java Database Connectivity)的简称,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了查询和更新数据库数据的方法。JDBC的使用1、根据数据库不同导入相应jar包。这里用到的数据库是MySQL,版本为8.0.12,可以在MySQL官网下载对应版本的MySQL的jdbc驱动jar包,并导如的项目中。2、加载驱动。使用Class.forName()方法加载MySQL连接驱动,在使用MySQL 5及之前的数据库和数据库连接时需要原创 2020-08-29 17:40:47 · 501 阅读 · 0 评论 -
Netty应用UDP协议
UDP是用户数据报协议(User Datagram protocol)的简称,其主要作用是将网络数据封装成数据报形式,提供面向服务的简单信息传送服务。与TCP协议不同,UDP协议直接利用IP协议进行UDP数据报的传输,UDP提供的是面向无连接的、不可靠的数据报投递服务。当使用UDP协议传输信息时,用户应用程序必须负责解决数据报丢失、重复、排序,差错确认等问题。UDP协议的特点如下。(1)UDP传送数据前并不与对方建立连接,即UDP是无连接的。在传输数据前,发送方和接收方相互交换信息使双方同步;(2原创 2020-08-28 14:08:27 · 2000 阅读 · 2 评论 -
Netty应用WebSocket协议
WebSocket是HTML5开始提供的一种浏览器与服务器之间进行全双工通信的网络技术。在WebSocketAPI中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道,两者就可以直接互相传送数据了。WebSocket基于TCP双向全双工进行消息传递,在同一时刻,既可以发送消息,也可以接收消息,相比于HTTP的半双工协议,性能得到很大提升。与WebSocket相比,HTTP协议的弊端:(1)HTTP协议为半双工协议。半双工协议指数据可以在客户端和服务端两个方向上传输,但原创 2020-08-27 19:01:01 · 528 阅读 · 3 评论 -
Netty应用HTTP协议实现文件服务器
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议(基于TCP/IP协议)。URL与URIHTTP URL是统一资源定位系统(uniform resource locator;URL)的简称,它包含了用于查找某个资源的完整信息,格式如下:http://host[“:”port][abs_path]abs_path指定请求资源的URI,URI(统一资源标识符,Uni原创 2020-08-24 17:04:21 · 399 阅读 · 0 评论 -
Netty解决TCP粘包拆包问题
什么是TCP粘包/拆包TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是基于字节流传输的,就像河流一样,数据“流”式传输,数据中间没有分界。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以一个完整的数据包可能会拆分成多个包传输,或者多个数据包可能会合并成一个包传输,这就是所谓的TCP的粘包/拆包问题。如下图所示:正常业务逻辑上,Client需要向Server发送D1和D2两个数据包(如上图第一种情况);但实际在TCP传输的过程中,可能会将D原创 2020-08-19 11:02:04 · 537 阅读 · 0 评论 -
使用Netty实现服务端与客户端之间的通信
Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocolservers & clients.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Netty官网上是如上定义Netty的。Netty利用了Java的高级网络能力,提供了一个比JDK.原创 2020-08-12 11:40:35 · 2656 阅读 · 1 评论 -
BIO、NIO和 AIO总结和对比
Java 中的 BIO、NIO和 AIO 可以理解为是 Java 语言对操作系统的各种 IO 模型的封装。UNIX网络编程模型操作系统中最典型的要数UNIX系统的网络编程模型了,UNIX提供了五种I/O模型,分别如下:阻塞I/O模型:最基础、也最常用的I/O就是阻塞I/O模型了,在通常情况下,对文件的操作都是阻塞的。在UNIX套接字编程中,在进程空间中调用recvfrom函数(经socket接收数据),只有数据包到达且被复制到应用进程的缓存区中或者发生错误时才返回,在此期间程序将一直等待,进程在它调原创 2020-06-27 19:21:00 · 335 阅读 · 0 评论 -
AIO网络通信编程
Java4中开始的NIO虽然提供了非阻塞的IO方法,但是IO操作还是同步的,即业务线程必须等到IO操作准备好再进行其他操作。在 Java 7 中又引入了 NIO 的改进版 NIO 2.0,NIO 2.0 的异步套接字通道是真正的异步非阻塞I/O,它对应UNIX网络编程中的事件驱动I/O(AIO),它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO...原创 2020-04-20 16:41:07 · 250 阅读 · 0 评论 -
NIO网络通信编程
前面学习到了伪异步I/O通信框架采用了线程池实现,因此避免了为每个请求都创建一个独立线程造成的线程资源耗尽问题。但是由于它底层的通信依然采用同步阻塞模型,因此无法从根本上解决问题。伪异步I/O弊端分析Socket和ServerSocket都是字节流传输数据,需要使用到输入输出流,而输入输出流的read和write方法都是阻塞式的。从JDK中可以看到,在输入数据可用、检测到流末尾或者抛出异常前...原创 2020-02-19 13:45:57 · 319 阅读 · 0 评论 -
服务器socket线程池实现异步处理请求
之前我们写的服务器Socket示例demo,都是只能接收单次请求,一般服务器肯定是需要持续提供服务的,我们可以对demo进行一些改造。服务器Socket持续同步接收请求为了让服务器Socket能够持续接收请求,我们可以利用while循环。例如:import java.io.IOException;import java.io.InputStream;import java.net.Se...原创 2020-02-10 14:31:39 · 701 阅读 · 0 评论 -
Java Socket实现文件上传(发送)
Socket套接字是网络通信中的基本操作单元,我们不仅可以Socket发送和接收字符串,还可以通过输入输出流进行文件的上传或发送。TCP协议实现文件上传(发送)TCP协议实现文件上传,即使用ServerSocket和Socket进行文件的上传和接收。在发送端(客户端)我们需要通过输入流读取需要上传的文件的字节流,再通过socket的输出流将字节数据源源不断地发送出去。例如:import ...原创 2020-02-09 20:17:05 · 1989 阅读 · 2 评论 -
Java网络编程:Socket基础
Java拥有强大的网络编程能力,JDK中对网络编程提供的API也大大地降低了开发者进行网络编程地难度。计算机网络模型在讲Java网络编程之前,我们需要复习一下计算机网络的一些基础知识。网络模型一般是指OSI七层参考模型和TCP/IP五层参考模型。这两个模型在网络中应用最为广泛。OSI参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或...原创 2020-02-09 14:12:07 · 925 阅读 · 0 评论 -
字节、字符和编码
字节(Byte):一个字节占8位(bit),在计算机和网络中是通过二进制字节传递信息的;字符(character):字符是人所能读写的最小单位,例如汉字“我”、字母“A”、符合“+”等,计算机所能支持的字符组成的集合,就叫做字符集。编码(encode):在计算机和网络中无法直接传递字符,所以需要将字符解析为字节,个解析操作就叫做编码(encode),而相应的,将编码的字节还原成字符的操作就叫...原创 2019-12-29 20:05:12 · 866 阅读 · 0 评论 -
Java IO 写出文本文件
FileOutputStream方式文件输出流FileOutputStream是用于将数据写入 File 或 FileDescriptor 的输出流,适用于写入诸如图像数据之类的原始字节的流。其中的构造方法如下,可以在构造方法中使用append参数来指定是否是将数据写入在文件末尾。其主要方法:import java.io.File;import java.io.FileOutputS...原创 2019-12-08 14:53:03 · 427 阅读 · 0 评论 -
Java IO读取文本文件
FileInputStream方式import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class Test { public static void main(String[] args) { // TODO Auto-generated method stub ...原创 2019-12-05 22:35:56 · 464 阅读 · 0 评论 -
Java IO流概述
IO:即输入输出,是指在计算机上输入输出数据的操作系统、程序或设备,在Java中则是表示我们的Java程序与“外界”数据的输入输出。流:表示任何有能力产生数据源或有能力接收数据源的对象,为数据源和目的地之间建立了一个传输通道。输入流:程序能够从中读取数据的流;输出流:程序能够向其写入数据的流;Java中的IO方式Java IO 方式有很多种,基于不同的 IO 抽象模型和交互方式,首...原创 2019-12-01 18:10:33 · 337 阅读 · 0 评论 -
JVM运行时数据区
在Java语言中,不需要程序员像使用C++那样显式地去delete/free释放内存,内存直接交给Java虚拟机(JVM)去管理。Java虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,即Java虚拟机运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。程序计数器是线程私有的一块较小的内存空间,各线程之间的计数器互不影响,独...原创 2019-11-24 20:32:51 · 207 阅读 · 0 评论 -
线程池
我们知道线程的创建与销毁需要和操作系统进行交互,这需要花费很大的系统开销。所以我们的程序中不应该频繁、无限制地创建线程,而是应该使用线程池。Java中线程池技术,允许我们事先将一定数量的线程放入线程池中,池中的线程执行使用者提交的任务,并且线程执行任务后不会销毁,而是在池中准备为下一个请求提供服务,从而达到了线程的“复用”,减少并发线程的数目。在线程池的编程模式下,任务是提交给整个线程池,而不...原创 2019-10-30 22:30:45 · 761 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock
在多线程的环境下,线程对数据的操作可以分为两大类:读和写。很显然这两种操作对数据的影响程度不同:对数据的读操作只是读取数据的值,并不会影响数据本身;而对数据的写操作需要对数据进行修改,将会涉及到数据的安全问题,会影响其他线程对数据的读、写操作。(可以参考数据库的事务锁进行理解)正因为读和写操作对数据的安全性程度要求有所差别,我们可以将读和写的同步控制分开,分别用读锁和写锁进行同步控制。前面我...原创 2019-05-09 16:00:25 · 264 阅读 · 0 评论 -
生产者-消费者模式
生产者-消费者模式是一个十分经典的多线程并发协作的模式,它是对现实生活中的生产者、消费者的一种抽象。当我们买奶茶的时候一般都是在收银台下单、取奶茶,奶茶店的收银系统会通知店员制作奶茶。在生产者-消费者模式中,主要是涉及两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据。为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据...原创 2019-06-10 15:50:18 · 290 阅读 · 0 评论 -
阻塞队列BlockingQueue
在上一篇博客中的“生产者-消费者模式”中,生产者线程和消费者线程之间的共享数据区域是我们自己实现的一个MyBlockingQueue类,其实我们可以使用java.util.concurrent包下的BlockingQueue接口。BlockingQueue接口在使用时需要制定其存储的元素的数据类型,它继承了Queue接口,因此它是一个队列,具有队列的性质。同时,在Java提供的API中有以下几种...原创 2019-06-15 20:23:04 · 217 阅读 · 0 评论 -
框架、类库和JNI理解与总结
框架(Framework)、类库(Class Library)和JNI(Java Native Interface)是Java语言中的三个不同的概念,在我们学习Java的不同阶段出现,但它们都有一个共同的特征:允许调用已封装(或编译)好的代码。框架框架是框架构建者提供的一套半成品代码,为解决问题制定了一套约束,并提供了API,在提供功能的基础上可进行扩充,一般以jar包的形式存在。框架将我...原创 2019-08-11 22:01:38 · 615 阅读 · 0 评论 -
Callable与Future
Runnable封装了一个异步运行的任务,只有一个没有参数和返回值的run方法,同时也不能抛出异常;Callable与其类似,只有一个call方法,但是它有参数和返回值,还能抛出异常,Callable可以看作是Runnable的加强版。Runnable和Callable的定义如下:从中可以看到:1、 Callable能接受一个泛型,然后在call方法中返回一个这个类型的值,例如Calla...原创 2019-09-08 17:32:15 · 274 阅读 · 0 评论 -
线程的中断
我们都知道线程被终止一般有两个原因:一是run()方法正常执行完毕而自然死亡;二是因为一个没有捕获的异常终止了run方法而异外死亡。当一个线程在正常执行完毕之前被中断是一件很可怕的事情,会出现很多意想不到的事情,比如不能归还锁而造成死锁现象,stop()方法和destroy()方法就是因此而被废弃的。在前一篇博客中,我们尝试了利用一些变量以指示目标线程应该停止运行来达到线程终止的目的。在Jav...原创 2018-11-23 17:06:42 · 1143 阅读 · 0 评论 -
字符串(一)
字符串从概念上讲,Java字符串就是Unicode字符序列。Java中没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类String,每个用双引号引起来的都是字符串都是String类的一个实例。 注意:在Java中字符只以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用它们在字符集中的编号)。注意与操作系统中的文件系统的编码区分。创建字符串在Jav...原创 2018-09-12 11:24:19 · 205 阅读 · 0 评论 -
Java中数组拷贝的几种方式
在Java中想要实现数组的拷贝,一般有五种方式:for循环、clone方法、System.arraycopy方法、Arrays.copyOf方法、Arrays.copyOfRange方法。性能比较但是这四种方式的性能还是有较大的差异的。我写了一个小程序测试了一下这五种数组拷贝方式的性能,即拷贝过程中所需的时间:import java.util.Arrays;public class T...原创 2019-04-05 14:09:03 · 721 阅读 · 1 评论 -
java.lang包下的System类
System.out.print()方法可以说是我们最熟悉的一个方法了,从我们最开始用Java写的第一个hello world程序,就用到了这个方法。public class Test { public static void main(String[] args) { System.out.print(&quot;hello world&quot;); }}System.out.print()方法的...原创 2019-03-16 17:40:22 · 1547 阅读 · 0 评论