MyBatis:
1.xml配置文件(全局配置文件)
2.sql映射文件;配置了每一个sql,以及sql的封装规则等
3.将sql映射文件注册在全局配置文件中
4.代码:-根据全局配置文件得到SqlSessionFactory
-使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
一个sqlSession就是代表和数据库的一次会话,用完关闭
-使用sql的唯一标识来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的
接口式编程(推荐):
原生:Dao - DaoImpl
mybatis:Mapper - xxMapper.xml
sqlSession代表和数据库的一次会话,用完必须关闭
sqlSession和connection一样都是非线程安全的,每次使用都应该去获取新的对象
mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象
两个重要的配置文件:mybatis的全局配置文件
sql映射文件:保存了每一个sql语句的映射信息
全局配置文件:Configuration
properties标签:引入外部的properties配置文件的内容
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
settings标签:包含重要的设置项
setting:用来设置每一个设置项
name:设置项名
value:设置项取值
typeAliases标签:别名处理器,可以为java类型起别名,别名不区分大小写
typeAlias:为某个java类型起别名
type:指定要起别名的类型的全类名,默认别名就是类名小写
alias:指定新的别名
package:为某个包下的所有类批量起别名
name:指定报名-起默认别名
typeHandlers标签:类型处理
environments标签:myBatis可以配置多种环境,default指定使用某种环境,达到快速切换
environment 配置一个具体环境信息,必须有两个标签,id代表当前环境的唯一标识
transactionManager:事务管理器
type:JDBC、MANAGED(别名),自定义实现接口TransactionFactory
dataSource:数据源
type:类型;UNPOOLED、POOLED、JNDI
databaseIdProvider标签:支持多数据库厂商
type="DB_VENDOR" 得到数据库厂商标识
mappers标签:将sql映射注册到全局配置中
mapper 注册一个sql映射
resource:注册类路径下的sql映射文件
url:引用网络路径或者磁盘路径下的sql映射文件
class:引用(注册)接口
1.有sql映射文件,文件名与接口同名,并放在同一目录下
2.没有sql映射文件,所有sql都是利用注解写在接口上
推荐重要的接口写sql映射文件,
批量注册 package name="..."
映射文件:
标签:select、update、insert
myBatis允许增删改直接定义以下类型返回值:Integer、Long、Boolean
需要手动提交数据
parameterType:参数类型,可以省略
useGenneratedKeys="true":使用自增主键的值
keyPropertiy:指定对应的主键属性,也就是mybatis获取到主键值后,将这个值封装给
javaBean的哪个属性
-Oracle不支持自增,使用序列来模拟自增
selectKey标签
使用order{AFTER、BEFORE}来主键取自序列
参数处理:
单个参数:mybatis不做特殊处理
#{参数名}:取出参数值
多个参数:多个参数会被封装成一个map
key:param1...paramN
#{}就是从map中获取指定的key值
命名参数:明确指定封装参数式map的key;@Param注解
key:使用@Param注解指定的值
#{指定的key}取出对应参数值
POJO:多个参数正好式业务逻辑的数据模型
#{属性名}:取出传入的pojo属性值
Map:#{key},取出map中对应的值
TO:(Transfer Object)数据传输对象
Page{
...
}
参数值的获取:
#{}、${}:可以获取map中的值或者pojo对象属性的值
区别:#{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement,
防止sql注入
${}:取出的值直接拼装在sql预计中,有安全问题
#{}:更丰富用法:规定一些规则
javaType、jdbcType、mode....
resultMap:和resultType只能用一个
resultMap标签:自定义某个javaBean的封装规则
type:自定义规则的java类型
id:唯一id方便引用
id标签:定义普通列封装规则
column:指定哪一列
propertiy:指定对应的javaBean属性
result标签:不指定的列会自动封装,写resultMap九八全部映射规则都写
column:指定哪一列
propertiy:指定对应的javaBean属性
association标签:指定联合的javaBean对象
关联对象:
property:指定哪个属性是联合的对象
javaType:指定这个属性对象的类型
-----------------------------------
分布查询:
select:表明当前的属性是调用select指定的方法查出的结果
column:指定将哪一列的值传给这个方法
延时加载-----配置文件中配置
collection定义关联集合类型的属性的封装规则(嵌套结果集)
ofType指定集合里面元素的类型
fetchType="" lazy:延时加载eager:立即
discriminator标签:鉴别器
动态sql:DynamicSQL
if标签:
test:判断表达式(OGNL) 特殊符号要转移字符
where标签:只会去掉第一个多出来的and或者or
trim标签:prefix、prefixOverrides、suffix、suffixOverrides
choose标签:(when、otherwise)分支查询,类似swtich
set标签:更新
foreach标签:
collection:指定要遍历的集合
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引
mybatis默认还有两个内置参数:
_parameter:代表整个参数
_databaseId:配置了databaseIdProvider标签,就是当前数据库别名
bind标签:可以将OGNL表达式的值绑定到一个变量中 name、value
sql标签:抽取可重用的sql片段
include标签:引用外部定义的sql,还可以自定义property,
sql标签内部就能使用自定义的属性,${}来取值
MyBatis缓存机制:
mybatis默认定义了两级缓存、
一级缓存(本地缓存):与数据库同一次会话期间查询的到的数据会放到本地缓存
sqlSession级别的缓存,是一直开启的、clearCache()清除缓存方法
二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存
1.配置文件中开启缓存:cacheEnabled="true"
2.映射文件加
eviction:缓存的回收策略
flushInterval:缓存刷新间隔
readOnly:是否只读
size:缓存存放多少元素
3.pojo实现序列化接口
查询的数据都会被默认放在一级缓存中,只有会话提交或者关闭后,一级缓存中的数据才会转移到
二级缓存中
*没有在映射文件中加标签的,不可以使用二级缓存
*select标签中 useCache="true";false(一级缓存依然使用,二级缓存不使用)
*增删改标签的:flushCache="true";一级和二级缓存全部清空
查询标签的默认flushCache="false"
*sqlSession.clearCache();只是清楚当前session的一级缓存
*localCacheScope
ehcache:导入jar包(第三方缓存包、第三方缓存整合适配包)
ehcache.xml配置文件
MyBatis-Spring整合:
目的:1.spring管理所有组件,mapper的实现类
service -》Dao @Aurowired 自动注入mapper
2.spring事务管理
MyBatis逆向工程:
MyBatis Generator:MBG,代码生成器
MyBatis工作原理:
1.获取到sqlSessionFactory对象
把配置文件的信息解析并保存在Configuration对象中,返回包含了Configuration的
DefaultSqlSession对象
*MappedStatement:代表一个增删改查的详细信息
2.获取到sqlSession对象
返回一个DefaultSqlSession对象,包含Executor和Configuration
这一步会创建Executor对象
3.获取接口的代理对象(MapperProxy)
getMapper,使用MapperProxyFactory创建一个MapperProxy的代理对象
代理对象里面包含了 DefaultSqlSession(Executor)
4.执行增删改查方法