- 博客(38)
- 收藏
- 关注
原创 数据库存储过程的后端调用(SQLServer)
本项目中需要生成10位验收单编号,其中前六位为年+月,后四位为表中没有的最小码。则入参:Sell_ysqk(表名),ysdbh(列名),year+month:如202410(左固定值),4(右剩余长度)。在ServiceImpl中,put后要先调用完存储过程,出参已存储至map中,此时再get出参即可获取。项目中使用到了SQL Server的存储过程,其位于可编程性-存储过程,详细如下。如果是有出参的,或者参数类型不同。其内需要四个入参,为表名,列名,左固定值,剩下右边的长度。
2024-10-29 10:12:39
747
1
原创 Vue基础明晰
无论是在主组件中亦或dialog里,都经常存在form或者table,究其本质即可-form为表单,作数据的提交(提交搜索条件、要更改的对象属性值等等),table为表格,作信息展示。要在Table展示中修改某一对象属性,即在表格中加入输入框,选择框等,需要在此列table-column的包裹中,创建一个template域,以v-slot来绑定。一个Table表格的子元素为table-column,每一项为一个表格的一列,table通过:data来绑定某一对象的集合。
2024-09-12 10:31:10
735
原创 EasyExcel 动态表头+表头合并
4.要修改的注解属性AnnotationUtils.AttrTypeEnum.STRING_ARR,即{}字符串集合形式。在deal()方法中,将自己的业务逻辑放入即可,例子中为一个多sheet页的导出方法,此处不再展示详情。 以前对EasyExcel的使用都是一个实体类字段对应一列,通过以下来一一对应即可。动态表头,下载的几月的汇总表头就要出现202x年x月销售部门员工····· 在本例中,需要在controller中如下设置。方法共五个参数,参数解释已于配置类中注释。表头合并,第一行是合并的汇总。
2024-09-09 09:21:02
2579
原创 Springboot结构明晰
Springboot+Mybatis自底向上结构明晰Mapper和Mapper.xml层:dao层,数据持久层,与数据库直接接触的层级。Mapper.xml:通过的方式指定相应mapper,查询等语句以 等包裹Mapper:是一个抽象接口,此接口使用@Mapper注解定义Mapper层。 其内声明各抽象方法,通过xml语句中的如来与SQL方法对应方法前不必写public 因其抽象接口,已是默认public必然实现。Service和Serviceimpl :业务层,因复杂的业务逻辑而单独出层
2024-09-06 15:13:09
611
原创 datetime和timestamp-时间戳的区别
实际开发中,用得最多的为DATETIME。在存取注册时间,商品发布时间等使用时间戳timestamp,其更便于计算。timestamp:4字节,存储空间小,表示的日期范围也小。表示当前时间到1970年1月1日0时0分0秒的秒数。选择:如果需求时间超过timestamp时间范围1970-2038,选择datatime。 如果想要记录数据变更时间,或者节省存储空间,使用timestamp。datetime:8字节,表示范围更大。
2024-08-19 10:04:54
280
原创 Oracle导入.dmp文件表空间不存在
其中的Default tablespace 默认表空间 Temporary tablespace临时表空间。登录系统用户system/sys创建记录的不存在的表空间,下面以“newdc”为例。上一步未删除用户则更改其默认表空间即可: admin用户 newdc新默认表空间。记录错误日志中不存在的表空间,清空导入失败的有损用户表数据,两钟方式。问题:导入时遇到“表newdc空间不存在” 部分数据导入失败。背景:在自己的本地库导入leader发来的.dmp文件。新建用户,分配表空间与权限。
2024-08-14 19:23:05
1870
原创 Redis缓存问题
缓存击穿:相对于雪崩,缓存击穿是指某一key过期了,恰好此时针对该key有大量的请求,这种key在缓存中没有而数据库中有的情况,其请求全都从数据库中查询,这种大量并发请求将数据库压垮。缓存雪崩:设置缓存时采用了相同的过期时间,导致缓存在某一时刻大量同时失效,大量查询同时落在了数据库上,造成缓存雪崩。缓存穿透:访问不存在的key,缓存不起作用。
2024-08-12 14:19:42
392
原创 Head First Java笔记
在HashSet集合中,使用对象的hashcode来判断,如果hashcode不同,HashSet认为对象不同,所以必须重写hashCode()来确保对象有相同的值–避免两个认为相同的对象却在HashSet中不同,但是有相同的hashCode()的对象也不一定相等,所以找到了hashcode相等的两项,也会调用一个的equals来判断是否真的相等。hashCode()方法:返回的序号默认为根据内存位置计算得来的,所以任何对象实际上不会有相同的hashcode,HashSet就是以此判断对象是否重复的。
2024-08-08 10:32:13
858
原创 简单的Vue登录验证、权限管理功能实现
在router.js中,通过全局导航守卫可以根据获取到的sessionStorage中的登录状态信息进行拦截。通过后端传来的用户表中的权限数据来向sessionStorage中存储用户权限和登录与否状态。在login.vue中,登录时已经将登陆状态存储到了sessionStorage中。欠缺点:后端token的验证。
2024-08-06 18:39:27
432
原创 Vue路由
当用户点击router-link标签时,就会去寻找它的to属性,to属性的路径与routes配置的path去相对应,从而找到匹配的组件,将组件渲染到。如果不用重定向而直接pah:/ component:login,将会导致两个路径指向同一个组件,vue报错-存疑,一个路径不指向两个组件就行了呗?Vue的所有内容都是组件化的,把路径和组件对应起来之后利用router配对路径,渲染相应组件。router-link的本质为a标签,to属性对应a标签的href属性。多个路由组成一组路由routes。
2024-08-06 18:29:23
283
原创 Console.log方法常见问题
如果将对象不经处理的存入此类只能存储字符串的结构,则打印时就会出现[object,object]。错误信息:Console.log()输出数组或对象时,数据变化前后写的Console.log打印出的都是数据变化后的数据。:对于非基本类型数据,Console.log不再是直接输出,而是打印的引用地址的快照。错误原因:通俗来说就是对于对象有多层展开的,他只会默认显示第一层,当你去展开对象数据时,他会读取对象。原因:sessionStorage中只能存取字符串,在存储时不能直接存储,应先转化再存/取。
2024-08-05 17:06:48
608
原创 前端分页方法
另外,分页后table页的index会每一页都是1-10排序,若要第二页按 10-20,则需自定义index方法,方法中对传入的index也是return currentpage-1*pagesize+index即可。@current-change=“handleCurrentChange” 监听空间当前被点击到哪一页,使currentpage=传入的页码,重新获取页面数据。截取方式为:for(let i=**(this.currentpage-1)*this.pagesize;
2024-08-01 19:48:41
492
原创 项目中遇到的问题杂记
5.oracle中,尽量避免使用long类型,在后端进行数据库查找操作时,经常会遇到流异常问题,long类型的数据必须先查找,且如果有多行数据则第二行的long在第一行的其他数据后,同样会出现流异常问题,可以替换为number类型。可以通过是否展开来选择按钮的样式,如是展开的,此按钮为向左的箭头,是收缩的,为向右的箭头,此处按钮图标根据展开与否动态变化。所以,当要迭代值的时候,for of性能更好,要迭代对象的时候,用for in。for in 迭代顺序是不确定的 for of的迭代顺序确定。
2024-08-01 17:38:21
262
原创 Vue基础项目结构
Vue为单页应用,整个网站实际上只有一个页面,我们看到的页面的“跳转”其实只是一个页面上的局部组件的更替,路由指的是浏览器地址栏的路径和组件有着一一对应的关系,当输入指定地址,页面的某个区域的组件会替换成该地址对应的组件。App.vue:项目根组件,其他所有组件都包含在这个组件里,作为其子组件,在其页面中以<router-view>来控制不同页面的显示,即所有跳转的路由页面都插在此处渲染。index.html:页面总入口,这个页面定义一个id为app的空的根节点,此即main.js里面定义的实例挂载点。
2024-08-01 17:30:12
276
原创 ActiveMQ
{ //获取消息并通过消息获得数据 TextMessage textMessage = (TextMessage) message;while(true){ //接收队列或主题的消息 TextMessage textMessage = (TextMessage)系统A发送消息给中间件,工作完成,不用管系统B什么时候操作,系统B拉取消息后,执行操作也不用告诉系统A执行结果,整个过程异步调用。queue中,消费者无论是否离线后面都可以收到消息,topic只能消费自它订阅后发布的消息。发送消息,关闭资源。
2024-08-01 14:40:19
894
原创 MQTT协议与中间件
MQTT Clean Session :通常客户端离线后无法收到订阅的主题消息,如果客户端连接时设置Clean Session为false 表示创建一个持久会话,断开连接后仍然保存离线消息,直到会话超时注销,为true则表示创建一个新的临时会话,客户端断开时,会话自动销毁。订阅客户端离线后,发布客户端发布消息,会话保留时间内,消息将在服务器上保留,这时如果订阅客户端选择Clean Start 0 ,重新连接,将会收到离线期间缓存的消息。默认为0,立即结束。QoS等级越高,可靠性越高,复杂度越高。
2024-08-01 14:38:35
940
原创 Promise.all()
Promise.all():用以聚合多个Promise的结果。在这里,由于map中使用了async await,表面上返回的是item,实际返回的是async的返回值即每一个promise对象包裹的每一个item对象的集合。promise.all会等待所有的promise完成后,将所有的promise对象集合,返回其内部的数据。promise.all 是对其内的所以异步promise并发执行,其中一个promise失败(返回为空不是失败)则会直接失败。可以用.catch来处理异常。
2024-08-01 14:36:03
199
原创 前端.sort排序
将各部门销售额按从大到小的顺序排名,并以该顺序作为分子,排名之和作为分母与某一项扣减的金额相乘,使业绩越好的部门该款项扣的越少 如9个部门,第1则扣1/1+2...+9 *款项。
2024-08-01 14:33:21
315
原创 Sql组合索引
示例:在建立abc联合索引之后,使用a,ab,abc的查询能够充分利用,如果使用查询ac,则实际上只用到了a的索引,如果根据bc来查询,则联合查询abc将毫无用到。如果是单列索引a,b,c则查询abc只会利用到其中一个效率最高的索引。相当于创建了a的单列索引,ab的联合索引和abc的联合索引,为最左前缀原则,以左边起点的连续索引都能匹配上。在where中如果使用到了or or的两个字段有一个没有索引则将全表扫描,故尽量避免。使用:注意联合索引建立顺序,将查询更频繁的列放在前面,
2024-08-01 14:21:17
269
原创 this.$router.push方法 携带参数跳转路由
如this.$router.push({path:'/performance/scoring/projectEntry'},query:{ type: 'add', month:this.queryParams.yf, role: this.role })data=tableDate tableDate 就是一个数组,其中的每一行都是数组的一项,所以对于此表格数组可以应用.push(),.splice()等方法 如要删除某一行,可以this.tableData.splice(传过来的index,1)。
2024-08-01 14:19:20
1867
原创 Vue生命周期与watch监听器
v-if 和v-show 基本一样 区别在于v-if是完全隐藏,v-show会把资源加载过来,切换频繁的时候用v-show速度更快。在每次输入的时候关闭计时器,然后再开启,这样的话每次输入计时器都会一直关闭,直到输入结束才开始计时调用。成功翻译,但是实时监视导致输入一个字符翻译一个字符 ,期望:停止输入一段时间后再开始翻译。此即防抖机制,简单的实现就是加一个计时器,setTimeout,隔一段时间再执行。vue的八个钩子函数即此四个阶段以及此四个阶段前的before 阶段。销毁阶段 destoroy。
2024-07-31 11:01:17
270
原创 Console.log方法
错误原因:console.log中加字符串拼接是将对象尝试转化成字符串类型显示,尝试调用对象的toString方法,普通的对象没有这种处理。错误信息:前端打印数据 console.log(this.res+“res”) 浏览器输出[object,object] 而非对象本身。解决方式:可以使用console.log(“res”,this.res)而非字符串拼接的方式。
2024-07-31 10:58:19
367
原创 vue常见遍历函数
在forEach中跳出循环需要try catch方法实现 在try中 将错误抛出 不推荐使用 这种情况用for就可以,或者也可以在循环中需要跳出了,将循环的数组长度设值为0。(item=>{}) 遍历数组,无返回值 适用于不需要处理数组下标,不使用break的情况改变item的值,不会改变原数组的元素值。原因:forEach方法不熟练,forEach中不能使用break,continue,使用return和continue效果一样,筛选数组中满足条件的元素,返回筛选后的新数组。另外遇到的一个bug。
2024-07-31 10:57:06
357
原创 异步函数调用
await函数就可以等待Promise对象兑现结果之后,获取到它的成功或失败的结果,获得axios库返回的结果,无需.then()和.catch()了。async和await :函数前加Async关键字,即为异步函数,Await用于等待一个Promise对象成果或失败后获取结果,而axios就是一个本质为promise的对象。.then()可以理解为一个“定时器”,他就是一个大的回调函数体,里面都是各个回调函数,.then()函数里的所有函数都会在普通函数执行完,栈区空后,从队列一个一个压回栈执行。
2024-07-31 10:50:41
872
原创 前端小数保留和rules规则校验
vue rules表单数据合法检验:中添加属性:rules=rules 在el-form-item中添加prop属性,对应rules的规则属性检验,其原理为二进制表示某些小数表示不了 表示小数只能用2的-n次幂即1二分之一,四分之一,八分之一....的组合 有些小数永远表示不了。前端对于处理完的数据,注意往往加入到reset重置中,不然很容易出现新页面而值未初始化的问题。前端计算浮点型数据时出现不准确,采用数据.toFixed(2):保留两位小数。状态码304:请求的数据未发生变化。
2024-07-31 10:39:34
192
原创 @Param的使用
错误原因:前端传入多个参数(基本数据类型),在后端controller层接收参数,用@param注解给每个参数注解后,忘记了在mapper层给每个参数注解。对于对象,加的话List getUser(@Param("user") User user);对于list:void insertUser(@Param("userList") List userList);参数包含对象,加不加均可。后端是pojo(实体)或者map,前端必须传值为{} 后端是集合或者数组,前端必为[]
2024-07-31 10:35:24
559
原创 后端@Validated校验入参
对传来的SysDictData对象进行入参检验,在SysDictate实体类内部需要检验的字段加入注解,常见的检验注解有@Size,@NotBlank(用来检验去除空格后的该值为空)message自定义错误信息。创建分组接口类 public interface addUser{ };//在分组addUser时,验证id不能为空,其他情况下不做验证。该注解用来检验入参是否符合规范,为@Valid的升级版。Controller层中加入接口类。
2024-07-31 10:33:29
230
原创 SQL中的两种赋值方式#{},${},volatile与synchronized的区别
{param} :直接在sql语句中进行拼接,传入进去的值将直接传入到sql语句中,此种方式不安全,难以避免sql注入问题,如用户密码校验:password=${password} 如果输入的password是1 or1=1 , 1=1恒真跳过密码验证。所以需要保证线程对数据做出的更改对于其他获得改数据的线程是立即可见的。volatile关键字实现内存可见性,标记为volatile的变量修改时,其他缓存的旧值会被清除,重新读取,使得所有对volatile变量的读写都会直接读写主存。
2024-07-31 10:28:13
210
原创 SQL事务并发的四个问题
更新丢失:前三个问题都是因为一个事务作修改,另一个事务在读,更新丢失是因为两个事务都在修改,后修改完成的会将先修改完成的数据覆盖,导致先修改完成的数据丢失。幻读:一个事务按相同查询条件重新读取,发现其他事务插入或者删除了满足查询条件的新数据,即查询到的数据条数增多了,两次读取的数据总数不一样。脏读:一个事务正在对数据修改,另一个事务读取此数据去处理。脏读读取了未提交的事务。不可重复读:两次读读取数据时不一样。2024.6.6日笔记。
2024-07-31 10:25:29
294
原创 SQL乐观锁与悲观锁、共享锁与排他锁
乐观锁CAS只能保证单个变量的原子性,(可以把多个变量放入一个对象)悲观锁synchronized锁可以对整个代码块加锁,在竞争激烈时用synchronized锁有优势,因为乐观锁会频繁因数据变动更新失败,竞争不激烈时乐观锁不锁代码块更省资源。排他锁(写锁,独占锁):加锁后只允许加锁事务读取和修改,其他事务都不能修改(需要等待锁释放)(普通的查询可以,加任何锁的查询都不可以),加锁。行级锁:mysql锁定粒度最细的锁,针对当前的行加锁,消耗大,行级锁内分为共享锁和排他锁。2024.6.5日笔记。
2024-07-31 10:24:33
319
原创 前端地址传参和Param传参
如果是多个参数则“test/delete?2.对于params,常用于get请求的添加查询参数,而对于data参数,常用于post请求的数据传递。另外如果xml的动态sql里参数作为判断条件,后端接收也要用@param。1.前端传的参数到后端,如果参数名称一致则自动匹配,如果不一致则需要用。+row.id 后端名字不一致按上述匹配。后端要取到aid的值 用delete((“前端传过来的参数名”)2024.6.4笔记。
2024-07-31 10:21:50
400
原创 sql日期类型处理
AOF 记录每次写操作命令,并将其追加到aof文件末,即保存redis命令的命令日志文件,这样的方式安全性高。RDB是 一种快照式的持久化,每隔一段时间将内存的数据持久化到 磁盘中,这种方式恢复加载快 但两段快照之间的故障数据将会丢失。4.对于日期类型处理,datediff(日期一,日期二) 结果为日期一相对日期二的天数。某一天比上一天温度高的日期(id=2,4) 则可以对表内连接后用。(日期类型如day或者month,日期一,日期二) 结果为反向。1.sql中判断为等 为= 而非==
2024-07-31 10:17:10
445
原创 ref和this.$refs
利用v-for和ref获取一组数据或dom节点,如果希望通过v-for遍历加不同的ref,需要使用冒号,即:ref (其他属性通常也是这样,加:说明后面的是一个变量或表达式,不加则为固定值,常量)this.$refs.myButton.style.backgroundColor = 'blue';ref加在子组件上,用this.$refs.ref值获取到的是组件实例,可以使用组件的所有方法,使用方法时则this.$refs.ref值.方法()就可以使用了。2024.5.31日笔记。
2024-07-31 10:10:55
251
原创 部分设计模式-2024.5.30笔记
以计算器为例,首先是计算器的实体类,包含数据和方法,然后计算器的加减乘除类继承实体类,重写实体类方法operation,四类封装完成 add extend operation sub extend operation 等最后由工厂类负责实例化,决定实例化对象的类别(add?正因为四种类对同一实体类的继承 分别封装才得以实现多态 operation add/sub=new add/suboperation add/sub.result()即可完成计算 result():四类中重写的计算方法。
2024-07-31 10:08:10
146
原创 反射和动态代理
运用反射的思想,在运行时创建对象,并将方法调用重定向到不同的实际对象。 动态代理即用proxy生成代理类实例-通过newProxyInstance()方法,代理类持有InvocationHandle类实例,InvocationHandle持有待增强类的 实例,通过调用代理类的方法(反射),InvocationHandle对此方法进行拦截,实现增强的业务逻辑,通过反射,你可以动态地获取类的信息(例如,类的构造函数、方法、字段)并可以在运行时创建对象、调用方法和访问字段。// 获取并调用方法。
2024-07-31 10:00:28
969
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人