自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 SSM整合配置

2.4 整合相关依赖:mybatis-spring、spring-web加载spring的web容器,数据库连接池druid,lombok插件,logback,log4j日志相关。mybatis:扫描mapper层组件,开启驼峰映射,包别名,分页拦截器,数据源等等,这些可以在spring的配置文件中配置。springmvc:扫描控制器组件,定义视图解析器,处理静态资源,开启注解驱动,配置视图控制器,文件上传解析器等等。spring:扫描业务层组件,开启事务注解驱动,开启aop相关。

2024-04-15 19:48:49 553

原创 springMVC理解

MVC的工作原理:用户通过前端视图页面,发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕返回到Controller,再根据请求处理的结果找到对应的视图,经过渲染数据后响应给浏览器。1.在控制层定义方法,通过注解@RequestMapping定义请求路径参数,或者按照Resuful风格,定义注解@GetMapping,@PostMapping,@DeleteMapping,@PutMapping,用法类似。

2024-04-15 17:38:26 989 1

原创 spring简介

6)切面的优先级,因为我们可能会创建多个切面,多个切面间,通知方法的执行顺序就不知道了,这样可以使用@Order注解,里面的value属性定义一个int类型的数字,数字越小,默认优先级越高,也就会优先执行该切面类的通知方法。4)定义了aop,就不能直接访问目标对象了,必须通过代理对象执行目标对象的方法,因为是动态代理,不知道具体代理对象的类型,但知道,代理对象一定实现了和目标对象一样的接口或父类,所以获取父类接口,然后再执行方法即可。10就是字面量,a是变量,代指10。通过有参构造为bean对象赋值;

2024-04-02 15:32:00 994

原创 Pagehelper分页插件

pagehelper是一款简化分页代码开发的插件,免去了分页操作,以往的分页查询,都要知道,分页的页数,每页显示的条数,而在插件中,你只需通过pageHelper的startPage方法即可配置这两个参数,接下来就可以调用mapper接口,调用正常的sql语句进行查询即可,查询后获得的注意是一个集合类型,我们需要手动转换成该插件中自带的page类型的封装类。通过该page类的bean对象,就可以获取分页的总记录数total,数据列表result,然后返回即可。也可以获取分页的相关数据。

2024-03-27 15:45:23 214

原创 MyBatisPlus理解

2.把项目中的mapper接口继承mp提供的父接口BaseMapper,因为这个接口中封装了大量方法,只有继承了该接口,才能调用mp的方法开简化书写sql语句,但是必须注意,继承接口时一定要指定泛型为你mapper对应实体类的类型,这样,mp才知道执行crud时,操作的是哪一个实体。1.在引入了对应依赖mybatis-plus-boot-starter之后,该依赖包括了原本mybatis的依赖,所以原本的依赖完全可以删掉,之后就可以免除mybatis中,使用注解,xml定义单表查询的语句的操作。

2024-03-09 23:12:20 401

原创 AOP理解

可以这样定义一个切入点方法,这样其他通知可以不再使用execution来配置相同的切入点表达式,直接用对应的切入点方法就好,但注意这个切入点方法的访问修饰符类型,private只能在本类中使用,在外部的切面类使用,则需要更大的访问权限。AOP的底层实现就是动态代理技术,在执行原始方法前,生成一个代理方法,并对原始方法进行增强,就是把通知方法里的逻辑加入进去,最后执行的是代理后的增强方法,不同通知之间存在默认的执行顺序,环绕通知前,前置通知,返回后通知,后置通知,环绕后通知。

2024-03-07 21:18:20 404

原创 bean的管理方式

在控制器,服务层,mapper层定义的bean对象,只要用component,controller,service,mapper等注解即可定义bean对象,但第三方文件一般都是只读,不可以修改,如果想把第三方类对象交给ioc容器管理,则可以自定义一个config类,在类上添加@configuration,表示这是一个配置类,在类中定义添加了@Bean的方法,返回对应的对象交给ioc容器进行管理。在ioc容器中,bean对象默认是单例singleton的,也就是同一名称的bean只能有一个实例存在,

2024-03-07 19:35:52 422

原创 全局异常处理器

