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。

 

 

 

 

 

 

 

 

posted @ 2021-03-09 14:17  majingyun  阅读(73)  评论(0)    收藏  举报