nested exception is org.apache.ibatis.exceptions.PersistenceException
碎碎念每日一个小BUG,强身又健体💪,我一定是疯了哈哈哈哈哈哈哈哈哈
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.UnsupportedOperationException
### Cause: java.lang.UnsupportedOperationException
上网查了一下,说的原因也是很多,有的说是 Mybatis 配置的问题,也有的说是数据库字段类型和实体类对应不上的,但是这些对我来说都没有用,之前的话我用 Mybatis collection 都是喜欢自己写 result 不习惯用 resultMap,因为我觉得这是一个意思
今天看来以后还是老老实实用 resultMap 吧,我把 collection 中的 resultMap 单独拿出来写就可以了,我暂且理解为 Mybatis 对于处理结 ...
微信小程序子组件往父组件传值
碎碎念最近在使用 uni-app 编写手机端和微信小程序,在优化小程序的时候遇到一个 BUG,按理说 JS 对象赋值的时候给的是地址,其中两个对象任意一个被修改另外一个也应该被修改,但是在小程序中子组件的值修改之后,不能同步更新到父组件,这就让我很烦😡
解决办法虽然我也知道 Vue 不推荐直接修改对象的值,但是能省事我也就无所谓😁。无奈,现在只能使用 Vue 推荐的 this.$emit 方法子组件往父组件传值
全局事件总线先定义一个全局事件总线,用来传递数据,最好是在 beforeCreate 钩子函数中定义,这样可以保证在所有组件中都可以使用
1Vue.prototype.$bus = this
监听子组件值的变化12345678watch: { unit: { handler: function (val) { this.$bus.$emit('change', val) }, deep: true }}
父组件接收传过来的值因为我们定义了一个全局的事件总线,所以 ...
HashMap 执行流程
HashMap执行流程图流程图https://www.processon.com/diagraming/6532431251d35763b9c31ad3
判断键值对数组 table 是否为空或为 null,否则执行 resize() 进行扩容(初始化)
根据键值 key 计算 hash 值得到数组索引
判断 table[i] == null,条件成立,直接新建节点添加
如果 table[i] == null,不成立
判断 table[i] 的首个元素是否和key一样,如果相同直接覆盖 value
判断 table[i] 是否为 treeNode,即 table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值
遍历 table[i],链表的尾部插入数据,然后判断链表的长度是否大于 8,大于 8 的话把链表转换为红黑树,在红黑树中执行插入操作,遍历过程中若发现 key 已经存在直接覆盖 value
插入成功后,判断实际存在的键值对数量 size 是否超过了最大容量 threadshold(数组长度 * 0.75),如果超过,进行扩容
Spring 源码 SpringBoot 源码
Spring容器中的Bean是何时创建的?为什么我们能从容器中获取到?
非懒加载的单实例bean会在容器创建的时候创建。容器内部会创建一个beanFactory,使用beanFactory的doGetBean方法来进行创建,并且在创建后会把bean放入一个单例bean的map集合(singletonObjects)中存储。key就是我们配置的bean的名称。所以我们调用容器的getBean方法来获取对象的时候,其实也是调用了doGetBean方法。就会从对应的集合中获取到之前创建的对象
MySQL(三)
InnoDB数据存储结构磁盘与内存交互基本单位:页InnoDB将数据划分为若干个页,InnoDB中页的大小默认为16KB。以页作为磁盘和内存之间交互的基本单位,也就是一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。也就是说,在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页,数据库IO操作的最小单位是页,一个页可以存储多个行记录
记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(也就是一次IO操作)只能处理一行数据,效率会非常低
页结构概述页A,页B,页C…页N这些页可以不在物理结构上相连,只要通过双向链表相关联即可,每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里面的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录
页的上层结构另外在数据库中,还存在着区,段和表空间的概念
区是比页大一级的存储结构,在InnoDB存储引擎中,一个区会 ...
MTMR
MTMR 是一个 Mac 上的自定义触控栏工具,可以自定义触控栏的按钮,可以添加自定义的脚本
可以通过 brew install --cask mtmr 来安装,也可以直接从这里直接下载镜像来安装,整体感觉还是很好看的
Butterfly 主题升级工具
GitHub Desktop 是一个图形化的 Git 客户端,可以方便地管理本地 Git 仓库,也可以直接从 Github 上克隆仓库到本地,然后进行修改,最后提交到 Github 上
可以明显的看到左右两边文件的不同,改动起来非常方便。使用之前先 pull 一下代码就可以了(不光是 GitHub 项目,Gitee 项目也是可以的)
Vue 中 background-image 的使用
Vue 中 background-image 的 url 属性不能直接写字符串,需要使用 require 引入图片,然后使用 v-bind 绑定到 background-image 的 url 属性上
1<view class="loading-img" :style="{background:'url('+require('static/img/IMG_3969.jpeg')+')', backgroundSize:'cover'}"></view>
Vue 监听对象集合的变化
如果只是普通的监听对象的变化,可以使用 watch
123'unit.reportedValue'(newVal, oldVal) { console.log(this.unit.unitId + ' ' + newVal + ' ' + oldVal)}
但是如果是监听对象集合的变化,特别是存在子父级关系时,就需要使用 watch 的 deep 属性
123456unitList: { handler(newVal) { this.collectList = newVal; }, deep: true}
Autowired 和 Resource 的区别
@Autowired
@Resource
Spring 定义的注解
JDK自带的注解(JSR-250定义的)
默认按类型自动装配(byType)
默认按名称自动装配(byName)
一个参数:required(默认true),表示是否必须注入
七个参数:最重要的两个参数是 name,type
默认按类型自动装配,如果要按名称自动装配,需要和 @Qualifier 一起配合
默认按名称自动装配,如果指定了 name,则按名称自动装配;如果指定了 type,则按类型自动装配
支持优先级,@Primary 注解修饰,该候选者会被选中,作为自动装配的 bean
不支持
作用范围:构造器,方法,参数,成员变量,注解
作用范围:类,成员变量,方法
不知道从什么时候起我的 IDEA 对 @Autowired 一直报黄色的波浪线,使用 alt + enter 查看 IDEA 给的提示是 Field injection is not recommended,上网查了以下发现其实是因为现在推荐使用构造器的方式注入,而不推荐使用成员变量的方式。我以前的处理方式是直 ...