Mybatis 学习总结
基本环境配置
1.Mybatis-config.xml
- 配置参数按照如此下顺序配置-
- properties/settings/typeAliases/typeHandlers/objectFactory/objectWrapperFactory/plugins/environments/databaseIdProvider/mappers
- 所有的*Mapper.xml需要在Mapper中注册
1 |
|
2.构建sqlsessionFactory
1 | String resource = "org/mybatis/example/mybatis-config.xml"; |
3.*Mapper.xml
- 命名空间必须指向方法的接口
1 |
|
于此同时,我们也可以通过注解对一些简单的sql语句映射
1
2
3
4
5package org.mybatis.example;
public interface BlogMapper {
"SELECT * FROM blog WHERE id = #{id}") (
Blog selectBlog(int id);
}
XML配置
1. properties
- 加载外部配置文件
1 | <properties resource="org/mybatis/example/config.properties"> |
3.typeAliases
设置别名 可以为每个pojo设置;也可以直接指定包名,mybatis会扫描package下面所有的javabean;也可以通过注解
1
2
3<typeAliases>
<package name="domain.blog"/>
</typeAliases>
4.environments
尽管可以配置多个数据库环境,但每个SqlsessionFactory只能选择一种环境
1
2
3
4
5
6
7
8
9
10
11
12
13<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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>
5.mappers
告诉mybatis到哪里寻找配置文件。可以通过直接指定xml文件;也可以通过加载同名class;还可以通过扫描mapper所在的package。
1
2
3
4<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
XML映射文件
cache
– 该命名空间的缓存配置。cache-ref
– 引用其它命名空间的缓存配置。resultMap
– 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。解决pojo中属性名与数据库中列名不想等的情况
1
2
3
4
5<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>1
2
3
4
5<select id="selectUsers" resultMap="userResultMap">
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>多对一的映射
1
2
3
4
5
6
7
8<association property="author" javaType="Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
<result property="password" column="author_password"/>
<result property="email" column="author_email"/>
<result property="bio" column="author_bio"/>
<result property="favouriteSection" column="author_favourite_section"/>
</association>一对多的映射
1
2
3<collection property="tags" ofType="Tag" >
<id property="id" column="tag_id"/>
</collection>
sql
– 可被其它语句引用的可重用语句块。insert
– 映射插入语句。update
– 映射更新语句。delete
– 映射删除语句。select
– 映射查询语句
动态sql
- 本质上是sql的拼接
- 可以通过sql、when、if、foreach等标签进行控制
if:满足条件就拼接
1 | <select id="findActiveBlogWithTitleLike" |
choose、when、otherwise:只满足其中的一个条件
1 | <select id="findActiveBlogLike" |
where:去处第一个满足条件的查询中的and关键字
1 | <select id="findActiveBlogLike" |
foreach:对集合进行遍历,尤其是在IN关键字中
1 | <select id="selectPostIn" resultType="domain.blog.Post"> |
缓存技术
mysql主从复制原理
- 在每个事物更新数据前,Master服务器在二进制日志中记录这些改变,记录完成后Master服务器通知存储引擎提交事务;
- Slave服务器将Master服务器的日志复制到其中继日志(Relay log)。首先Slave开始一个工作线程I/O,I/O线程在Master上打开一个连接,开始Binary log dump process,Binary log dump process从Master二进制日志中读取时间,如果已经跟上Master,它会睡眠等待Master产生的新事件。I/O线程将这些时间写入
- SQL slave thread(SQL从线程)从中继日志中读取事件,并重放其中的事件从而更新Slave上的数据,使其与Master一致,只要该线程与I/O线程保持一致,中继日志通常会位于系统的缓存中,所以中继日志开销很小。
mysql读写分离原理
读写分离就是在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的数据库。
基于中间代理层实现:代理一般位于客户端和服务端之间,代理服务器接到客户端请求通过判断转发到后端数据库,这部分通过Amoeba实现。