1.mybatis是典型的面向接口编程,接口的名称作为对应映射XML的namespace,XML的Id则和接口的方法对应。映射的XML需要注册到mybatis.config.xml配置文件中
2.mybatis的核心是SqlSessionFactory,任何一次和数据库的交互都需要使用SqlSessionFactory.openSession()方法获得一个和数据库的连接,然后进行操作
3.标签
propertie:引入外部配置文件 比如datasource的配置单独写一个配置文件,然后通过此标签引入
settings:最重要的一个标签可以开启很多mybatis的特性,比如开启下划线驼峰映射
TypeAliases: 默认类名小写,通过alias属性指定 可以通过packages 批量指定类名 当前包和后代包都起默认别名,在类名上也可以用@Alias注解指定
plugins:加入插件
enviroments:可以配置多种环境,trsanctionManager属性指定事务管理器,mybatis内置JDBC和MANAGE两种,datasource指定数据源
databaseIdProvider: type属性标明具体数据库厂商
mappers: 注册映射sql
4.获得插入主键
支持自增主键数据库:useGenerateKey
不支持自增主键数据库:selectKey
5.参数处理
单参:直接 #{参数名}取出
多参:mybatis特殊处理,封装成一个map,可用param1,param2,param3...取出
或者在接口中用@Param注解 @Param("variableName") 制定后可用#{variableName}取出
如果多参正好是POJO的所有字段,直接传入POJO
否则可以传入Map(如果多参不是业务模型中的数据,但是经常使用,推荐来编写一个TO<TransferObject>)
如果是Collection,如list、set 类型或者数组会把传入的集合封装在map中
6.#和$的区别
除了$是预编译直接替换而#是使用占位符替换的区别外,$符号在不支持预编译的sql中可以用作替代,如表名称
7.#{variable.jdbcType=xxx}对于这种jdbcType的指定
因为mybatis是使用JDBC.Other代替null值而有些数据库如Oracle不能正确识别这种null值,导致错误。可以在全局配置setting中设置NullFotJdbcType的属性为null,这种jdbcType一般不用写
8.resultType
注意一点,返回类型是集合时,resultType的值为集合中元素的类型
9.resultMap
mybatis最常用的返回,可以自定义。 如果返回对象中包含对象,可用association进行配置,若采用分部查询可以使用setting 的LazyLoadingEnabled 默认为true和AggressiveLazyLoading若开启则只要一个对象触发懒加载,所有设置懒加载的对象全部加载,设置为false只会加载需要的懒加载对象
10.可用collection来表示集合,item为集合的子项
11.动态sql
<IF>
<where> 不用写1==1了
<trim> prefix ="xx" 前面加上xx,prefixOverrides=“xx” 前面有xx去掉
suffix,suffixOverrides 同理
<choose (when,oherwise)> mybatis中的分支,注意只会进入第一个匹配的分支
<set> 不用管逗号了
<foreach> 遍历
<bind>绑定值
<sql> sql复用
12.内置参数
_Parameter 代表传入的整个参数
_databaseId 代表当前数据库的别名
13.缓存
mybatis自带两级缓存,一级缓存默认开启,二级缓存默认关闭
一级缓存称为本地缓存,与数据库一次会话期间查询到的数据会加入到本地缓存
一级缓存失效的情况:
1.sqlSession不同,每个会话对应一条sqkSession
2.sqlSession相同,查两个同样对象操作之间调用了增删改操作
二级缓存是基于namespace的,也就是说一个mapper下的操作的数据都会对应一个二级缓存
一级缓存关闭会话后数据才保存到二级缓存中
14.mybatis工作原理
1.获取sqlSessionFactory
2.获取sqlSession对象
3.获取接口的代理对象(mapperProxy)
4.执行增删改方法
Detail:
1.利用xmlConfigBuider解析属性文件(mybatis.properties.xml,mapper.xml)生成一个包含所有配置的configuration对象,然后传入DefaultSqlSessionFactory获得一个工厂实例 sqlSessionFactory
2.configration调用openSessionFromDataSource(),然后创建Excuter创建事务,Excuter对象会在开启二级缓存的情况下去二级缓存先找数据(装饰器模式),并执行所有拦截器方法
3.获取接口的代理类实例
MapperProxyFactory.newInstance(...);
这块是通过java的动态代理创建的一个代理对象
4.执行增删改改查
批处理
mybatis的批处理需要在mybatis.properties.xml中配置 将sqlSessionFactory传进去,并将excuteType改为batch,然后可以指定接口中方法ID,这样指定的那个方法就会启用批处理
mybatis 四大对象
1.Excuter
2.ParameterHandler 解决mybatis参数解析封装
3.TypeHandler 解决jdbcType和javaType之间的映射
4.statementHandler 解决 sql执行 底层都是jdbc