定义自定义异常类,添加@RestControllerAdvice(controller + responsebody),在类中定义方法捕获异常,这个方法上需要添加@ExceptionHandler指定捕获异常的类型。自定义全局异常处理器来处理程序运行中发生的不可预知的问题,然后封装异常信息显示给前端页面。

2024-03-06 20:57:24 385

原创 Mybatis简述

2.根据三层架构的模式,除了mapper层,还需要调用mapper层的service层和控制器controller层,在service层里定义对应的service接口,定义对应的抽象方法,然后在service接口的impl实现类中实现方法,来调用mapper的sql语句,然后进行数据的转换操作。lombok,是一个简化实体类的插件,可以自动生成pojo实体类的get,set,tostring,equals和hashcode方法,还可以生成无参,全参的构造方法,通过使用注解,免除了手动生成代码的步骤。

2024-02-29 10:13:05 699

原创 JSP原理简述

比如设置varStatus="status"后,就可以用${status.index},${status.count}获取序号,其中index获取的序号从0开始,count获取的序号从1开始。除了foreach循环,还可以使用jstl标签代替普通的for循环,step是每次遍历跳的个数,var是循环遍历。JSP动态网页技术,可以定义html,css,js等静态内容,还可以定义java代码等动态内容。注意导入坐标时,JSP的scope标签是provided,和servlet一样,否则会报错。

2024-02-09 20:22:40 400

原创 Response对象实现设置响应数据

重定向是一种资源跳转方式,类似于转发,但存在不同,转发是资源a处理了一部分,再跳转到资源b继续处理,最后响应。3.response响应字符数据。4.response响应字节数据。2.response设置重定向。1.设置响应数据功能。

2024-02-07 22:43:20 426

原创 Request

get方法获取请求数据时,因为使用的是getQueryString,并没有使用输入流,所以无法设置字节编码方式,则可以使用URL编码。Request请求转发,即再服务器内部的资源跳转方式,资源a处理一部分请求,然后跳转到资源b继续处理,处理全部完成后再返回给浏览器。因为不同的doXxx方法,获取请求参数的方式不同,实现起来需要定义不同的逻辑,比较繁琐,所以采用了一种如下通用的参数获取方式。request获取的请求数据由三部分组成:请求头,请求行,请求体。request对象就是用来获取请求数据的对象。

2024-02-02 17:21:57 365

原创 Servlet简述

