资源描述
公司内部培训公司内部培训mybatis3一、一、myBatis框架概述框架概述n n与传统的JDBC开发相比,MyBatis消除了几乎所有的代码和参数的手工设置。n nMyBatis使用简单的XML或注解方式,用于配置和原始映射,将接口和Java的POJOs(PlanOldJavaObjects,普通的Java对象)映射成数据库中的记录。二、二、mybatis 与与 hibernate 比较比较n nHibernate基本上可以自动生成。其对数据库结构提供了较为完整的封装n n开发效率上,如果使用纯面向对象方式Hibernate比较快,但如果以HQL其他方式相差不多。n n可维护性方面,mybatis框架是以sql的开发方式,可以进行细粒度的优化。n nHibernate自动生成的sql效果不理想。三、三、Mybatis开始开始3.1 SqlSessionFactory n nStringresource=Stringresource=org/mybatis/example/Configuration.xml;org/mybatis/example/Configuration.xml;n nReaderreader=Readerreader=Resources.getResourceAsReader(resource);Resources.getResourceAsReader(resource);n nSqlSessionFactoryfactory=SqlSessionFactoryfactory=n nsqlSessionFactoryBuilder.build(reader,props);sqlSessionFactoryBuilder.build(reader,props);3.2 调用调用sqln nSqlSessionsession=sqlMapper.openSession();n ntryn nBlogblog=(Blog)session.selectOne(n nselectBlog,101);n nfinallyn nsession.close();n n3.3Mybatis的文件组成的文件组成n n1Configuration.xmln n2Mapper.xml1 Configuration.xmln n系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器1.1 Configuration.xml简单的示例n n1.1.11.1.1配置数据源配置数据源n n n n n n n n1.1.2告诉告诉MyBatis到哪里到哪里去找相关映射文件去找相关映射文件n nn nn nn nn nn n/Usingurlfullyqualifiedpaths/Usingurlfullyqualifiedpathsn nn nn nn nn n2 Mapper.xmln n定义具体SQL映射语句的文件2.1 Mapper.xml简单的示例n n n nSELECT*FROMPERSONWHEREID=#idn n2.2 输入属性参数输入属性参数n nparameterType将会传入这条语句的参数类的完全限定名或别名。2.3 输出属性参数输出属性参数n nresultTyperesultType或或resultMapresultMap,但不能同时使用,但不能同时使用n nresultTyperesultType从这条语句中返回的期望类型从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本应该是集合可以包含的类型,而不能是集合本身。身。n nresultMapresultMap命名引用外部的命名引用外部的resultMapresultMap。返。返回回mapmap是是MyBatisMyBatis最具力量的特性,对其有一个最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被很好的理解的话,许多复杂映射的情形就能被解决了。解决了。2.4 resultMapresultMapid=BaseResultMaptype=com.dingxun.tiku.vo.Area idcolumn=area_idjdbcType=INTEGERproperty=areaId/resultcolumn=codejdbcType=VARCHARproperty=code/resultcolumn=parentjdbcType=INTEGERproperty=parent/2.5 使用上的区别使用上的区别resultTypen nn nselectid,username,hashedPasswordn nfromsome_tablen nwhereid=#idn nn nselectid=”selectUsers”n nselectselectn nuser_iduser_idas“id”as“id”,n nuser_nameuser_nameas“role.name”as“role.name”,n nfromsome_tablefromsome_tablen nwhereid=#idwhereid=#idn nresultMapn nresultMapid=type=Usern nn nn nn n n n引用它的语句使用引用它的语句使用resultMapresultMap属性就行了(注意我们去掉了属性就行了(注意我们去掉了resultTyperesultType属性)。比如:属性)。比如:n nselectid=”selectUsers”parameterType=”int”n nselectselectuser_id,user_name,hashed_passworduser_id,user_name,hashed_password n nfromsome_tablefromsome_tablen nwhereid=#idwhereid=#idn n2.6 resultMap一对一、多对一一对一、多对一n nresultMapid=n nidcolumn=/n nresultcolumn=/n nassociationproperty=n n idcolumn=/n nresultcolumn=/n nn nn n n n n nn nassociationproperty=authorcolumn=blog_author_idresultMap=”authorResult”/n n n n n n n nn nn n resultMap一对多一对多n n n n n nn nn n2.6 其他其他n n timeout=20000n n timeout=20000n n deletedeleteid=insertAuthorarameterType=domain.blog.Authorid=insertAuthorarameterType=domain.blog.Author flushCache=trueflushCache=true statementType=PREPAREDstatementType=PREPARED2.7可重用的SQL代码段n nid,username,passwordid,username,passwordn n这个这个SQLSQL片段可以被包含在其他语句中,例如:片段可以被包含在其他语句中,例如:n nselectid=”selectUsers”resultType=”hashmap”n nselectselectn nfromsome_tablefromsome_tablen nwhereid=#idwhereid=#idn n2.8 动态SQL n nMyBatisMyBatis的一个强大的特性之一通常是它的动态的一个强大的特性之一通常是它的动态SQLSQL能力。如果你有使用能力。如果你有使用JDBCJDBC或其他或其他n n相似框架的经验,你就明白条件地串联相似框架的经验,你就明白条件地串联SQLSQL字字符串在一起是多么的痛苦,确保不能忘了空格符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态或在列表的最后省略逗号。动态SQLSQL可以彻底可以彻底处理这种痛苦。处理这种痛苦。n n通常使用动态通常使用动态SQLSQL不可能是独立的一部分,不可能是独立的一部分,MyBatisMyBatis当然使用一种强大的动态当然使用一种强大的动态SQLSQL语言来改语言来改进这种情形,这种语言可以被用在任意映射的进这种情形,这种语言可以被用在任意映射的SQLSQL语句中。语句中。例子例子n nselectid=”findActiveBlogWithTitleLike”parameterType=”Blog”resultType=”Blog”n nSELECT*FROMBLOGSELECT*FROMBLOGn nWHEREstate=ACTIVEWHEREstate=ACTIVEn nn nANDtitlelike#titleANDtitlelike#titlen n n n处理了一个臭名昭著的动态SQL问题n n n nn nstate=#statestate=#staten nn nn nANDtitlelike#titleANDtitlelike#titlen nn nn nANDtitlelike#author.nameANDtitlelike#author.namen nn n 四四 缓存机制缓存机制n nMapper.xmlMapper.xml单独配置单独配置单独配置单独配置n ncacheModeln nflushInterval/n nflushOnExecute/n nflushOnExecute/n nflushOnExecute/n nproperty/n nn nselectn nselect*fromUSERselect*fromUSERn n n nselect.flushCache=”false”useCache=”true”/n nn nn n 使用其他缓存机制使用其他缓存机制n n五五 事务机制事务机制n nSqlSessionFactory n nSqlSessionFactory有六个方法可以用来创建SqlSession实例。通常来说,如何决定是你选择下面这些方法时:n nSqlSessionopenSession(ExecutorTypeexecType)n nSqlSessionopenSession(ExecutorTypeexecType,booleanautoCommit)n nSqlSessionopenSession(ExecutorTypeexecType,Connectionconnection)n nConfigurationgetConfiguration();n n默认的默认的openSession()openSession()方法没有参数,它会创建有如下特性的方法没有参数,它会创建有如下特性的SqlSessionSqlSession:n n 会开启一个事务(也就是不自动提交)会开启一个事务(也就是不自动提交)n n 连接对象会从由活动环境配置的数据源实例中得到。连接对象会从由活动环境配置的数据源实例中得到。n n 事务隔离级别将会使用驱动或数据源的默认设置。事务隔离级别将会使用驱动或数据源的默认设置。n n 预处理语句不会被复用,也不会批量处理更新。预处理语句不会被复用,也不会批量处理更新。n n这些方法大都可以自我解释的。开启自动提交,传递这些方法大都可以自我解释的。开启自动提交,传递“true”true”给可选的给可选的autoCommitautoCommit参数。提供自定义的连接,传递一个参数。提供自定义的连接,传递一个ConnectionConnection实例给实例给connectionconnection参数。注意没有覆盖同时设置参数。注意没有覆盖同时设置ConnectionConnection和和autoCommitautoCommit两者两者的方法,因为的方法,因为MyBatisMyBatis会使用当前会使用当前connectionconnection对象提供的设置。对象提供的设置。MyBatisMyBatis为为事务隔离级别调用使用一个事务隔离级别调用使用一个JavaJava枚举包装器,称为枚举包装器,称为TransactionIsolationLevelTransactionIsolationLevel,否则它们按预期的方式来工作,并有,否则它们按预期的方式来工作,并有JDBCJDBC支支持的持的5 5级级(NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READNONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE,SERIALIZABLE)n n还有还有n ntx:adviceid=n nn ntx:methodname=/n ntx:methodname=/n ntx:methodname=/n ntx:methodname=/n ntx:methodname=/n nn n
展开阅读全文