文章目录
- 一、主配置文件
- (1)configuration标签
- (2)properties属性配置标签
- (3)settings设置标签
- (4)typeAliases别名设置
- (5)typeHandlers类型处理器标签
- (6)objectFactory对象工厂标签
- (7)plugins插件标签
- (8)environments环境标签设置
- (9)databaseIdProvider数据库厂商标识
- (10)mappers映射器
- 二、映射配置文件
- (1)mapper标签
- (2)select标签
- (3)insert, update 和 delete标签
- (4) sql 与 include标签
- (5)#{}中的参数
- (6)resultMap 结果集映射
- (7)cache缓存
- (8)动态SQL
- 三、注解
标签之间有写的顺序,一定注意
一、主配置文件
(1)configuration标签
configuration是配置的标签,mybatis中的所有的配置都在这个标签下面
(2)properties属性配置标签
properties下面可有多个propertie标签
propertie的属性: name:属性名称 value属性值 -----> 可以使用${}在后面引用 resource属性:可以直接映入一个properties文件
(3)settings设置标签
settings标签下面可以有多个setting标签
setting标签的属性: name属性指定属性 value指定状态 (具体的属性取值可以看官方文档)
之前使用过开启缓存设置等等
(4)typeAliases别名设置
typeAliases标签下面可以有多个typeAliase标签或者package标签,可以为指定的路径别名(别名不区分大小写)
typeAliase标签的属性: alias指定别名 type指定全限定类名 package标签:指定的包名下的文件全部以类名为别名 name属性指定包的路径
(5)typeHandlers类型处理器标签
typeHandlers标签下面可以有多个typeHandler标签和package 标签
作用: 用于数据库类型和java指转化规则,定类型处理器处理的类 (官方给我们提供了很多类型处理器,可看官网,也可以自定义类型处理器) typeHandler属性: handler指定使用的类型处理器 javaType指定要处理的java类型 package 标签属性: name指定包下自定义的类型处理器全部注册
(6)objectFactory对象工厂标签
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。
默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。
如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。objectFactory属性 type指定自定义的工厂 objectFactory标签下面可以通过<property name="属性" value="值"/>来设置工厂属性
(7)plugins插件标签
plugins标签下面可以有多个plugin标签,添加plugin标签,来实现插件的注册
plugin标签的属性:interceptor属性来指定插件位置 (自定义插件内部已经定义好了要处理四大对象的哪个方法) plugin标签下面可以通过property 标签设置每一个插件的值
(8)environments环境标签设置
environments标签:
environments标签下面可以有多个environment标签 使用environment标签的default属性来指定使用哪个环境id
environment标签
environments标签id属性:指定改环境的id值 environment标签下面: transactionManager进行事务设置 dataSource标签内设置数据库的链接信息
transactionManager事务管理器设置
type属性指定使用的事务管理器 JDBC 值(常用):使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域 MANAGED 值:这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期 下面可以写property 标签设置事务的属性的值
dataSource标签
通过下面的<property>标签指定数据源信息 dataSource的type属性,可以指定选着数据源类型 type属性的取值: POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现 UNPOOLED 没有使用池的思想(没有建立连接池容器,每次都会重新创建一个)。 JNDI 采用服务器提供的JNDI技术实现,不同的服务器所能拿到DataSource是不一样。
(9)databaseIdProvider数据库厂商标识
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。
databaseIdProvider标签的type="DB_VENDOR" 该标签下面可以通过property 来指定厂商的别名 <property name="Oracle" value="oracle" />
(10)mappers映射器
mappers标签就是用于指定映射文件的位置:
mappers标签可以有多个<mapper>和<package >指定映射文件的位置 <mapper>标签的属性: resource:使用资源路径指定位置(多用于配置文件方式配置) class:指定接口的名字(多用于注解方式配置) url:使用完全限定资源定位符指定映射文件位置 <package >标签的属性: name属性指定接口的位置(mybatis会根据接口的相应位置找resources下面的mapper位置)
二、映射配置文件
(1)mapper标签
映射文件下面的所有的配置都在mapper标签下面
namespace属性:指定要对应的接口文件
(2)select标签
(3)insert, update 和 delete标签
(4) sql 与 include标签
sql标签:
用于提取重复的sql片段,使用id属性指定该片段
include标签:
用于引入sql片段,使用refid属性指定引用sql片段的id 该标签下面可以使用property标签为引用的sql片段赋值(解决参数不一致情况)
(5)#{}中的参数
mybatis处理存储过程的时候经常使用
(6)resultMap 结果集映射
当我们的javaBean类型和数据库类型不一致的时候,怎么实现映射???
属性:id指定响应id,type指定JavaBean
子标签:
<id property="Bean的属性名称" column="数据库列名称" />
<result property="Bean的属性名称" column="数据库列名称" />
<association property="属性Bean名称" javaType="对应的Java类型"> 处理一对一
<collection property="属性集合名称" ofType="集合中封装的类型"> 处理一对多
<association property="属性Bean名称" javaType="对应的Java类型"
select="延迟加载方法" column="数据库列名称"/> 延迟加载
<constructor >用于在实例化类时,注入结果到构造方法中
<idArg> 参数;标记出作为 ID 的结果可以帮助提高整体性能
<arg> 将被注入到构造方法的一个普通结果
<discriminator > 使用结果值来决定使用哪个 resultMap
<case > 基于某些值的结果映射
嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
(还有很多具体的应用--->看光放文档)
(7)cache缓存
- 基本上就是这样。这个简单语句的效果如下:
- 映射语句文件中的所有 select 语句的结果将会被缓存。
- 映射语句文件中的所有insert、update 和 delete 语句会刷新缓存。
- 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
- 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
- 缓存会保存列表或对象(无论查询方法返回哪种)的1024 个引用。
- 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
缓存只作用于 cache 标签所在的映射文件中的语句。
如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。
你需要使用 @CacheNamespaceRef 注解指定缓存作用域。
1、引用自定义缓存或第三方缓存
<cache type="com.domain.something.MyCustomCache"/>
2、可以配置缓存:
<cache type="com.domain.something.MyCustomCache">
<property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>
</cache>
3、缓存可以更改:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
(8)动态SQL
<if>
<where>
<foreach>
<choose> (<when>、<otherwise> )相当java的switch语句
<trim >(<where>、<set>)
<bind>
where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。
比如,和 where 元素等价的自定义 trim 元素为:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。
比如:
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
bind 元素允许你在 OGNL 表达式以外创建一个变量,并将其绑定到当前的上下文。
比如:
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>
三、注解
注解进行开发,就是进行代替映射的xml文件,不写xml文件也可以进行使用Mybatis
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@Results({@Result(),@Result()})或 @Results(@Result())
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
//封装的User实体类中有一个List<Account>集合对象
@Select("select * from user")
@Results(id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday"),
@Result(column="id",property="accounts",many=@Many(select="com.itheima.dao.IAccountDao.findByUid",fetchType=FetchType.LAZY))
})
List<User> findAll();