- <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
- 注解mapper少用的原因
- 面对复杂性,SQL会显得无力,尤其是长SQL
- 注解的可读性较差
- 功能上,注解丢失了XML上下文相互引用的功能
- <select>
- 查询语句,最常用、最复杂的元素之一
- 可以自定义参数,返回结果集等
- 分页查询
- RowBounds(自己写的类)
- 只能运用于一些小数据量的查询
- 它的性能并不佳,此时可以通过分页插件去处理
- id
- 注:配合Mapper的全限定名,联合成为一个唯一标识(不考虑数据库厂商标识的前提下),用于标识这条SQL
- 它和Mapper的命名空间组合起来是唯一的,供MyBatis调用
- 如果命名空间和id结合起来不唯一,MyBatis将抛出异常
- parameterType
- 注:parameterType表示这条SQL接受的参数类型
- 可以给出类的全命名,也可以给出别名(别名必须是MyBatis内部定义或者自定义的)
- 可以选择Java Bean、Map等简单的参数类型传递给SQL
- 使用map传递参数导致了业务可读性的丧失,导致后续扩展和维护的困难,在实际的应用中要过段废弃这种方式
- 使用@Param注解传递多个参数,受到参数个数(n)的影响,当n<=5时,这是最佳的传参方式,它比用java Bean更好,因为它更加直观;当n>5时,多个参数将给调用带来困难,此时并不推荐它
- 当参数个数多于5个时,建议使用java Bean方式
- 对于使用混合参数的,要明确参数的合理性。
- resultType
- 注:resultType表示这条SQL返回的结果类型
- 定义类的全路径,在允许自动匹配的情况下,结果集将通过Java Bean的规范映射
- 或定义为:int、double、float、map等参数
- resultMap
- 它是映射集的引用,将执行强大的映射功能。
- 提供自定义映射规则
- 可以配置映射规则、级联、typeHandler
- id:标识
- ttype:代表哪个类作为其映射的类,可以是别名或者全限定名
- <id>
- resultMap的主键
- propertity代表POJO的属性名称
- column:SQL的列名,把POJO的属性和SQL的列名做对应
- <result>
- propertity代表POJO的属性名称
- column:SQL的列名,把POJO的属性和SQL的列名做对应
- flushCache(设置缓存)
- 作用是在调用SQL后,是否要求MyBatis清空之前查询本地缓存和二级缓存
- 取值为布尔类型,默认为false
- userCache(设置缓存)
- 启动自动缓存的开关,是否要求MyBatis将此次结果缓存
- 取值为布尔值,默认为true
- timeout
- 设置超时参数,超时时将抛出异常,单位为妙
- 默认值是数据库厂商提供的JDBC驱动所设置的秒数
- fetchSize
- 获取记录的总条数设定
- 默认是数据库厂商提供的JDBC驱动所设置的条数
- statementType
- 告诉MyBatis使用哪个JDBC的Statement工作,取值为STATEMENT(statement)、PREPARED(preparedStatement)、CALLABLE(callableStatement)
- 默认是值PREPARED
- resultSetType
- 这是对JDBC的resultSet接口而言,它的值包括FORWARD_ONLY(游标允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在resultSet中反映出来)、SCROLL_INSENSITIVE(双向滚动,并及时跟踪数据库的更新,以便更改resultSet中的数据)
- 默认值是数据库厂商提供的JDBC驱动所设置的
- databaseId
- 提供多种数据库支持
- 其它详情见databaseId
- resultOrdered
- 这个设置适用于嵌套结果select语句。
- 如果为true,就是假设包含了嵌套结果集或是分组了,当返回一个主结果行时,就不能引用前面结果集了。这就确保了在获取嵌套的结果集时不至于导致内存不够用
- 取值为布尔,默认为false
- resultSets(很少适用)
- 适用于多个结果集的情况,它将列出执行SQL后每个结果集的名称,每个名称之间用逗号分隔
- <insert>
- 插入语句
- 执行后返回一个整数,代表插入的条数
- 自定义主键
- 用到<selectKey>
- keyProperty
- 指定采用哪个属性作为POJO的主键
- resultType
- 告诉MyBatis将返回一个long型的结果集
- order
- 设置为BEFORE,说明它会在插入之前会先执行生成主键的SQL
- 如果有一些特殊需要,可以把它设置为AFTER,比如一些插入语句内部可能有嵌入索引调用,这样它就会在插入语句之后执行了
- keyProperty
- 用到<selectKey>
- id
- SQL编号,用于标识这条SQL
- 命名空间+id+databaseId唯一,否则MyBatis会抛出异常
- parameterType
- 参数类型,同select
- 和select相同,可以是单个参数或者多个参数
- flushCache
- 是否刷新缓存,可以配置true/false,为true时,插入时会刷新一级缓存和二级缓存,否则不刷新
- 默认为true
- timeout
- 超时时间,单位为秒
- statementType
- STATEMENT,PREPARED或者CALLABLE中的一个,这会让MyBatis分别使用Statement、preparedStatement(预编译)或CallableStatement(存储过程)
- 默认值:PREPARED
- userGeneratedKeys
- 是否开始JDBC的getGeneratedKeys方法来取出数据库内部生成的主键。(比如MySQL和SQL Server这样的数据库表的自增主键)
- 默认值:false
- keyProperty
- (仅对insert和update有用)唯一标识一个属性,MyBatis会通过getGeneratedKeys的返回值,或者通过insert语句的selectKey子元素设置它的键值。如果是复合主键,要把每一个名称用逗号(,)隔开
- 默认值为unset,不能和KeyColumn连用
- keyColumn
- (仅对insert和update有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像PostgreSQL)中是必须的,当主键列不是表中的第一列时需要设置。如果是复合主键,要把每一个名称用逗号(,)隔开
- 不能和keyProperty连用
- <update>
- 更新语句
- 执行后返回一个整数,代表更新的条数
- 和insert属性差不多
- <delete>
- 删除语句
- 执行后返回一个整数,代表删除条数
- 和insert属性差不多
- <parameterMap>
- 注意:即将被删除的元素,不建议大家使用
- 定义参数映射关系
- <sql>
- 允许定义一部分SQL,然后在各个地方引用它
- 在其它地方用<include>标签,refid="SQL的ID"引入
- 定义一个命名为alias的变量,在其它地方通过${alias}来引用它
- 格式:<property name="alias" value="">
- 定义一个命名为alias的变量,在其它地方通过${alias}来引用它
- <resultMap>
- 用来描述从数据库结果集中来加载对象,它是最复杂、最强大的元素
- 它能提供映射规则
- 级联
- 级联不是必须的,级联的好处是获取关联数据十分便捷
- 级联不能过多,过多会增加系统的复杂度,同时降低系统的性能,此增彼减,所以当级联的层数超过3层时,就不要考虑级联了,因为会造成多个对象的关联,导致系统的耦合、复杂和难以维护。
- 级联会出现N+1的问题
- 假设现在又N个关联关系完成了级联,那么只要再加入一个关联关系,就变成了N+1个级联,所有的级联SQL都会被执行,显然会有很多并不是我们关心的数据被取出,这样就会造成很大的资源浪费,这就是N+1的问题
- 解决问题:延迟加载
- MyBatis的级联分为3种
- 鉴别器(discriminator):它是一个根据某些条件决定采用具体实现类级联的方案(比如根据性别的区分)
- <case>
- 类似于java中的switch...case...语句
- value=" "
- resultMap="要映射的那个resultMap"
- <case>
- 一对一(association):比如学生证和学生就是一对一的级联
- property
- 代表映射到POJO属性上
- column
- 代表SQL的列
- fetchType(配置延迟)
- eager:获取当前POJO后立即加载对应的数据(当配置这个,fetchType属性会忽略全局配置项)
- lazy:获取当前POJO后延迟加载对应的数据
- property
- 一对多(collection):比如班主任和学生就是一种一对多的级联
- ofType
- 声明实体映射,跟javaType一样
- fetchType(配置延迟)
- eager:获取当前POJO后立即加载对应的数据(当配置这个,fetchType属性会忽略全局配置项)
- lazy:获取当前POJO后延迟加载对应的数据
- 注:MyBatis没有多对多的级联,因为多对多级联比较复杂,使用困难,而且可以通过两个一对多级联进行替换,所以MyBatis不支持多对多级联了
- 鉴别器(discriminator):它是一个根据某些条件决定采用具体实现类级联的方案(比如根据性别的区分)
- id
- 标识
- type
- 代表需要映射的POJO
- property
- 映射到列结果的字段或属性。如果POJO的属性匹配的是存在的且与给定的SQL列名(column元素)相同的,那么MyBatis就会映射到POJO上
- column
- 对应的是SQL的列
- javaType
- 配置java的类型
- 可以是特定的类完全限定名或MyBatis上下文的别名
- jdbcType
- 配置数据库类型
- 这是一个JDBC的类型,MyBatis已经做了限定,支持大部分常用的数据库类型
- typeHandler
- 类型处理器
- 允许用特定的处理器来覆盖MyBatis默认的处理器。这就要制定jdbcType和javaType相互转化的规则
- <constructor>
- 用于配置构造方法
- <cache/>
- 给定命名空间的缓存设置
- 加入这个元素后,MyBatis就会将对应的命名空间所有的select元素查询进行缓存,而其中的insert、delete和update语句在操作时会刷新缓存
- 自定义缓存
- 实现MyBatis接口(org.apache.ibatis.cache.Cache)
- blocking
- 是否使用阻塞性缓存,在读/写时它会加入JNI的锁进行操作
- 布尔值,默认为:false
- 注:可保证读/写安全性,但加锁后性能不佳
- readOnly
- 缓存内容是否读写
- 布尔值,默认值:false
- eviction
- 缓存策略分为:
- LRU:最近最少使用:移除时间不被使用的对象
- FIFI:先进先出,按对象进入缓存的顺序来移除它们
- SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
- WEAK:弱引用,更积极移除基于垃圾回收器状态和弱引用规则的对象
- 默认值:LRU
- 缓存策略分为:
- flushInterval
- 这是一个整数,它以毫秒为单位,比如1分钟刷新一次,则配置60000。
- 默认为null,也就是没有刷新时间,只有当执行update时,insert和delete语句才会刷新
- 注:超过整数后,缓存失效,不在读取缓存,而是执行SQL取回数据
- type
- 用于自定义缓存类
- 自定义缓存类,要求实现接口(org.apache.ibatis.cache.Cache)
- size
- 缓存对象个数
- 正整数,默认为:1024
- <cache-ref>
- 其他命名空间缓存配置的引用
mapper标签
猜你喜欢
转载自blog.csdn.net/weixin_41640994/article/details/82803397
今日推荐
周排行