mapper标签

  • <!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,比如一些插入语句内部可能有嵌入索引调用,这样它就会在插入语句之后执行了
    • 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="">
  • <resultMap>
    • 用来描述从数据库结果集中来加载对象,它是最复杂、最强大的元素
    • 它能提供映射规则
    • 级联
      • 级联不是必须的,级联的好处是获取关联数据十分便捷
      • 级联不能过多,过多会增加系统的复杂度,同时降低系统的性能,此增彼减,所以当级联的层数超过3层时,就不要考虑级联了,因为会造成多个对象的关联,导致系统的耦合、复杂和难以维护。
      • 级联会出现N+1的问题
        • 假设现在又N个关联关系完成了级联,那么只要再加入一个关联关系,就变成了N+1个级联,所有的级联SQL都会被执行,显然会有很多并不是我们关心的数据被取出,这样就会造成很大的资源浪费,这就是N+1的问题
        • 解决问题:延迟加载
      • MyBatis的级联分为3种
        • 鉴别器(discriminator):它是一个根据某些条件决定采用具体实现类级联的方案(比如根据性别的区分)
          • <case>
            • 类似于java中的switch...case...语句
            • value=" "
            • resultMap="要映射的那个resultMap"
        • 一对一(association):比如学生证和学生就是一对一的级联
          • property
            • 代表映射到POJO属性上
          • column
            • 代表SQL的列
          • fetchType(配置延迟)
            • eager:获取当前POJO后立即加载对应的数据(当配置这个,fetchType属性会忽略全局配置项)
            • lazy:获取当前POJO后延迟加载对应的数据
        • 一对多(collection):比如班主任和学生就是一种一对多的级联
          • ofType
          • 声明实体映射,跟javaType一样
          • fetchType(配置延迟)
            • eager:获取当前POJO后立即加载对应的数据(当配置这个,fetchType属性会忽略全局配置项)
            • lazy:获取当前POJO后延迟加载对应的数据
        • 注:MyBatis没有多对多的级联,因为多对多级联比较复杂,使用困难,而且可以通过两个一对多级联进行替换,所以MyBatis不支持多对多级联了
    • 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>
    • 其他命名空间缓存配置的引用
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值