20190712共学问题归纳

Mybatis相关

1、动态SQL(灵活拼接)

<if>:适用于动态条件(检索条件存在时则拼接到where)
<choose>,<when>,<otherwise>: 相当于java的switch没有break
<where>:适用于where本身是否包括(没有一个条件时where需要动态去掉)
<set>:适用于动态设定值,灵活处理最后的逗号
<foreach>:遍历,适合拼接元素到in条件,包含open,close,separator元素
<bind>:OGNL表达式

参考:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html

2、注解

<insert>、<update>、<delete>、<select>

这四个注解分别代表将会被执行的 SQL 语句。它们用字符串数组(或单个字符串)作为参数。
如果传递的是字符串数组,字符串之间先会被填充一个空格再连接成单个完整的字符串。
这有效避免了以 Java 代码构建 SQL 语句时的“丢失空格”的问题。
然而,你也可以提前手动连接好字符串。属性有:value,填入的值是用来组成单个 SQL 语句的字符串数组。

参考:http://www.mybatis.org/mybatis-3/zh/java-api.html

小程序相关

1、this和that的使用

this代表着当前对象,会随着程序的执行过程中的上下文改变,这也是为什么在回调时用this取不到数据的原因,解决办法:
1)可以在回调函数外面复制一份到that中(也就是var that=this),然后回调函数通过操作that来控制,这也是最常用的方法
2)函数声明方式:success: res=> {this.setData({xxx})}

参考:https://blog.csdn.net/mdzzzhangxian/article/details/60966040

2、wxs脚本:主要用于compute/filter,用于转换数字货币等的转换。用在wxml上来构建页面,而不是用在js里

参考:https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxs/

Spring相关(尚未实验)

1、当一次事务提交需要更新两个数据源,如何控制事务的原子性?
    

考虑用druid的多数据源管理

2、当调用多个微服务的更新DB操作时,如何控制事务?

解决方案
1、XA协议方案:两阶段提交,中间用事务协调器调控 -- 性能问题应用不多
2、TCC方案:对XA的改进,可重试 -- 开发复杂度较高
3、阿里的中间件GTS:收费服务,但还好在2019年阿里开源了社区版seata,足够大部分场景使用
原理:基于XA方案的两步提交,为了减少锁资源的时间,第一次提交时已经提交了事务,而回滚的原理是在提交事务时记录undo日志,回滚时根据undo记录来生成回滚用的SQL

关于seata的更详细了解,请参照系列文章:Seata之研究

参考:https://www.cnblogs.com/lfs2640666960/p/8725315.html

应用示例:https://www.jianshu.com/p/37657d557183

阿里官网:https://help.aliyun.com/product/48444.html

GTS的开源社区版:https://github.com/seata/seata

原文地址:https://www.cnblogs.com/roostinghawk/p/11180119.html