- 博客(39)
- 收藏
- 关注
原创 堆栈里的秘密行动:劫持执行流
我昏沉的脑袋一下子清醒了过来,下意识的看了一下之前那对象,现在他就在我上面不远处,已经被小P的身体覆盖掉了,再仔细一看这对象的前8个字节,指向的函数表就在我的头顶,而表中每一项都指向了我所在的地址,0xCC大人果然安排的天衣无缝。,你看线程大哥读完内容后,又去这内容指向的地方了,你再看那里有一个表格,表格里每一项都是一个函数的地址”我按他说的看过去,果如他所言,只见线程大哥读取了表格中的一项后转身就去执行那里的代码了。果不出乎所料,按照周密的计划,我终于等来了执行的机会,潜伏这么久,总算是可以活动活动了。
2025-06-30 21:56:42
613
原创 堆栈里的悄悄话——智能指针
哦,还没完呢,裸指针还有个毛病就是谁来释放的问题,因为你们裸指针就是一个地址,可以在函数之间四处传递,最后传来传去,到底谁来释放,是不是还有别的函数和线程在使用都搞不清楚了,要是不释放呢,就内存泄漏了,要是别人还在用呢,释放了又会出问题,所以怎么着都很恼火”,说完,智能指针嘴角又上扬了许多。“如果两个对象A和B,A里面有个shared_ptr指向B,B里面有个shared_ptr指向A,也就是互相引用了,这样子,你们两个shared_ptr计数器永远是1,谁也释放不了,怎么样,没辙了吧!
2025-06-30 21:56:04
715
原创 线程的Alertable与User APC
这个函数比起Sleep就多了一个参数Alertable,表示该线程是“可唤醒的”,就是说,线程虽然等待时间未到,但如果发生一些事件,线程也会及时去处理。这是因为,在XP中,进程初始化重要工作LdrInitializeThunk本身就是使用APC进行执行的,所以在PspUserThreadStartup中对UserApcPending设置为了TRUE,这样保证了初始的时候User APC能成功交付。这个成员会在什么时候被赋值呢?也就是说,正常情况下,用户模式的APC是不会打断用户态程序的执行流的。
2025-06-30 21:55:05
871
原创 Java集合系列(四):HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及区别
本篇博客主要讲解Map接口的4个实现类HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法以及四者之间的区别。注意:本文中代码使用的JDK版本为1.8.0_191。
2025-06-30 21:51:13
577
原创 Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别
本篇博客主要讲解Set接口的三个实现类HashSet、LinkedHashSet、TreeSet的使用方法以及三者之间的区别。注意:本文中代码使用的JDK版本为1.8.0_191。
2025-06-30 21:50:41
604
原创 Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别
本篇博客主要讲解List接口的三个实现类ArrayList、LinkedList、Vector的使用方法以及三者之间的区别。注意:本文中代码使用的JDK版本为1.8.0_191。
2025-06-30 21:49:51
559
原创 MyBatis系列(十四):在MyBatis中使用类型处理器
假设enabled字段的值既不是枚举的字面值,也不是枚举的索引值,此时和都不能满足我们的需求,这种情况下我们就需要自己来实现类型处理器了。/*** 启用*//*** 禁用*//*** Enabled类型处理器*/@Override@Override@Override@Override。
2025-06-28 20:45:00
792
原创 MyBatis系列(十二):使用collection标签实现嵌套查询
使用collection标签实现嵌套查询,用到的属性总结如下:1)select:另一个映射查询的id,MyBatis会额外执行这个查询获取嵌套对象的结果。2)column:将主查询中列的结果作为嵌套查询的参数,配置方式如column="{prop1=col1,prop2=col2}",prop1和prop2将作为嵌套查询的参数。3)fetchType:数据加载方式,可选值为lazy和eager,分别为延迟加载和积极加载。
2025-06-28 20:15:00
1469
原创 MyBatis系列(十一):MyBatis高级结果映射之一对多映射
本篇博客主要讲解MyBatis中如何使用collection标签实现查询结果一对多映射。
2025-06-28 20:00:00
654
原创 MyBatis系列(十):使用association标签实现嵌套查询
使用association标签实现嵌套查询,用到的属性总结如下:1)select:另一个映射查询的id,MyBatis会额外执行这个查询获取嵌套对象的结果。2)column:将主查询中列的结果作为嵌套查询的参数,配置方式如column="{prop1=col1,prop2=col2}",prop1和prop2将作为嵌套查询的参数。3)fetchType:数据加载方式,可选值为lazy和eager,分别为延迟加载和积极加载。
2025-06-27 21:51:09
729
原创 MyBatis系列(九):MyBatis高级结果映射之一对一映射
这样的格式,其中sysRole要和SysUserExtend类中的字段名保持一致,id要和SysRole类中的字段名保持一致。这里要注意两点,第一点是这里的resultType,要设置成刚刚新建的SysUserExtend类,第二点是列的别名要设置成。然后就会想,我们刚刚定义的userRoleMap,前半部分和这个配置都是一样的,能复用这个sysUserMap的配置吗?答案当然是可以,MyBatis是支持resultMap映射继承的。由于测试代码和输出日志都和1中的几乎一致,所以这里不再列出。
2025-06-27 21:50:23
997
原创 MyBatis系列(八):MyBatis动态Sql之foreach标签的用法
上面的例子中只有一个集合参数,我们把collection属性的值设置为了list,其实也可以写成collection,为什么呢?假设有这样1个需求:根据传入的用户id集合查询出所有符合条件的用户,此时我们需要使用到Sql中的IN,如 id in (1,1001)。如果参数是一个数组参数,collection可以设置为默认值array,看了上面的源码,应该不难理解。
2025-06-27 21:49:42
596
原创 MyBatis系列(七):MyBatis动态Sql之choose,where,set标签的用法
本篇博客主要讲解如何使用choose,where,set标签生成动态的Sql。
2025-06-27 21:47:12
1031
原创 MyBatis系列(六):MyBatis动态Sql之if标签的用法
假设有这样1个需求:根据用户的输入条件来查询用户列表,如果输入了用户名,就根据用户名模糊查询,如果输入了邮箱,就根据邮箱精确查询,如果同时输入了用户名和邮箱,就用这两个条件去匹配用户。假设有这样1个需求:往数据库表中插入数据的时候,如果某一列的参数值不为空,就使用传入的值,如果传入的参数值为空,就使用数据库中的默认值(通常是空),而不使用传入的空值。4)当有多个判断条件时,使用and或or进行连接,嵌套的判断可以使用小括号分组,and相当于Java中的与(&&),or相关于Java中的或(||)。
2025-06-27 21:46:25
1055
原创 MyBatis系列(五):MyBatis 注解方式的基本用法
答案当然是否定的,不过在MyBatis 3.3.0及以前的版本中,注解定义的@Results不能共用,需要在每一个方法上都写一遍。也许有人会问,我在xml中,为resultMap设置了一个id,这样我就能复用该resultMap了,在注解方式中,支持吗?看过之前几篇博客的读者可能知道,我们的MyBatis 刚好使用的是3.3.0版本,所以刚好不支持设置id属性,哈哈。before = true相当于XML中的order="BEFORE",这是Oracle数据库的配置。使用注解方式该如何实现呢?
2025-06-27 21:45:41
578
原创 MyBatis系列(四):MyBatis XML方式的基本用法之增删改
在1.1的例子中,新增完数据,我们并没有拿到数据库中自增的id值,但有些场景中,我们需要先拿到数据库中自增的值,然后再处理其余的逻辑,那么如何拿到数据库中的自增的id值呢?1)为了防止类型错误,对于一些特殊的数据类型,建议指定具体的jdbcType值。通过上面的测试,说明数据库的datetime类型可以存储DATE(时间部分默认为00:00:00)和TIMESTAMP这两种类型的时间,不能存储TIME类型的时间。报错的原因是,数据库中的字段类型为datetime,但是这里只有time部分的值。
2025-06-27 21:45:02
866
原创 MyBatis系列(三):MyBatis XML方式的基本用法之多表查询
TRACE [main] - <== Row: 1, 管理员, 1, 1, 2019-06-27 18:21:12.0, admin, admin@mybatis.tk。但有些场景下,比如只有2个参数,没有必要为这2个参数再新建一个对象,比如我们现在需要根据用户的id和角色的状态来获取用户的所有角色,那么该如何使用呢?书中推荐的是方式3,方式4是我个人认为更好的方式,因为实体类一般由工具自动生成,增加了字段后,后续容易忘记导致被覆盖掉。然后,打开对应的SysUserMapper.xml文件,添加如下代码。
2025-06-27 21:44:25
821
原创 MyBatis系列(二):MyBatis XML方式的基本用法之Select
找到src/main/java目录下的包com.zwwhnly.mybatisaction.mapper,在该包下创建XML文件对应的接口类,分别为SysUserMapper.java,SysRoleMapper.java,SysPrivilegeMapper.java,SysUserRoleMapper.java,SysRolePrivilegeMapper.java。要返回结果的类型,使用此种方式需要设置查询列的别名,别名要和resultType指定对象的属性名保持一致,
2025-06-27 21:43:36
1015
原创 MyBatis系列(一):MyBatis入门
2001年,Clinton Begin发起了一个名为iBATIS的开源项目,最初侧重于密码软件的研发,后来发展成为一款基于Java的持久层框架。 2004年,Clinton将iBATIS的名字和源码捐赠给了Apache软件基金会。 2010年,核心开发团队决定离开Apache软件基金会,并且将iBATIS改名为MyBatis。 MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。
2025-06-27 21:42:47
658
原创 Spring面试:聊聊@Autowired注解的Field injection is not recommended提示问题?
在我接触过的大部分Java项目中,经常看到使用@Autowired@Service@Autowired@Autowired在IDEA中,以上代码@Autowired注解下会显示波浪线,鼠标悬停后提示:Field injection is not recommended,翻译过来就是不建议使用字段注入。关于该提示问题,有直接修改IDEA设置关闭该提示的,有替换为使用@Resource注解的,但这都不是该问题的本质。
2025-06-20 17:37:02
352
原创 Spring面试:聊聊@Autowired与@Resource的区别?
从事过很多家公司,见过很多项目,发现@Autowired和@Resource的使用都是一样的乱,一个项目中有使用@Autowired的,有使用@Resource的,甚至有的类中一会儿使用@Autowired,一会儿使用@Resource,虽然不影响业务功能的实现,但看起来真的是杂乱无章。本篇博客主要讲解这2个注解之间的区别。@Autowired和@Resource都是用来实现依赖注入的注解,但两者之间是有区别的,主要有以下4点:来源不同@Autowired是Spring框架的注解。
2025-06-20 17:36:10
354
原创 Spring RestTemplate使用方法总结!
一般情况下,请求第三方接口都需要签名、时间戳等请求头,但。使用RestTemplate发送POST请求主要有。使用RestTemplate发送GET请求主要有。2个方法,每个方法分别提供了3种不同的重载。2个方法,每个方法分别提供了3种不同的重载。
2025-06-20 17:34:25
364
原创 Spring入门(十五):使用Spring JDBC操作数据库
在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要。在Spring中,操作数据库有很多种方法,我们可以使用JDBC、Hibernate、MyBatis或者其他的数据持久化框架,本篇博客的重点是讲解下在Spring中如何通过JDBC操作数据库。
2025-06-20 17:31:58
433
原创 Spring入门(十四):Spring MVC控制器的2种测试方法
作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环境发现bug的成本要低于QA环境,QA环境发现bug的成本要低于Prod环境,Prod环境发现bug的成本最高,这也是每个研发人员最不愿意遇到但永远避不掉的现实。虽然不能完全避免,但我们可以对自己的代码进行充分的测试,降低bug出现的几率。
2025-06-20 17:31:05
946
原创 Spring入门(十三):Spring MVC常用注解讲解
在使用Spring MVC开发Web应用程序时,控制器Controller的开发非常重要,虽然说视图(JSP或者是Thymeleaf)也很重要,因为它才是直接呈现给用户的,不过由于现在前端越来越重要,很多公司都开始采用前后端分离的开发模式,所以我们暂时可以将精力放在开发控制器上。接下来,我们依次讲解每个注解的使用方法。
2025-06-19 21:50:54
904
原创 Spring入门(十二):Spring MVC使用讲解
提到MVC,参与过Web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,M全称是Model,指的是数据模型,V全称是View,指的是视图页面,如JSP、Thymeleaf等,C全称是Controller,指的是控制器,用来处理用户在客户端(浏览器)发起的请求。Spring MVC就是基于MVC模式实现,能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序。也就是说,Spring MVC是基于Spring的,它主要用来开发Web应用程序。
2025-06-19 21:50:03
579
原创 Spring入门(十一):Spring AOP使用进阶
在上篇博客中,我们了解了什么是AOP以及在Spring中如何使用AOP,本篇博客继续深入讲解下AOP的高级用法。
2025-06-19 21:49:00
922
原创 Spring入门(十):Spring AOP使用讲解
AOP是Aspect Oriented Programming的缩写,意思是:面向切面编程,它是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。可以认为AOP是对OOP(Object Oriented Programming 面向对象编程)的补充,主要使用在日志记录,性能统计,安全控制等场景,使用AOP可以使得业务逻辑各部分之间的耦合度降低,只专注于各自的业务逻辑实现,从而提高程序的可读性及维护性。
2025-06-18 20:52:51
960
原创 Spring入门(九):运行时值注入
Spring表达式语言(Spring Expression Language,SpEL)是一种非常灵活的表达式语言,能够以一种强大和简洁的方式将值装配到bean属性或者构造器参数中,在这个过程中所使用的的表达式会在运行时计算值。如果希望属性值必须存在,可以使用getRequiredProperty()方法,当属性值不存在时,会抛出。可以发现,我们在字段上添加了@Value注解,参数传的值就是属性占位符,用来获取属性文件中指定的属性值。
2025-06-18 20:51:26
718
原创 Spring入门(八):自动装配的歧义性
自动装配Java配置xml配置在这3种方式中,自动装配为我们带来了很大的便利,大大的降低了我们需要手动装配bean的代码量。不过,自动装配也不是万能的,因为仅有一个bean匹配条件时,Spring才能实现自动装配,如果出现不止1个bean匹配条件时,Spring就会不知道要装配哪个bean,抛出异常,这就是自动装配的歧义性。为了方便理解,我们举个具体的例子。@Component@OverrideSystem.out.println("蛋糕");@Component。
2025-06-18 20:50:24
788
原创 Spring入门(七):Spring Profile使用讲解
在日常的开发工作中,我们经常需要将程序部署到不同的环境,比如Dev开发环境,QA测试环境,Prod生产环境,这些环境下的一些配置肯定是不一样的,比如数据库配置,Redis配置,RabbitMQ配置。假设我们有3套环境(Dev,QA,Prod),这3套环境的数据库都使用的是mysql,但是其地址,用户名,密码都不一样,那么在Java配置中,该如何声明这些bean呢?说明:本篇博客的重点是讲解@Profile注解的使用,数据库的操作只是辅助理解@Profile,因此不会讲解的太详细,不过后续会单独写博客讲解。
2025-06-18 20:49:17
878
原创 Spring入门(六):条件化的bean
默认情况下,Spring中定义的bean在应用程序启动时会全部装配,不管当前运行的是哪个环境(Dev,QA或者Prod),也不管当前运行的是什么系统(Windows或者Linux),但有些使用场景下,我们可能需要条件化的装配某些bean,即当满足某一条件时,装配某些bean,当不满足某一条件时,就忽略掉某些bean。这个条件可以很简单,比如当某个jar包存在时,当存在某个环境变量时,也可以很复杂。为了更好的理解,我们通过具体的代码示例来理解下条件化的bean的实现方式。注解来实现条件化的bean。
2025-06-18 20:48:08
212
原创 Spring入门(五):Spring中bean的作用域
在默认情况下,Spring应用上下文中所有的bean都是以单例(singleton)的形式创建的,即不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。从运行结果也可以看出,默认情况下即Singleton类型的Bean,不管调用多少次,只会创建一个实例。为了更好的理解,我们通过具体的代码示例来理解下Singleton与ProtoType的区别。单例是默认的作用域,如果要使用其它的作用域创建bean,需要使用。上面的代码也可以写成。上面的代码也可以写成。
2025-06-17 20:57:17
298
原创 Spring入门(四):使用Maven管理Spring项目
Apache Maven是一个软件项目管理工具。基于项目对象模型(Project Object Model,POM)的概念,Maven可用来管理项目的依赖、编译、文档等信息。使用Maven管理项目时,项目依赖的jar包将不再包含在项目内,默认情况下集中放置在用户目录下的.m2文件夹下,不过这个路径可以自定义成自己喜欢的目录。
2025-06-17 20:56:22
821
原创 Spring入门(三):通过JavaConfig装配bean
上一篇博客中,我们讲解了使用组件扫描和自动装配实现自动化装配bean,这也是最好的使用方式。但是某些场景下,我们可能无法使用自动装配的功能,此时就不得不显式的配置bean。比如我们引用了一个第三方类库,需要将类库中的某个类装配到项目中,我们不可能在该类上添加@Component注解,因此无法使用自动装配的功能。本篇博客主要讲解通过JavaConfig配置bean的实现方法,通过xml配置bean的实现方法后续再单独写一篇博客。我们还使用上一篇博客中的例子,不过代码会做适当修改。
2025-06-17 20:54:11
173
原创 Spring入门(二):自动化装配bean
关于CD和CD播放器关系的解释:如果你不将CD插入(注入)到CD播放器中,那么CD播放器其实是没有太大用处的。所以,可以这样说,CD播放器依赖于CD才能完成它的使命。
2025-06-17 20:53:14
603
原创 Spring入门(一):创建Spring项目
本篇博客作为Spring入门系列的第一篇博客,不会讲解什么是Spring以及Spring的发展史这些太理论的东西,主要讲解下如何使用IntelliJ IDEA创建Spring项目以及通过一个示例了解下Spring的简单使用。
2025-06-17 20:51:21
637
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人