- 博客(18)
- 收藏
- 关注
原创 动态SQL
MyBatis提供强大的动态SQL功能,通过简单XML元素即可灵活组装SQL语句。主要元素包括:if用于单条件判断;choose/when/otherwise实现多条件分支;where/set/trim解决SQL拼接问题,自动处理关键字和多余字符;foreach支持集合遍历,常用于IN查询。相比Hibernate的全字段更新,MyBatis的动态SQL更高效,减少网络传输。这些元素组合使用可以构建各种复杂查询条件,避免手动拼接SQL的繁琐,同时保持SQL的可读性和维护性。
2025-06-11 14:44:04
551
原创 sql的#{}和${}的区别
MyBatis中${}和#{}的区别: ${}是直接替换SQL中的参数,可能引发SQL注入风险,适合需要原样插入的场景;#{}则采用预编译机制,会自动处理字符串引号,更加安全。例如${value}会直接替换,而#{value}会转为预编译参数。实际开发中应优先使用#{}以防注入,仅在需要动态表名等特殊场景使用${}。
2025-06-11 13:29:16
187
原创 动态代理JDK和CGLIB
文章摘要:动态代理通过生成代理对象控制对真实对象的访问,分为JDK和CGLIB两种实现方式。JDK动态代理需基于接口,通过InvocationHandler的invoke方法实现代理逻辑;CGLIB动态代理则通过继承目标类实现,适用于无接口场景。两者核心区别在于JDK依赖接口而CGLIB直接操作类,使用时需注意目标类是否为final(CGLIB要求非final)。动态代理实现了业务逻辑与横切关注点的分离,是AOP编程的重要基础技术。
2025-05-24 19:15:04
578
1
原创 AOP面向切面编程
2)在类中定义方法,方法就是切面要执行的功能代码,在方法的上面加入aspectj注解中的通知注解,例如@Before,有需要指定切入点表达式。aop就是动态代理的规范化,把动态代理的实现步骤,方式都定义好了,让开发人员用一种统一的方法,就用动态代理。2.创建InvocationHandle接口的实现类,在这个类的实现给目标方法增强功能。使用aop:目的是给已经存在的一些类和方法,增加额外的功能。2.使用注解,我们在项目中要做的aop功能,一般都使用注解。Aspect:切面,给你的目标类增加的功能就是切面。
2025-04-24 21:34:00
607
原创 Spring
spring:出现在2002年左右,主要是为了解决企业级开发难度,减轻对项目模块之间的管理,类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系spring核心技术 ioc aop。能实现模块之间,类之间的解耦合。DI:依赖注入,只需要在程序中提供要使用的对象的名称,关于这个对象在容器中如何创建、赋值,查找都是由容器内部实现。spring是使用的di实现ioc的功能,spring底层创建对象,使用的是反射机制。3.在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置。
2025-04-22 17:53:48
774
原创 牛客butterfly
我们可以预处理出来左下,右下,向下的子符串最大延伸长度。a[i][j]为(i,j)向右下延伸的最长距离。c[i][j]为(i,j)向左下延伸的最长距离。根据题意我们能知道:这道题直接做是不太好做的。b[i][j]为(i,j)向下延伸的最长距离。
2023-10-10 11:22:24
102
2
原创 Fancy Signal Translate
举例来说:比如i=3,2的i次方为8,就是位数为3的八种字符串,000,001,011,010,100,101,110,111.如果个数小于8,说明有没有出现过的01串。这道题其实就是求组成01字符串,最短的并且不是给出的01字符串的子串的长度。比如说:10010,如果使11就没有重复的 但是00,01,10就是重复.2如果长度为i的子串个数小于2的i次方,说明可行。1<<i位运算,1左移i为,其实就是计算2的i次方。1.可以用set容器存储子串。
2023-10-09 23:13:36
89
1
原创 CCC单词搜索
这道题其实就是枚举,对于八个方向的枚举,但是每一步还要考虑转弯不转弯的情况。转弯情况:一个单词最多6个,不转弯一种情况,转弯(6-1)*2个情况。当i=0的时候,第三位不变,等于1的时候第三位异或运算。时间复杂度:100*100*8*(5*2+1)数量级为1e6 不超过1e8 不会TLE。遍历起点:R*C=100*100。八个方向就可以用偏移量来表示。
2023-09-28 22:15:07
98
1
原创 小明打联盟(背包dp问题)
题目要求我们算出T时间内打出的最高伤害,等于完全背包问题(每个物体有无数个 可以放多个相同的物体)再进一步优化f[j]=max(f[j],f[j-v[i]]+w[i]);重点:集合划分:第i个元素选择几个。我认为最重要的还是集合划分。由此可以知道k循环可以不要。具体可以看看另外一篇博客。这道题是动态规划问题。
2023-09-04 19:14:20
123
1
原创 快乐子数组(二重前缀和+单调栈)
这里可以列出一个式子:w[i+1](j-(i+1))+w[i+2](j-(i+2))....+w[j-1](j-(j-1)) 这个地方边界就是j-1所以到j-(j-1)就结束。设A为前缀和, 即找到第一个比A[i]小的数A[k], 这样从i+1到k-1之间的数就是一个快乐连续子数组。第一个式子减去上面这个式子得到:相差(A[j-1]-A[i])*(n-j);假设j是快乐子数组的右端点 i是左端点 那么A[j]-A[i-1]>=0;
2023-08-30 19:44:10
86
1
原创 贪心算法部分区间题目详解
2.从前往后处理每一个区间:如果现在要处理的区间的左端点大于当前组最后边的右端点,就可以直接加进去;如果现在要处理的区间的左端点小于当前组最后边的右端点,就重新开一个组;根据题意:如果两个没有相交的部分就放在一组。1.我们先把区间按左端点把所有区间排好队。注:为什么不能右端点。
2023-07-22 23:14:40
88
1
原创 状态压缩DP
(简称状压DP)也是一种很特殊的 DP 算法,其精髓就是将所有物品的状态(一般是选或不选,用01表示,当然也有特殊情况)压缩成一个整数,进行状态的转移并节约空间。所以状态表示f[i][j]:表示已经将前 i -1 列摆好,且从第i − 1 列,伸出到第 i 列的状态是 j 的所有方案。假如i-2列和i-1列放的小方块和i-1和i列放的有重复的地方(如图中红绿相交的情况)就会产生冲突!我们可以来分析一下i-2和i-1与i-1和i列的状态转换关系;核心:我们的方案数==横着放的小方块数量。
2023-07-17 20:19:14
121
1
原创 动态规划——线性DP(部分)
状态表示:f[i]表示从第一个数字开始算,以w[i]结尾的最大的上升序列。所以f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);step1:状态表示,这里我们用二维来表示 f[i][j] :a[i],b[j]的公共子序列的全部集合;根据题干我们可以先把你要求到(i,j)这个点的最大值的左上和右上的最大值求出来再加这个终点的值。状态计算(集合划分):j∈(0,1,2,..,i-1), 在a[i] > a[j]时,注意:f[i-1][j-1]+a[i][j]
2023-07-16 21:52:36
121
1
原创 背包问题(四类)
第一部分选了第i个元素:其实就是在i-1个里面选择体积不超过j-v[i]的最优解再加上第i个元素的价值,由此得到公式:f[i][j]=f[i-1][j-v[i]]+w[i];第二部分: 不选第i个就是在i-1个里面选择不超过j的最优选,由此得到公式发f[i][j]=f[i-1][j];最后得到公式:f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);2.集合划分:这道题我们可以把大的集合划分为两个部分:(1)选择第i个元素(2)不选择第i个元素。
2023-07-15 19:35:20
225
1
原创 最大公约数
若d是(b,a%b)的公约数 则知 d|b 且 d|a-k*b 则 d|a-k*b+k*b = d|a 故而d同时整除a和b 所以d也是(a,b)的公约数。若d是(a,b)的公约数 则知 d|a 且 d|b 则易知 d|a-k*b 故d也是(b,a%b) 的公约数。因此(a,b)的公约数集合和(b,a%b)的公约数集合相同 所以他们的最大公约数也相同 证毕#设a%b = a - k*b 其中k = a/b(向下取整)则有 gcd(a,b) = gcd(b,a%b)
2023-07-12 23:25:22
63
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人