Mybatis
Mybatis
1、配置文件
1)<properties resource="sqlmap/mybatis/mysql/jdbc.properties"/>
加载数据库连接的相关信息
2)<setting name="autoMappingBehavior" value="PARTIAL"/> 自动映射
autoMappingBehavior包括三个值:
① NONE 取消自动映射
② PARTIAL 只会自动映射,没有定义嵌套结果映射的结果集
③ FULL 会自动映射任意复杂度的结果集(无论是否嵌套)。
3)<setting name="logImpl" value="STDOUT_LOGGING"/> 打印查询语句
4)<setting name="mapUnderscoreToCamelCase" value="true"/>
配置驼峰转下划线 数据库中的下划线,转换Java Bean中的驼峰。
4)类型别名
<typeAliases>
<package name="vo"/>
</typeAliases>
5)配置数据库环境
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/> <!-- 事务管理器 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
6)映射器
<mappers>
<mapper resource="sqlmap/mybatis/mysql/UserMapper.xml"/>
<mapper resource="sqlmap/mybatis/mysql/UserContactMapper.xml"/>
</mappers>
2、Mybatis增删改查
1)在mapper.xml写好查询语句;
<select id="getMessageByMap" parameterType="map" resultMap="messageResult">
select
<include refid="allColumns"/>
from tb_message where id = #{id} and msg_id = #{msgId}
</select>
resultMap 数据库和实体的映射关系
2)写接口
3、Mybatis传值
1)字段,通过注解的方式
Message getMessageById(@Param("id") Long id);
2)Map 可以传多个参数
Message getMessageByMap(Map<String, String> params);
3)实体传值
Message getMessageByMessage(Message message);
一般不推荐用map,可读性查;
4、$与#号的区别
# 采用预编译的方式构建查询语句;可以防止sql注入。
$ 采用的是值传递的方式构建查询语句
5、myBatis 1对多查询和1对1查询。


6、缓存
1)一级缓存
MyBitas 默认开启一级缓存
2)二级缓存
通过定义cach标签实现
<cache eviction="LRU" flushInterval="1000" size="1000" readOnly="true"/>
二级缓存的算法,回收策略 type:
① LRU:最近很少使用,移除最长时间不用的对象。
② FIFO:按对象进入缓存的顺序来移除他们
③ SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象。
④ WEAK:弱引用,移除最长时间不用的对象。
flushInterval:刷新间隔时间,单位为ms,如果不配置当sql执行时刷新缓存。
size:引用数据,正整数,代表缓存最多可以存储多少个对象,不宜设置过大。否则会内存溢出。
3)自定义返回
我们可以通过实现org.apache.ibatis.cache.Cache接口,使用Redis,Memcache等缓存机制,来实现自定义缓存。使用方式:

4)缓存的作用
每一次查询就是查mysql,每次查询开一次磁盘Io,这影响性能
7、动态SOL
1)If

2)choose、when、otherwise

3)trim、where、set
Trim insert时去掉,

where标签查询时,可以去掉前面的and

set标签 update时把,去掉。

5)Foreach

Collection:传递进来的参数名称,可以是数组、List、Set集合。
Index:当前元素在集合的下标位置。
Item:循环中当前的元素。
Open 和close:使用什么符号包装集合元素。
Separator:每个元素的间隔符号。
6)Test
If 判断条件。
7)Bind

8、动态代理
1)Jdk动态代理不需要提供类,只需要提供接口。
通过反射实现接口的动态代理。实现接口 InvocationHandler
① 建立jdk动态代理

② 使用

2)cjlib动态代理
实现类的代理,底层是动态字节码,实现接口MethodInterceptor


区别:Jdk只能代理接口,cjlib可以代理类;Jdk底层是反射,cjlib是反射。
9、扩展:数据迁移
数据迁移不停服务,在线迁移。两种方案:
1)双写法
写入的话,在两个库都添加,更新两个库。历史数据,通过数据迁移工具或者异步写入。采用灰度发布。写的时候可以启动一个异步线程,用kafka
2)日志法
利用中间键kafka,会把binlog日志同步出来,利用canal,模拟成从库,去拿binlog日志信息。把binlog日志信息解析出来,写到kafka。

浙公网安备 33010602011771号