MyBatis框架学习总结

经过了大约四个月的框架学习,我基本掌握了SSM框架的大致应用,也实践了一些项目。

以下是我在阅读Java EE互联网轻量级框架整合开发一书中做的笔记(MyBatis框架重点),Sping与SpringMVC的学习笔记我会在以后陆续发布

1.当创建结果集时,MyBatis会使用一个对象工厂来完成创建这个结果集实例。
2.在默认的情况下,MyBatis会使用其定义的对象工厂———— DefaultObjectFactory来完成对应的工作,Mybatis允许注册自定义的ObjectFactory。如果自定义,则需要实现接口org.apache.ibatis.reflection.factory.ObjectFactory,并给予配置。
3.插件是Mybatis中最强大和最灵活的组件,同时也最复杂、最难以使用的组件,而且他十分危险,因为它将覆盖MyBatis底层对象的核心方法和属性。如果操作不当将产生严重后果,甚至是摧毁MyBatis框架。所以在研究插件前,要清楚掌握MyBatis底层的构成和运行原理,否则将难以安全高效地使用它。
4.在MyBatis中,运行环境主要的作用是配置数据库信息,它可以配置多个数据库,一般而言只需要其中的一个就可以了。它下面又分为两个可配置的元素: 事务管理器(transactionManager)、数据源(dataSource)。在实际的工作中,大部分情况下会采用Spring对数据源和数据库的事务进行管理。transactionManager主要的工作就是提交(commit)、回滚(rollback)和关闭(close)数据库的事务。
5.MyBatis为Transaction提供了两个实现类:JdbcTransaction和ManagedTransaction,于是它对应着两种工厂:JdbcTransactionFactory和ManagedTransactionFactory
    这两个工厂需要实现 TransactionFactory接口,通过它们会生成对应的Transaction对象。
    不想采用MyBatis的规则时,我们可以实现并配置一个自定义事务工厂、最后自定义事务类,分别实现事务工厂与事务类,这样便可以自定义事务规则。
6.environment数据源环境:UNPOOLED采用非数据库池的管理方式,每次请求都会打开一个新的数据库连接,所以创建会比较慢。在一些对性能没有很高要求的场合可以使用它。对有些数据库而言,使用连接池并不重要,那么它也是一个理想的选择,当然也可以自定义数据源工厂。
7.数据源JNDI的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用,这种数据源配置只需要两个属性:initial_context、data_source。
8.通过实践,我们知道使用多数据库SQL时需要配置 databaseIdProvidertype的属性,当databaseIdProvidertype属性被配置时,系统会优先取到和数据库配置一致的SQL,如果没有,则取没有databaseId的SQL(任何适配数据库),可以把它当做默认值。如果还是没有取到,则会抛出异常,说明无法匹配到对应的SQL。
9.映射器是MyBatis最复杂、最核心的组件。映射器定义命名空间(namespace)的方法,命名空间对应的是一个接口的全路径,而不是实现类。
10.引入映射器的方法有如下几种:用文件路径引入映射器、用包名引入映射器、用类注册引入映射器、用userMapper.xml引入映射器,映射器是MyBatis最复杂且最重要的组件。它由一个接口加上XML文件(或者注解)组成。在映射器中可以配置参数、各类的SQL语句、存储过程、缓存、级联等复杂的内容,并且通过简易的映射规则就可映射到指定的POJO或者其他的对象上,映射器能有效消除JDBC底层的代码。
11.在MyBatis应用程序开发中,映射器的工作量占全部工作量的80%。在MyBatis中映射器的配置顶级元素不多,但里面的一些细节,比如缓存、级联、#和$字符的替换、参数、存储过程、映射规则等需要我们学习。
12.面对复杂性,SQL会显得无力,尤其是长SQL。
    注解的可读性较差
    注解丢失了XML上下文相互引用的功能。基于实际情况,所以 主要推荐使用XML实现方式
13.select元素在实际工作中用的最多的是id、parameter、resultType、resultMap,如果要设置缓存,还会使用到flushCache、useCache,其他都是不常用的功能
    select count(*) total from t_user where user_name like concat('%',#{firstName},'%')
14.自动映射和驼峰映射:Mybatis提供了自动映射功能,在默认情况下自动映射的功能是开启的,使用它的好处在于有效减少大量的映射配置,从而减少工作量。
15.配置自动映射的autoMappingBehavior选项的取值范围:NONE,不进行自动映射。PARTIAL,默认值,只对没有嵌套结果集进行自动映射。FULL,对所有的结果集进行自动映射,包括嵌套结果集。,默认情况下,使用默认的PARTIAL级别就可以了。为了实现自动映射,首先要给出POJO,若配置驼峰映射的mapUnderscoreToCamelCase选项设置为true,MyBatis将严格按照驼峰命名的方式做自动映射,只是这样会严格要求数据字段和POJO的属性名严格对应,降低了灵活性,这也是在实际工作中需要考虑的问题。
16.resultType也可以使用别名,但要符合别名规范,且不能和resultMap同时使用,resultMap能提供自定义映射规则的机会
17.传递多个参数:使用map接口传递参数、使用注解传递多个参数、使用Java Bean传递多个参数、混合使用
18.map传递多个参数使用几乎所有场景,但是我们用的并不多,其一因为使用者要通过阅读它的键,才能明了其作用;还有则是因为map不能限定其传递的数据类型,因此业务性质不强,可读性差。
19.通过读写使可读性大大提高,但同时也会给我们带来一个麻烦,若SQL很复杂,拥有大于10个参数,那么接口方法的参数就是多个了,使用起来就很不容易了,因此有了Java Bean传递多个参数,定义一个参数的POJO——RoleParams,此时接口方法定义为public List<Role> findRolesByBean(RoleParams roleParam);然后引入Java Bean定义的属性作为参数查询数据。
20.当使用两种POJO映射关系时,即可使用缓和使用集中方法来传递多个参数,如注解和Java Bean方式混合使用。
    当参数个数小于等于5时,通过注解传参时最佳方式,大于5时则使用Java Bean更好,因为它更加直观,否则会给调用带困难
21.使用resultMap映射结果集:自动映射和驼峰映射比较简单,无法定义多的属性,比如typeHandler、级联等。在select元素中的属性resultMap制定了采用哪个resultMap作为其映射规则。
22.MyBatis不仅支持分页,还内置了一个专门处理分页的类————RowBounds,offset属性是偏移量,即从第几行开始读取记录,limit是限制条数。使用它十分简单,只要给 接口增加一个RowBounds参数即可,映射文件中没有任何关于RowBounds参数的信息,它是MyBatis的一个附加参数,MyBatis会自动识别它,据此进行分页。
23.MyBatis的级联分为鉴别器(discriminator)、一对一(association)、一对多(collection).
24.MyBatis没有多对多级联,因为多对多级联比较复杂,使用困难,而且通过两个一对多级联进行替换,所以MyBatis不支持多对多级联. (级联模型建表、POJO实现、配置映射文件)
25.<settings>配置中的两个元素用于配置级联。lazyLoadingEnabled是一个开关,决定开不开启延迟加载,默认值为false,则不开启延迟加载。aggressiveLazyLoading积极延迟加载(将带有延迟属性的对象完整加载,否则按需加载)
26. javaType为所求数据级联对象的Java数据类型, property为映射到列结果的字段和属性。
27.在级联元素中,association是通过javaType的定义去声明实体映射的,而 collection则是使用ofType进行声明的。
28.EnumOrdinalTypeHandler为枚举类型默认转换、通过枚举数组下标索引方式进行匹配转化;EnumTypeHandler通过名称转化为对应的枚举

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值