单击此处编辑标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,MyBatis,MyBatis,是支持普通,SQL,查询,存储过程等一个轻量级的,ORM,中间件。,MyBatisMyBatis 是支持普通 SQL查询,存储过,1,一、,myBatis,框架概述,与传统的,JDBC,开发相比,,MyBatis,消除了几乎所有的代码和参数的手工设置。,MyBatis,使用简单的,XML,或注解方式,用于配置和原始映射,将接口和,Java,的,POJOs,(,Plan Old Java Objects,,普通的,Java,对象)映射成数据库中的记录。,一、myBatis框架概述与传统的 JDBC 开发相比,M,2,二、,mybatis,与,hibernate,比较,Hibernate,基本上可以自动生成。其对数据库结构提供了较为完整的封装,开发效率上,如果使用纯面向对象方式,Hibernate,比较快,但如果以,HQL,其他方式相差不多。,可维护性方面,,mybatis,框架是以,sql,的开发方式,可以进行细粒度的优化。,Hibernate,自动生成的,sql,效果不理想。,二、mybatis 与 hibernate 比较Hibern,3,三、,Mybatis,开始,三、Mybatis开始,4,3.1 SqlSessionFactory,String resource=org/mybatis/example/Configuration.xml;,Reader reader=Resources.getResourceAsReader(resource);,SqlSessionFactory factory=,sqlSessionFactoryBuilder.build(reader,props);,3.1 SqlSessionFactory String r,5,3.2,调用,sql,SqlSession session=sqlMapper.openSession();,try,Blog blog=(Blog)session.selectOne(,selectBlog,101);,finally,session.close();,3.2 调用sqlSqlSession session=,6,3.3Mybatis,的文件组成,1 Configuration.xml,2,Mapper.xml,3.3Mybatis的文件组成1 Configuratio,7,1 Configuration.xml,系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器,1 Configuration.xml系统的核心设置,包含,8,1.1,Configuration.xml,简单的示例,1.1.1,配置数据源,1.1 Configuration.xml简单的示例1.1,9,1.1.2,告诉,MyBatis,到哪里去找相关映射文件,/Using url fully qualified paths,1.1.2告诉MyBatis到哪里去找相关映射文件mapp,10,2,Mapper.xml,定义具体,SQL,映射语句的文件,2 Mapper.xml定义具体SQL映射语句的文件,11,2.1,Mapper.xml,简单的示例,SELECT*FROM PERSON WHERE ID=#id,2.1 Mapper.xml简单的示例select id=,12,2.2,输入属性参数,parameterType,将会传入这条语句的参数类的完全限定名或别名。,2.2 输入属性参数parameterType 将会传入这,13,2.3,输出属性参数,resultType,或,resultMap,,但不能同时使用,resultType,从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。,resultMap,命名引用外部的,resultMap,。返回,map,是,MyBatis,最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被解决了。,2.3 输出属性参数resultType或resultMap,14,2.4 resultMap,2.4 resultMapresultMap id=Ba,15,2.5,使用上的区别,resultType,select,id,username,hashedPassword,from some_table,where id=#id,2.5 使用上的区别resultTypeselect id,16,select,user_id,as“id”,user_name,as“role.name”,from some_table,where id=#id,select id=”selectUsers”param,17,resultMap,引用它的语句使用,resultMap,属性就行了(注意我们去掉了,resultType,属性)。比如:,select,user_id,user_name,hashed_password,from some_table,where id=#id,resultMapresultMap id=userRe,18,2.6 resultMap,一对一、多对一,2.6 resultMap一对一、多对一resultMa,19,resultMap id=blogResult typ,20,resultMap,一对多,resultMap一对多collection prope,21,2.6,其他,delete,id=insertAuthor arameterType=domain.blog.Author,flushCache=true,statementType=PREPARED,2.6 其他insert id=insertAuthor,22,2.7,可重用的,SQL,代码段,id,username,password,这个,SQL,片段可以被包含在其他语句中,例如:,select,from some_table,where id=#id,2.7可重用的SQL代码段sql id=”userColu,23,2.8,动态,SQL,MyBatis,的一个强大的特性之一通常是它的动态,SQL,能力。如果你有使用,JDBC,或其他,相似框架的经验,你就明白条件地串联,SQL,字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态,SQL,可以彻底处理这种痛苦。,通常使用动态,SQL,不可能是独立的一部分,,MyBatis,当然使用一种强大的动态,SQL,语言来改进这种情形,这种语言可以被用在任意映射的,SQL,语句中。,2.8 动态SQL MyBatis的一个强大的特性之一通常是,24,例子,SELECT*FROM BLOG,WHERE state=ACTIVE,AND title like#title,例子select id=”findActiveBlogWi,25,处理了一个臭名昭著的动态,SQL,问题,state=#state,AND title like#title,AND title like#author.name,处理了一个臭名昭著的动态SQL问题,26,四 缓存机制,Mapper.xml,单独配置,四 缓存机制Mapper.xml单独配置,27,select*fromUSER,selectid=”getUserList”resul,28,使用其他缓存机制,使用其他缓存机制,29,五 事务机制,SqlSessionFactory,SqlSessionFactory,有六个方法可以用来创建,SqlSession,实例。通常来说,如何决定是你选择下面这些方法时:,五 事务机制SqlSessionFactory,30,SqlSession openSession(ExecutorType execType),SqlSession openSession(ExecutorType execType,boolean autoCommit),SqlSession openSession(ExecutorType execType,Connection connection),Configuration getConfiguration();,SqlSession openSession(Executo,31,默认的,openSession(),方法没有参数,它会创建有如下特性的,SqlSession,:,会开启一个事务(也就是不自动提交),连接对象会从由活动环境配置的数据源实例中得到。,事务隔离级别将会使用驱动或数据源的默认设置。,预处理语句不会被复用,也不会批量处理更新。,这些方法大都可以自我解释的。开启自动提交,传递“,true”,给可选的,autoCommit,参数。提供自定义的连接,传递一个,Connection,实例给,connection,参数。注意没有覆盖同时设置,Connection,和,autoCommit,两者的方法,因为,MyBatis,会使用当前,connection,对象提供的设置。,MyBatis,为事务隔离级别调用使用一个,Java,枚举包装器,称为,TransactionIsolationLevel,,否则它们按预期的方式来工作,并有,JDBC,支持的,5,级(,NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE,),还有,默认的openSession()方法没有参数,它会创建有如下,32,tx:advice id=txAdvice trans,33,