通过浏览器直接输入url访问时,其实会执行doGet方法,执行doPost方法需要定义表单,表单标签中定义method为"post",action为"访问路径"Servlet是动态web资源开发技术,其实就是一个接口,将来定义Servlet实现类时,都必须实现该接口,并让web服务器运行Servlet。创建对象后,会调用Servlet的init()方法初始化对象,完成加载配置文件,创建连接等初始化的工作,整个生命周期中init方法只执行一次。访问路径的优先级:精确匹配>目录路径>扩展名路径>/*>/

2024-02-01 19:03:23 363

原创 Maven简述

Maven是用于管理和构建Java项目的工具,提供了一套标准化的项目结构,提供了一套标准化的构建流程,提供了一套依赖管理机制,通过Maven使得所有IDE构建的项目结构完全一样,让项目可以通用。Maven中的仓库(repository):本地仓库,远程仓库,中央仓库;写完配置后,会去本地仓库查看有对应jar包,没有则去中央仓库(或远程仓库)下载jar包到本地仓库。Maven的依赖管理:管理项目依赖的第三方资源(jar包或插件等等),通过坐标配置就可以引用仓库里的jar包。

2024-01-25 00:34:58 523

原创 JDBC数据库连接

定义了PreparedStatement后就不用定义Statement了,而且因为使用预编译对象获取连接时,因为传入了SQL语句,后期执行时便不需要再次传入SQL作为参数了。使用JDBC时要使用大量的API,其中有DriverManager,Connection,Statement,ResultSet,4.ResultSet结果集对象,封装了DQL查询语句的结果,因为是结果集,所以获取查询结果时,需要循环依次获取。使用步骤:导入jar包,定义配置文件,加载load配置文件,获取数据库连接池对象,获取连接。

2024-01-25 00:05:28 431

原创 索引的概述和性能分析

type:表示连接类型,性能由好到差的连接类型为:null(不使用任何表),system(访问了系统表),const(使用主键或唯一索引访问),eq_ref,ref(使用非唯一索引),range(范围查询),index,all,优化sql时尽量往前优化。select_type:表示select的类型,一般有primary(主查询,即外层查询),simple(不使用表连接或子查询),union(union中的第二个或之后的查询语句),subquery(子查询)节点中超过了4个key,就会向上分裂。

2024-01-20 17:05:34 915

原创 innoDB存储引擎

RC下:事务每一次执行快照读都会生成readview,以事务5的两次读操作为例,第一次快照读中,事务2以提交,活动事务id为3,4,5,最小事务id = 3,预分配事务id = 最大事务id +1 = 6,创建事务id = 5.第二次快照读中,事务2,事务3以提交,活动事务id = 4,5,最小事务id = 4 ,预分配事务id = 6,创建事务id =5。则按照根据版本链从最新的记录id开始匹配,可得,第一次快照读,读取的是事务2已提交的数据,第二次快照读,读取的是事务3提交的数据。

2024-01-19 00:10:12 889

原创 MySQL中锁的概述

(3)当使用范围查询时,例如查询id >= 19 会对该19记录加上行锁,还会对满足查询的下一个记录25之间加上临键锁,即锁住19-25的间隙,然后再加一个临键锁,锁住25和25之后到正无穷的间隙。例如为3加锁,这时会锁住3到7之间的间隙,即3之后第一个不满足查询需求的值,同时会把3和3之前加间隙锁,因为不知道是否会在3之前再插入一个3。行级锁,每次锁住对应的行数据,锁定的粒度最小,并发度最高,发生锁冲突的概率最低,在innoDB中应用。3.是行锁和间隙锁的结合,锁住数据的同时,锁住了间隙。

2024-01-18 22:46:58 574

原创 触发器简述

数据库是与表有关的数据库对象,在执行insert,delete,update之前或之后,触发并执行触发器中定义的sql语句集合,来保证数据的完整性等操作,目前只支持行级触发器,而不支持语句触发器。创建:创建触发器 触发器名,在对表执行sql语句之前或之后触发,定义行级触发器,begin和end中包含触发器的sql语句。修改数据触发器和前面的类似,只用稍微修改一下,用old来获取更新前的id记录。删除数据触发器:注意删除后无法用new来引用获取记录,所以只有删除前的记录。,new获取更新后的记录,便于对比。

2024-01-18 21:17:32 649

原创 存储过程介绍

之前使用的自定义局部变量只能接收一个单行单列的数据,如果定义的局部变量想要接收一个结果集,可以使用游标,游标cursor是用于存储查询结果集的数据类型,对结果集进行循环处理,使用方法包括open,fetch,close。遍历游标获取其中的记录(使用循环,可以创建局部变量来接收记录并插入到临时表中),注意使用循环遍历游标时,要注意在循环条件中加入条件处理程序,来定义循环中遇到问题时,相应的处理步骤。用户自定义变量:用户根据需求自己定义的变量,这种变量不用声明,使用时直接使用@变量名就可以,作用域为当前连接。

2024-01-18 20:59:26 340

原创 存储对象:视图

local 当往v1中插入数据时,不会检查v1的条件,当往v2插入数据时,因为v2有检查选项,会检查v2的条件,这时因为v2与v1关联,会递归到v1,但因为v1没有检查选项,所以不会检查v1的条件,如果是cascaded,v1会被认为有检查选项,要去检查v1的条件。由于对视图的操作最终会转换到对基本表的操作,所以插入数据时只需满足基本表条件即可,那么按条件查询视图时,有时候发现从视图中查询的数据和基本表中的数据不一致,所以要为视图加上检查选项,即不满足视图创建条件的数据不可插入。不是所有的视图都可以更新。

2023-12-30 11:35:23 381

原创 SQL优化

主键乱序插入时,要维护叶子节点的有序性,当插入的页不够课空间时,会再新开辟一页,然后把要插入页的50%的数据移动到新开辟页中,然后把该插入的数据插入,再重新设置链表指针,即页分裂。1.一般都是一条数据对应一个insert,当插入多个数据时会大量的进行网络连接,效率极低,所以插入数据时可以批量插入,但也不能一次插入太多。主键顺序插入时,第一个页写入满,之后写入到第二页中,以此类推,表之间通过双向链表维护。3.插入时尽量按主键顺序插入数据,主键顺序插入性能高于乱序插入。满足需求的情况下,要减少主键的长度。

2023-12-30 10:53:06 374

原创 索引的使用原则

若索引了多列,即使用了联合索引,则必须要遵守该法则,指的是查询索引的最左列必须存在,并且不跳过索引中的任何一列,若跳过了某一列,则该列后面的索引字段全部失效。11.单列索引和联合索引,存在多个查询条件时,推荐使用联合索引,创建联合索引时要考虑顺序,因为最左前缀法则的存在。6.用关键字 or 分隔的条件,若or前的列有索引,后面没有索引,则所有索引都不会被使用。9.使用覆盖索引,避免使用 select * ,查询使用了索引,并且需要返回的列。即查询的列中尽量是建立了索引的列,且需要的数据在索引列中都能找到。

2023-12-25 21:15:40 63

原创 存储引擎简介

Memory存储引擎的表数据存储在内存中,所以他的访问速度很快,且支持hash索引,但容易受到断电影响,只能将这些表作为临时表和缓存使用。存储引擎就是存储数据,建立索引,更新查询技术的实现,所以存储引擎是基于表的,而不是基于库的,所以存储类型又可称为表类型。mysql的体系结构分为4层,即连接层,服务层,引擎层(存储引擎),存储层(存储数据库的日志和数据,索引等等)MyISAM是早期mysql使用的默认存储引擎,它不支持事务,不支持外键。在innodb的存储结构中,存有表空间,段,区,页,行。

2023-12-22 11:23:08 12

原创 事务的四大特性及隔离级别

事务是一组操作的集合,是一个不可再分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么全部成功,要么全部失败。(1).数据库中默认事务是自动提交的,即autocommit,若要想手动提交事务,要如下设置。(1).脏读,即一个事务读取到另一个事务还未提交的数据,导致前后读取的数据不一致。事务的隔离级别越高,数据越安全,但相应的性能就会越低,所以要平衡二者的关系。如何解决这些引发的问题,要用到事务的隔离,根据事务的隔离级别可以分为。3.并发事务引发的问题。

2023-12-22 11:03:40 15

原创 多表查询介绍

(2).显式内连接 通过 inner join 来连接 其中 inner可以省略,在 on 后面跟上连接条件。联合查询时,不是所有查询都能合并,必须是上面查询返回的字段列表和下面查询的字段列表数量一致,且类型相同。之前的查询语句都是单表查询语句,但由于业务之间相互关联,各个表结构之间也存在着某种联系。如果不对多表查询的结果加以限制,查询的结果就有大量无效的数据,所以要消除无效的笛卡尔积。注意自连接时,必须要给表起别名,不然分不清到底查询返回的是哪一张表的字段。(1).隐式内连接 连接条件写在where中。

2023-12-22 10:45:29 304

原创 Mysql中约束概述

约束作用于表中字段上的限制,限制表中的数据,为了保证数据的完整性和有效性。外键让两张表之间建立连接,保证了数据的一致性和完整性。自动增长:auto_increment。在删除,更新操作时,可以添加以下的行为。

2023-12-17 20:19:15 316

原创 Mysql中的内置函数

内置函数大多和java中的函数功能类似。

2023-12-17 20:12:31 15

原创 DCL数据库控制语言

2023-12-16 18:13:10 9

原创 DQL数据库操作小结

select 查询 ,from 查询哪张表?where 条件是?group by 根据聚合函数排序。having 聚合后的排序条件是?order by 按什么字段排序,是升序还是降序?DQL是数据查询语言Data Query Language 查询数据库中表的记录。limit 分页,以及一页要显示多少个?

2023-12-16 17:40:38 17

原创 DDL数据库操作

3.创建数据库:create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序规则];删除表,但重新创建该表:truncate table 表名;5.修改表:alter table 表名 add 字段名 类型(长度) [ comment 注释 ] [ 约束 ];修改字段名称和字段的类型:alter table 表名 change 字段名 新字段名 新的数据类型(长度);5.使用对应的数据库:use 数据库名;

2023-12-15 17:30:50 8

原创 反射机制梳理

newInstance()可以创建一个对应类的对象,但注意必须该类有无参的构造器才能使用该方法,创建的对象实例是Object类型,可以转型后调用类方法。反射可以动态的创建和使用对象,使用灵活,但使用反射,会减缓执行速度,可以通过setAccessible方法略微加快反射的速度。当我们得到了一个类对应的class对象后,我们可以使用该对象做很多事情,比如创建类对象,调用方法,修改属性等等...getField() //得到对应类的public属性,参数为属性的名称。获取class类对象的6大方式。

2023-12-13 22:19:21 9

原创 网络编程介绍

/表示监听9999端口,前提是该端口并未被占用,否则会有异常,该serversocket可以对应多个socket,即多个客户端连接服务器。//获取本机InetAddress对象。

2023-12-12 18:03:06 12

原创 IO流基础知识

new FileOutputStream(filePath)对同一个文件的多次写入,会覆盖上一次的写入,若不想覆盖,可以使用追加append模式,即在构造器定义是,加上true;处理流(修饰器设计模式)是对一系列的数据源都能操作的流,它封装了一个节点流属性(如Reader,Writer),可以传入任意子类的节点流,来使用对应的方法。如果要读取配置文件,还要修改其中的键值对,只要使用setProperty方法即可,如果该文件没有key就是创建新的键值对,如果有,就是修改键值对。

2023-12-06 17:31:35 16

原创 集合介绍(4)

Collection工具类。

2023-11-23 17:25:31 11

原创 集合介绍(3)

HashMap底层的存储机制是一个数组和链表的组合,添加一个元素时,会先得到对应的hash值,在转化成索引值,通过对比table表索引,查看该索引下是否存有元素,如果没有,则直接加入,有元素,就再调用equals方法比较待添加元素和已存在的元素是否相等,相等,则放弃添加,返回false,不相等,则在已存在的元素之后,按链表的形式添加进去(这时链表上的元素hash值相等)。//(2) p 指向的Node 结点的 key 的equals() 和准备加入的key比较后相同。

2023-11-21 19:54:42 16

原创 集合介绍(2)

此时使用默认capacity构造器,创建的elementData为空数组,第一次扩容,会默认扩容到10,第二次之后检测要求的最小容量mincapacity是否大于实际容量elementData。若大于,则执行扩容grow方法,把数组elemenData扩容到原来的1.5倍,再用Arrays.copyof()方法保证原数据不丢失。可以存放任意类型数据,包括空值null,并且可以加入多个空值。LinkedList仍然是List接口的实现子类,可以添加任意元素,元素可以重复,可以添加null,线程不安全。

2023-11-21 18:10:56 321

原创 集合介绍(1)

Map接口下的实现类都是双列集合,有Hashtable,HashMap,TreeMap,其中HashMap是核心。Collection提供了一系列操作对象的方法,如add,remove,set,get(增删改查)Collection接口下继承了两个子接口Set和List,他们的实现子类都是单列集合。-------------------双列集合--------------------add可以添加任意类型数据,remove的参数可以为删除元素的索引值,或元素值。集合可以动态保存任意多个对象,使用方便。

2023-11-20 14:51:51 24 1

原创 日期类Date,Calendar,LocalDate

通过无参构造器Date()可以获取当前时间:Date d1 = new Date();默认输出的日期格式是国外的格式,所以可以用SimpleDateFormat来格式化输出的格式。Calender类是抽象类,构造器有2个,一般使用无参的构造器,且私有化,使用时需要getInstance()方法获取Calender实例(类似于单例设计模式)。通过now()方法获取表示当前时间戳的对象,,通过from可以把Intsant转换成Date,Calender返回月(Mouth)的时候,从0开始,所以要+1。

2023-11-20 10:52:18 33 1

原创 大数处理方案(BigInteger和BigDecimal)

BigInteger适合保存比较大的数据,比如处理很大的数据,long不够用,可以使用BigInteger搞定,在对BigInteger进行操作时,需要使用对应的方法,不能直接进行 + - * /BigDecimal适合保存精度更高的浮点型(小数),比如double不够用的情况下。其中调用divide方法可能抛出算术运算异常,可以指定精度即可。如果要对BigDecimal进行运算,也需要调用对应的方法。如果有无限循环小数,则保留分子的精度。divide方法可能会抛出算术异常。

2023-11-16 19:49:17 24 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除