浅谈mybatis

      mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

 

  1. 软件框架(Framework): 用于解决软件中的通用型(共性)问题
  2. 持久层框架(数据访问层):用于更好解决数据持久化问题
  3. 半自动的ORM框架:解决对象关系映射问题。而hibernate (ORM 框架) :用于解决数据的持久化问题(数据库操作)

 

框架MyBatis开发优势

封装了JDBC共性,简化了代码的编写,提高了代码的开发速度,以及可维护性。 合理的架构设计,提高了系统的稳定性,访问性能,可扩展性。

(JDBC 编程的基本步骤如下:

 

TypeHandler          负责java数据类型和jdbc数据类型之间的映射和转换

MappedStatement   MappedStatement维护了一条<select|update|delete|insert>节点的封装,

SqlSource            负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回

BoundSql             表示动态生成的SQL语句以及相应的参数信息

Configuration        MyBatis所有的配置信息都维持在Configuration对象之中。

 

MyBatis 项目中核心API:

 

SqlSession            作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能

Executor              MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护

StatementHandler   封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。

ParameterHandler   负责对用户传递的参数转换成JDBC Statement 所需要的参数,

ResultSetHandler    负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;

 

MyBatis 核心应用组件:

MyBatis基础服务层主要负责提供如下几个方面的服务:

 

MyBatis接口应用层主要负责对外提供应用服务,主要为增删改查

MyBatis数据处理层主要负责处理数据访问问题:

 

 

  1. 加载驱动程序Driver (Class.forName(“com.mysql.jdbc.Driver”))
  2. 建立连接Connection (DriverManager.getConnection(url,username,password))
  3. 创建Statement (conn.createStatement())
  4. 发送sql (stmt.executeUpdate(sql))
  5. 处理结果ResultSet (while(rs.next))
  6. 释放资源(close))
  7. SqlSessionFactoryBuilder (负责读取配置文件,创建SqlSessionFactory对象)
  8. SqlSessionFactory(负责创建SqlSession对象)
  9. SqlSession(负责连接的维护,事务的处理,类似JDBC中的Connection)
  10. 配置文件(提供基础配置信息,例如连接配置,缓存配置,映射配置)
  11. 映射文件(定义SQL映射):ORM
  12. 连接服务 (配置连接池,)
  13. 事务服务(保证数据的原子性,一致性,隔离性,持久性)
  14. 缓存服务(更好的提高查询性能)
  15. 配置服务 (别名配置,映射配置,...,日志配置,....)
  16. SQL参数映射(Dao方法参数与映射文件中#{}表达式映射)
  17. SQL解析(语法,语义) 例如: select * from blog where id=#{id}
  18. SQL 执行(将sql发送到数据库端执行)
  19. SQL 结果映射(例如将ResultSet中的数据存到map)

日志配置应用

Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

1)SLF4J(日志框架标准,类似JDBC标准)

2)Apache Commons Logging

3)Log4j 2 (是log4j的升级版,配置文件升级为xml格式了)

4)Log4j(日志处理库,配置文件格式为.properties)

5)JDK logging

项目中mybatis通常会借助第三方日志库进行日志的处理,例如log4j.

 

Mybatis缓存:

  1. 缓存是什么? 内存中的一个对象(容器).
  2. 缓存对象的作用?提高程序的性能(最主要的的是访问效率)
  3. MyBatis 中缓存概述?

MyBatis 框架中提供了非常强大的缓存特性来提高查询性能,通常可将其分为一级缓存(SqlSession级别)和二级缓存(SqlSessionFactory级别)。

 

一级缓存应用说明:

  1. 默认是开启的(也是应用最多的一种)
  2. 其类型为SESSION或STATEMENT两种,默认是SESSION类型
    1. )缓存对象的生命周期不同(例如session类型的一级缓存,session关闭就失效.)
    2. )其类型的配置可在配置文件中通过这个localCacheScope属性进行配置。
  3. 一级缓存在每次更新(同一个session)后都会失效。
  4. 一级缓存在事务并发执行时可能会出现脏读,但相对于STATEMENT效率会高一些。

二级缓存应用:

MyBatis 二级缓存默认是没有开启的,需要在映射文件中加上<Cache/>元素

1) eviction 表示回收策略(例如LRU,FIFO等,默认为LRU)

2) flushInterval 表示刷新间隔

3) size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。

4) readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。可读写的缓存会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。

readOnly说明:

1)readOnly的值为true时,缓存中保存的是堆内存中对象的引用.每次从缓存取数据都是获得的同一个对象.readOnly为false时,首先会将查询到的对象,拷贝到缓存一份(对象需要实现序列化接口),然后从缓存取数据每次都是执行对象的拷贝.

2)MyBatis 中的二级缓存同样存在脏读问题,尤其是在分布式应用场景中表现出的问题就会更加突出。

 

mybatis中的高级映射

MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现.

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

说说不同点吧,resultType 和restltMap

restulyType:

1.对应的是java对象中的属性,大小写不敏感,

2.如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,大小写敏感

3.resultMap:指的是定义好了的id的,是定义好的resyltType的引用

注意:用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用,而且resultMap可以用typeHander转换

4.type:java 对象对应的类,id:在本文件要唯一column :数据库的列名或别名,property:对应java对象的属性,jdbcType:java.sql.Types

查询语句中,resultMap属性指向上面那个属性的标签的id

parameterType:参数类型,只能传一个参数,如果有多个参数要封装,如封装成一个类,要写包名加类名,基本数据类型则可以省略

5.一对1、一对多时,若有表的字段相同必须写别名,不然查询结果无法正常映射,出现某属性为空或者返回的结果与想象中的不同,而这往往是没有报错的。

6.若有意外中的错误,反复检查以上几点,和认真核查自己的sql语句,mapper.xml文件是否配置正确。

以上仅是一些总结,也有也是借鉴了他人的帖子,希望大家多多指导!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值