




已阅读5页,还剩134页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MyBaties 第1章MyBatis入门 课程地位 本章内容 持久层与持久化介绍MyBatis使用MyBatis操作数据 本章目标 理解持久层与持久化的概念了解MyBatis框架掌握使用MyBatis操作数据 持久层与持久化 知识点回顾 三层分为哪三层 每一层的作用是什么 持久层 所谓 持久层 是指在系统逻辑层面上 专注于实现数据持久化的一个相对独立的领域 Domain 一个完善的持久化层应该能达到以下目标 代码的可重用性高 能完成所有数据库的访问操作可以支持多种数据库平台具有相对独立性 当持久层的实现发生变化时 不影响上层的实现 持久化 狭义的理解 持久化 指将域对象永久保存至数据库中广义的理解 持久化 包括与数据库相关的各种操作保存 将域对象永久保存至数据库中更新 更新数据库中域对象的状态删除 从数据库中删除一个域对象加载 根据特定的OID 将一个域对象从数据库加载至内存查询 根据特定的查询条件 将符合查询条件的一个或多个域对象从数据库加载至内存 JDBC实现查询分析我们先看看我们最熟悉也是最基础的通过JDBC查询数据库数据 一般需要以下七个步骤 加载JDBC驱动建立并获取数据库连接创建JDBCStatements对象设置SQL语句的传入参数执行SQL语句并获得查询结果对查询结果进行转换处理并将处理结果返回释放相关资源 关闭Connection 关闭Statement 关闭ResultSet 1 从JDBC到MyBatis 第一步优化 连接获取和释放数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题 通过连接池就可以反复利用已经建立的连接去访问数据库了 减少连接的开启和关闭的时间 可以通过DataSource进行隔离解耦 我们统一从DataSource里面获取数据库连接 DataSource具体由DBCP实现还是由容器的JNDI实现都可以 所以我们将DataSource的具体实现通过让用户配置来应对变化 1 从JDBC到MyBatis 第二步优化 SQL统一存取我们使用JDBC进行操作数据库时 SQL语句基本都散落在各个JAVA类中 这样有三个不足之处 可读性很差 不利于维护以及做性能调优改动Java代码需要重新编译 打包部署不利于取出SQL在数据库客户端执行 取出后还得删掉中间的Java代码 编写好的SQL语句写好后还得通过 号在Java进行拼凑 可以将这些SQL语句统一集中放到配置文件或者数据库里面 以key value的格式存放 然后通过SQL语句的key值去获取对应的SQL语句 既然我们将SQL语句都统一放在配置文件或者数据库中 那么这里就涉及一个SQL语句的加载问题 1 从JDBC到MyBatis 第三步优化 传入参数映射和动态SQLkey value的Map 解析的时候根据变量名的具体值来判断JSTL中的标签 SQL解析器 1 从JDBC到MyBatis 第四步优化 结果映射和结果缓存需要返回什么类型的对象 需要返回的对象的数据结构怎么跟执行的结果映射 这样才能将具体的值赋值到对应的数据结构上进而考虑对SQL执行结果的缓存来提升性能 1 从JDBC到MyBatis 第五步优化 解决重复SQL语句问题SQL抽象SQL引用 1 从JDBC到MyBatis 为什么需要MyBatis 1 系统的部分或全部数据来自现有数据库 出于安全性的考虑 只为开发团队提供几条SelectSQL 或存储过程 以获取所需数据 具体的表结构不予公开 2 开发规范中要求 所有牵涉到业务逻辑部分的数据库操作 必须在数据库层由存储过程实现 对于金融行业而言 工商银行 中国银行和交通银行 都在开发规范中严格指定 3 系统数据处理量巨大 性能要求极为苛刻 这通常意味着我们必须由经过高度优化的SQL语句 或存储过程 才能达到系统性能设计指标 VS 什么是MyBatis MyBatis是一个运用于持久层的数据操作框架MyBatis是从iBatis升级而来使用MyBatis提供的ORM机制 业务逻辑层实现人员操作的是JAVA对象 该层面与Hibernate机制中的相同 对于具体的数据库操作而言 Hibernate会自动生成SQL并执行 而MyBatis要求开发人员具体编写SQL语句 MyBatis在数据库移植性和SQL开发工作量上进行了让步 从而提升了系统设计的灵活性 扩展了其自由空间 MyBatis的优势 支持ORM支持动态SQL外部化SQL语句封装SQL语句 MyBatis使用入门 准备软件开发环境MyBatis的源代码 所需的jar文件以及学习文档可以在 MyBatis使用入门 准备数据 使用mybatis操作数据库 操作步骤创建项目 导入jar包创建mybatis配置文件创建实体类创建实体类对应的映射器及其配置文件操作数据测试操作 创建mybatis配置文件 创建mybatis config xml文件配置数据源 创建实体类 publicclassUserimplementsSerializable 属性字段privateintuserId privateStringuserName privateStringuserPassword privateDateuserBirth privateStringuserAddress privateStringuserPhone privateintuserStatus 无参数的构造函数 getter和setter 创建映射器及其配置文件 publicinterfaceUserMapper 新增用户publicvoidinsertUser Useruser 根据用户名和密码查询用户publicUserselectUserByNameAndPassword Useruser 查询所有的用户publicListselectAllUsers 创建映射器的配置文件 SQL语句SQL语句 创建映射器的配置文件 1 namespace表示该配置文件对于映射器 UserMapper 接口的完全路径 insert映射插入语句Id表示在命名空间中唯一的标识符 可以被用于引用该语句 与映射器接口中的方法一致时 会在该方法中使用该语句 parameterType表示将会传入该语句的参数类的完全限定名或别名 useGeneratedKeys表示使用JDBC的getGeneratedKeys方法取出由数据库内部生成的主键 实现标识列自动增长 创建映射器的配置文件 2 select映射查询语句Id表示在命名空间中唯一的标识符 可以被用于引用该语句 与映射器接口中的方法一致时会在该方法中使用该语句 parameterType表示将会传入该语句的参数类的完全限定名或别名 resultType表示从这条语句中返回的期望类型的类的完全限定名或别名 如果返回的是集合 则应是集合中包含元素的类型 而并非集合本身 操作数据 步骤读取并解析配置文件 创建SqlSessionFactory 从SqlSessionFactory中获取SqlSession对象 使用SqlSession对象操作数据 提交事务 回滚事务 关闭SqlSession对象 创建SqlSessionFactory 配置文件的路径 在src下 Stringresource mybatis config xml 读取配置文件Readerreader Resources getResourceAsReader resource 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilderbuilder newSqlSessionFactoryBuilder 解析配置 构建SqlSessionFactory对象SqlSessionFactoryfactory builder build reader 获取SqlSession对象 SqlSessionsqlSession factory openSession SqlSession的方法TselectOne Stringstatement Objectparameter ListselectList Stringstatement Objectparameter MapselectMap Stringstatement Objectparameter StringmapKey intinsert Stringstatement Objectparameter intupdate Stringstatement Objectparameter intdelete Stringstatement Objectparameter 使用SqlSession对象操作数据 SqlSession对象封装了对数据的各种增加 删除 修改和查询操作Useruser newUser 汤姆 tom newDate 湖北武汉1 sqlSession insert insertUser user 使用映射器接口 推荐 Useruser newUser 汤姆 tom newDate 湖北武汉1 UserMapperuserMapper sqlSession getMapper UserMapper class userMapper insertUser user 事务处理 提交事务 回滚事务 sqlSmit sqlSession rollback 关闭SqlSession对象 sqlSession close 测试数据 创建工具类 publicclassMyBatisUtil privatefinalstaticSqlSessionFactorysqlSessionFactory static Stringresource mybatis config xml Readerreader null try reader Resources getResourceAsReader resource catch IOExceptione System out println e getMessage sqlSessionFactory newSqlSessionFactoryBuilder build reader publicstaticSqlSessionFactorygetSqlSessionFactory returnsqlSessionFactory 增加用户 TestpublicvoidtestInsertUser SqlSessionFactoryfactory MyBatisUtil getSqlSessionFactory SqlSessionsqlSession factory openSession 构建SqlSessionUseruser newUser 杰克 jack newDate 湖北省武汉光谷xx号1 UserMapperuserMapper sqlSession getMapper UserMapper class userMapper insertUser user 插入用户sqlSmit 提交sqlSession close 查询用户 TestpublicvoidtestSelectUsers SqlSessionFactoryfactory MyBatisUtil getSqlSessionFactory SqlSessionsqlSession factory openSession 构建SqlSessionUserMapperuserMapper sqlSession getMapper UserMapper class 查询所有用户信息Listusers userMapper selectAllUsers 输出结果System out println 所有用户的名字是 for Useruser users System out println user getUserId t user getUserName sqlSession close 总结 在项目开发中 为了提高项目的可扩张性和可维护性 将项目分为三层持久层与持久化的区别包括 1 持久化 仅指将域对象永久保存至数据库中 2 持久层 是指在系统逻辑层面上 专注于实现数据持久化的一个相对独立的领域 MyBatis是一个数据持久化的框架 其操作数据的基本步骤是 1 读取并解析配置文件 创建SqlSessionFactory 2 从SqlSessionFactory中获取SqlSession对象 3 使用SqlSession对象操作数据 4 提交事务 回滚事务 5 关闭SqlSession对象 第2章MyBatis配置详解与API介绍 本章内容 Mybatis的结构与原理Mybatis配置文件详解SQL映射文件详解MybatisAPI介绍 本章目标 理解mybatis的运行流程掌握mybatis的配置掌握mybatis的映射文件理解mybatis中的重要的类 Mybatis的结构与原理 1 加载配置 配置来源于两个地方 一处是配置文件 一处是Java代码的注解 将SQL的配置信息加载成为一个个MappedStatement对象 包括了传入参数映射配置 执行的SQL语句 结果映射配置 存储在内存中 SQL解析 当API接口层接收到调用请求时 会接收到传入SQL的ID和传入对象 可以是Map JavaBean或者基本数据类型 Mybatis会根据SQL的ID找到对应的MappedStatement 然后根据传入参数对象对MappedStatement进行解析 解析后可以得到最终要执行的SQL语句和参数 SQL执行 将最终得到的SQL和参数拿到数据库进行执行 得到操作数据库的结果 结果映射 将操作数据库的结果按照映射的配置进行转换 可以转换成HashMap JavaBean或者基本数据类型 并将最终结果返回 Mybatis的结构与原理 2 MyBatis功能架构 API接口层 提供给外部使用的接口API 开发人员通过这些本地API来操纵数据库 接口层一旦接收到调用请求就会调用数据处理层来完成具体的数据处理 数据处理层 负责具体的SQL查找 SQL解析 SQL执行和执行结果映射处理等 其主要的目的是根据调用的请求完成一次数据库操作 基础支撑层 负责最基础的功能支撑 包括连接管理 事务管理 配置加载和缓存处理 这些都是共用的资源 将他们抽取出来作为最基础的组件 为上层的数据处理层提供最基础的支持 MyBatis功能架构 MyBatis核心配置文件 MyBatis的XML配置文件包含了影响MyBatis行为的设置和属性信息 XML文档的高层级结构如下 configuration配置properties属性settings设置typeAliases类型命名typeHandlers类型处理器objectFactory对象工厂plugins插件environments环境environment环境变量transactionManager事务管理器dataSource数据源databaseIdProviderchinese mappers映射器 MyBatis核心配置文件 配置文件的结构 配置文件的元素properties 1 该元素是外部化的 可替代的属性 这些属性也可以配置在典型的Java属性配置文件中 或者通过properties元素的子元素来传递 例如 配置文件的元素properties 2 其中的属性值就可以在整个配置文件中使用 使用可替换的属性来实现动态配置 例如 Settings 该元素是极其重要的参数设置 它们会修改MyBatis在运行时的行为方式 typeAliases 类型别名即为Java类型命名一个短的名称 它仅同XML配置有关 只用于减少类完全限定名的多余部分 typeHandlers 无论是MyBatis在预处理语句中设置一个参数 还是从结果集中取出一个值时 类型处理器均被用于将获取的值以合适的方式转换成Java类型 typeHandlers 例子 ExampleTypeHandler javapublicclassExampleTypeHandlerimplementsTypeHandler publicvoidsetParameter PreparedStatementps inti Objectparameter JdbcTypejdbcType throwsSQLException ps setString i String parameter publicObjectgetResult ResultSetrs StringcolumnName throwsSQLException returnrs getString columnName publicObjectgetResult CallableStatementcs intcolumnIndex throwsSQLException returncs getString columnIndex environments MyBatis可以配置多种环境 这会帮助你将SQL映射应用于多种数据库之中 例如 你也许为开发要设置不同的配置 测试和生产环境 或者你可能有多种生产级数据库却共享相同的模式 所以你会想对不同数据库使用相同的SQL映射 一个重要的问题要注意 可以配置多种环境 但只能为每个SqlSessionFactory实例选择一个环境 也就是说每个数据库对应一个SqlSessionFactory environments例子 transactionManager transactionManager在MyBatis中有两种事务管理器类型 也就是type JDBC MANAGED JDBC 这个配置直接简单使用了JDBC的提交和回滚设置 它依赖于从数据源得到的连接来管理事务范围 MANAGED 托管 这个配置几乎没做什么 它从来不提交或回滚一个连接 而它会让容器来管理事务的整个生命周期 比如Spring或JEE应用服务器的上下文 默认情况下它会关闭连接 dataSource dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源 内建数据源类型 即type 有以下三种 1 UNPOOLED 2 POOLED 3 JNDI dataSource 有三种内建的数据源类型 也就是type UNPOOLED POOLED JNDI 1 UNPOOLED 这个数据源的实现是每次被请求时简单打开和关闭连接 它有一点慢 这是对简单应用程序的一个很好的选择 因为它不需要及时的可用连接 2 POOLED 这是JDBC连接对象的数据源连接池的实现 用来避免创建新的连接实例时必要的初始连接和认证时间 这是一种当前Web应用程序用来快速响应请求很流行的方法 3 JNDI 这个数据源的实现是为了使用如Spring或应用服务器这类的容器 容器可以集中或在外部配置数据源 然后放置一个JNDI上下文的引用 mappers 既然MyBatis的行为已经由上述元素配置完毕 那么我们现在要定义SQL映射语句 这些语句简单阐述了MyBatis要从哪里寻找映射文件 其余的细节便在每个SQL映射文件中 SQL映射的XML文件 MyBatis真正的力量是在映射语句中 SQL映射的XML文件是相当的简单 当然如果你将它们和对等功能的JDBC代码来比较 你会发现映射文件节省了大量的代码量 cache 配置给定命名空间的缓存cache ref 从其他命名空间引用缓存配置resultMap 最复杂 也是最有力量的元素 用来描述如何从数据库结果集中来加载你的对象parameterMap 已经被废弃了 老式风格的参数映射 内联参数是首选 这个元素可能在将来被移除sql 可以重用的SQL块 也可以被其他语句引用insert 映射插入语句update 映射更新语句delete 映射删除语句select 映射查询语句 select 查询语句是使用MyBatis时最常用的元素之一 当从数据库中取出数据时 会发现将数据存储在数据库中是很有价值的 所以许多应用程序的查询操作相较更改数据操作更多 SELECT FROMPERSONWHEREID id 该语句被称为selectPerson 使用一个int 或Integer 类型的参数 并返回一个HashMap类型的对象 其中的键是列名 值是列对应的值 Select中的属性 insertintoAuthor id username password email bio values id username password email bio updateAuthorsetusername username password password email email bio bio whereid id deletefromAuthorwhereid id insert update和delete 数据修改语句insert update和delete在它们的实现中非常相似 Insert例子 update例子 delete例子 insert update和delete的属性 sql 该元素可以被用于定义可重用的SQL代码段 可以包含在其他语句中 如 id username password上述SQL片段可以被包含在其他语句中 如 selectfromsome tablewhereid id resultMap 1 resultMap元素是MyBatis中最重要 最强大的元素 解决列名与属性名称不匹配的问题 resultMap 2 其引用语句使用resultMap属性即可 注意 我们去掉了resultType属性 例如 selectuser id user name hashed passwordfromsome tablewhereid id MyBatis核心对象 每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心 SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得 SqlSessionFactoryBuilder对象可以从XML配置文件 或从Configuration类的习惯准备的实例中构建SqlSessionFactory对象 MyBatis核心对象 有了SqlSessionFactory对象 就可以获得SqlSession的实例了 SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法 你可以用SqlSession实例来直接执行已映射的SQL语句 理解MyBatis核心对象的不同范围和生命周期是很重要的 不正确的使用它们会导致严重的并发问题 MyBatis核心对象 SqlSessionFactoryBuilder这个类可以被实例化 使用和丢弃 一旦你创建了SqlSessionFactory后 这个类就不需要存在了 因此SqlSessionFactoryBuilder实例的最佳范围是方法范围 也就是本地方法变量 你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例 SqlSessionFactory一旦被创建 SqlSessionFactory应该在你的应用执行期间都存在 没有理由来处理或重新创建它 使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次 这样的操作将被视为是非常糟糕的 因此SqlSessionFactory的最佳范围是应用范围 有很多方法可以做到 最简单的就是使用单例模式或者静态单例模式 MyBatis核心对象 SqlSession每个线程都应该有它自己的SqlSession实例 SqlSession的实例不能被共享 也是线程不安全的 因此最佳的范围是请求或方法范围 绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中 也绝不能将SqlSession实例的引用放在任何类型的管理范围中 比如Serlvet的HttpSession 如果你现在正用任意的Web框架 要考虑SqlSession放在一个和HTTP请求对象相似的范围内 换句话说 基于收到的HTTP请求 你可以打开了一个SqlSession 然后返回响应 就可以关闭它了 关闭SqlSession很重要 你应该确保使用finally块来关闭它 Mybatis的范围与生命周期 映射器实例 映射器是创建绑定映射语句的接口 映射器接口的实例可以从SqlSession中获得 从技术上而言 当被请求时 任意映射器实例的最宽范围和SqlSession是相同的 SqlSessionsession sqlSessionFactory openSession try mapper session getMapper BlogMapper class dowork finally session close 总结 Mybatis框架执行时的总体流程是 1 加载配置 2 SQL解析 3 SQL执行 4 结果映射 Mybatis配置文件的主要元素有 properties settings typeAliases transactionManager dataSource和mappers SQL映射配置的主要元素有 select insert update和delete 第3章MyBatis使用进阶 本章内容 高级关联集合映射关联优化 本章目标 掌握关联结果的配置与使用掌握集合映射的配置与使用掌握关联的嵌套结果 关联 关联关系是一种结构化的关系 指一种对象和另一种对象有联系 给定关联的两个类 可以从其中的一个类的对象访问到另一个类的相关对象 在UML图中 关联关系用一条实线来表示 关联可以有方向 表示该关联在某方向被使用 只在一个方向上存在的关联 称为单向关联 UnidirectionalAssociation 在两个方向上都存在的关联 称为双向关联 BidirectionalAssociation 关联配置 关联元素处理 有一个 类型的关系 例如 一篇博客有一个作者 多个评论属于同一个博客 关联映射便工作于这种情况之上 一对一和多对一的关联在mybatis中均使用同一种配置来完成 publicclassBlogimplementsSerializable privateIntegerid privateAuthorauthor 博客关联的作者对象privateStringtitle privateStringcontent privateDatecreateTime privateinttype 关联配置 语法 关联配置例子 select fromauthorwhereid id select fromblogwhereid id 关联配置 实现博客获取作者信息博客关联作者通过博客访问作者信息 关联配置 如何解决N 1查询问题 集合映射 如何实现一个对象找到一个集合对象 实现一对多的关系 集合映射 集合映射 实现从一篇博客到多个评论的关联语法 集合映射例子 select fromcommentwhereblog id id select fromauthorwhereid id select fromblogwhereid id 集合映射 通过一篇文章找到该文章的所有评论信息实现一对多的关联 集合映射 推荐步骤在实体类中添加集合关联配置关联获取数据 配置与性能优化 在前面的配置中 关联配置 集合映射配置 都会出现一个N 1查询问题每次执行一次查询都会伴随着另一个查询语句来加载关联的对象或集合 如果加载的关联数据较多 则执行的查询语句次数会增加 使用嵌套结果来提高查询效率 嵌套结果的使用 关联映射的嵌套结果 嵌套结果的使用例子 selectB id B title B author id B content B create time B type A id A username A password A email A address A phonefromBlogBleftouterjoinAuthorAonB author id A id 嵌套结果的使用 在配置中 我们使用了resultMap authorResult 来设置结果映射的ID 可以映射关联的嵌套结果到一个合适的对象中 允许联合多个表来合成到一个单独的结果集 不同于前面的嵌套查询使用多个查询语句 集合嵌套结果 在集合映射中 使用结果嵌套与在关联中类似 此处不作赘述 修改后的BlogMapper xml配置文件代码如下 selectB C id C contentascomment content C postDatefromBlogBleftouterjoinCommentConb id c blog idwhereB id id 嵌套结果 使用嵌套结果重构前面的案例 总结 在mybatis中 可以通过关联映射与集合映射来实现多对一和一对多的关系 这样即可很方便地通过一个对象找到关联的其他对象或通过一个对象找到关联的多个对象 以便于获取数据 关联映射用于实现对象之间一对一 多对一的情况 通过配置association标签来实现关联 集合映射用于实现对象之间一对多的关联 通过配置collection标签来实现 在关联中加载对象 mybatis使用了两种不同的方式 1 嵌套查询 嵌套查询会出现 N 1 查询问题 多次执行SQL语句影响程序的效率 2 嵌套结果 嵌套结果可以使用连接查询来完成对象之间结果的嵌套 避免了嵌套查询出现的问题 第四章动态SQL 本章内容 动态sql技术if标签choose when otherwise 标签trim where set 标签foreach标签 本章目标 理解动态sql的原理熟悉动态sql技术中的标签掌握动态sql的使用 动态SQL概述 为什么使用动态SQL技术 使用JDBC实现多条件查询时 会出现如下代码 动态SQL概述 为什么使用动态SQL技术 使用JDBC实现多条件查询时 会出现如下代码 StringBuildersql newStringBuilder select fromblogwhere1 1 if blog null if blog getAuthor null if blog getAuthor getId 0 sql append andauthor id blog getAuthor getId if blog getTitle null sql append andtitlelike blog getTitle if blog getContent null sql append andcontentlike blog getContent if blog getType 0 sql append andtype blog getType 代码冗余 复杂 动态SQL技术 MyBatis的一个强大的特性之一是其动态SQL功能 如果开发者有使用JDBC或其他相似框架的经验 则其肯定明白根据条件串联SQL字符串非常困难 同时还要确保不能忽略空格或在列表的最后省略逗号等 使用动态SQL可以彻底解决这种问题 省略代码编写中繁琐的SQL拼接操作 在Mybatis中 常用的标签元素包括if choose when otherwise trim where set 和foreach IF标签 selectid author idasauthor title content create timeascreateTime typefromBLOGwheretype 1andtitlelike title andcontentlike content 如果没有传递title 则按content条件来查询 如果没有传递content 则按title来进行查询 如果两者都没有传递 则查询所有type为1的博客信息 如果两者都传递 则按照上述两个条件一同查询 IF标签 查询符合条件的博客信息标题中有 美斯坦福 内容中有 学生就业率高 关键字 choose when otherwise choose标签按顺序判断其内部when标签中的test条件是否成立 如果有一个成立 则choose结束 当choose中所有when的条件均不满足时 则使用otherwise中的sql条件 choose when otherwise例子 selectid author idasauthor title content create timeascreateTime typefromBLOGwhere1 1andtitlelike title andcontentlike content andtype 1 生成SQL语句没有使用content条件 仅能使用choose标签中的一种条件或只使用默认条件 不会同时使用choose标签中的多个条件 where set trim selectid author idasauthor title content create timeascreateTime typefromBLOGandtype 1andtitlelike title andcontentlike content where set trim 如果发生如下情况怎么办 where和and关键字相连出现多余的逗号 使用Where if标签使用update if标签 foreach foreach元素是非常强大的 它允许指定一个集合 声明集合项和索引变量 它们可以用于元素体内 其同时也允许指定开放和关闭的字符串 在迭代之间放置分隔符 该元素非常智能化 不会偶然地附加多余的分隔符 foreach例子 selectid author idasauthor title content create timeascreateTime typefromBLOGwheretypein typeIds foreach 实现查询某几类的所有博客信息 总结 动态SQL技术可以灵活处理多条件查询 无须在代码中动态拼接SQL语句 从而简化了数据访问层的开发 在使用Mybatis的动态SQL时 主要通过以下标签来实现 1 if标签 根据test的结果动态为SQL拼接条件表达式 多个if的条件以AND来连接 2 choose when otherwise 标签 根据when中test的结果选择一个条件拼接到SQL语句中 如果所有when均不满足 则选择otherwise中的条件 3 trim where set 标签 where if可以动态地添加条件 set if可以动态地实现更新相应的值 使用trim可以替代where或set 4 foreach标签 该标签通常结合in子句使用 可以通过循环迭代条件值来进行相关的操作 第5章MyBatis高级特性 本章内容 Mybatis缓存使用存储过程注解 本章目标 理解Mybatis缓存原理掌握Mybatis调用存储过程了解Mybatis中的注解配置 Mybatis的缓存机制 缓存技术是一种 以空间换时间 的设计理念 利用内存空间资源来提高数据检索速度的有效手段之一MyBatis包含一个非常强大的查询缓存特性 它可以非常方便地配置和定制 MyBatis3中的缓存实现的很多改进都已经实现了 使得它更加强大而且易于配置MyBatis默认情况下是没有开启缓存的 除了局部的session缓存 要开启二级缓存 你需要在你的SQL映射文件中添加一行 Mybatis的缓存机制 这个简单语句的效果如下 映射语句文件中的所有select语句将会被缓存 映射语句文件中的所有insert update和delete语句会刷新缓存 缓存会使用LeastRecentlyUsed LRU 最近最少使用的 算法来收回 根据时间表 比如noFlushInterval 没有刷新间隔 缓存不会以任何时间顺序来刷新 缓存会存储列表集合或对象 无论查询方法返回什么 的1024个引用 缓存会被视为是read write 可读 可写 的缓存 意味着对象检索不是共享的 而且可以安全地被调用者修改 而不干扰其他调用者或线程所做的潜在修改 Mybatis的缓存机制 缓存作用 1 映射语句文件中的所有select语句将会被缓存 2 映射语句文件中的所有insert update和delete语句会刷新缓存 3 缓存会使用LeastRecentlyUsed LRU 最近最少使用的 算法收回 4 根据时间表 如noFlushInterval 没有刷新间隔 缓存不会以任何时间顺序来刷新 5 缓存会存储列表集合或对象 无论查询方法返回什么 的1024个引用 6 缓存会被视为read write 可读 可写 的缓存 意味着对象检索不是共享的 而且可以安全地被调用者修改 而不干扰其他调用者或线程所做的潜在修改 Mybatis的缓存机制 该更高级的配置创建了一个FIFO缓存 并每隔60秒刷新 存放结果对象或列表的512个引用 且返回的对象被认为是只读的 因此 在不同线程中的调用者之间修改它们会导致冲突 Mybatis的缓存机制 存储过程的使用 存储过程的优点 1 存储过程只在创造时进行编译 以后每次执行存储过程都无须重新编译 而一般SQL语句每执行一次就编译一次 所以使用存储过程可提高数据库执行速度 2 当对数据库进行复杂操作时 如对多个表进行Update Insert Query和Delete时 可将此复杂操作用存储过程封装起来 还可与数据库提供的事务处理一同使用 3 存储过程可以重复使用 可减少数据库开发人员的工作量 4 安全性高 可设定只有某些用户才具有对指定存储过程的使用权 在Mybatis中使用存储过程 在配置中添加如下语法格式 返回参数 Call存储过程名称 参数1 参数2 在Mybatis中使用存储过程 返回参数 指在存储过程中通过return返回的值 参数的完整格式为 参数名 mode 参数类型 jdbcType JDBC类型 javaType Java类型 resultMap 结果映射 在Mybatis中使用存储过程 步骤 1 创建存储过程 2 在映射SQL中配置存储过程 3 在MyBatis中调用存储过程 在Mybatis中使用存储过程 使用存储统计某用户发表博客的总篇数 在Mybatis中使用存储过程 1 在SQLSERVER中创建如下存储过程 createprocedureproc getBlogCountByAuthor usernamevarchar 50 blogCountintoutput asbegindeclare author idint select author id IDfromauthorwhereusername username select blogCount COUNT ID fromblogwhereauthor id author id end 在Mybatis中使用存储过程 2 在BlogMapper xml文件中添加如下配置信息 在Mybatis中使用存储过程 在Mybatis中编写Java代码调用存储过程 代码如下 publicstaticvoidmain String args SqlSessionsqlSession MyBatisUtil getSqlSessionFactory openSession 创建map类型参数Mapparams newHashMap params put username 张伟杰 调用存储过程sqlSession selectOne getBlogCountByName params intcount Integer params get blogCount System out println count 注解配置 MyBatis3构建在基于全面且强大的Java配置API上 该配置API是基于XML的MyBatis配置的基础 也是新的基于注解配置的基础 注解提供了一种简单的方式来实现简单映射语句 而不会引入大量的开销 注解配置 Mybatis中常用的注解 在MyBatis中使用注解 添加作者 Insert InsertintoAuthor username password email address phone values username password email address phone Options useGeneratedKeys true flushCache false timeout 10000 publicvoidaddAuthor Authorauthor 删除作者 Delete deletefromauthorwhereid id Options flushCache false timeout 10000 publicvoiddeleteAuthor Param id intid 在MyBatis中使用注解 查询所有作者信息 Select select fromauthor Options flushCache false timeout 10000 useCache true Results value Result id true column id property id Result property username column username Result property password column password Result property email column email Result property address column address Result property phone colu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 起重设备钢结构生产线项目风险评估报告
- 中医基础选择试题及答案
- 机械基础实验试题及答案
- 标准厂房及配套基础设施项目建设工程方案
- 基础会计从业试题及答案
- 绿色纺织新材料生产线项目建筑工程方案
- 汽车零部件生产项目规划设计方案
- 环保科技公司环境监测人员派遣及数据分析合同
- 简式离婚协议书中老年赡养问题处理书
- 美发店技师劳务派遣与品牌合作合同范本
- 医疗器械配送应急预案模板(3篇)
- DB65-T 4803-2024 冰川厚度测量技术规范
- 护理专业新进展介绍
- 大疆无人机培训课件
- 中级消防员维保培训课件
- 小儿推拿进修总结汇报
- 2025公司应急预案演练计划(5篇)
- 医疗机构医院全员培训制度
- 2025仓库保管员试题及答案
- 生猪养殖场实施方案
- 矛盾纠纷化解培训课件
评论
0/150
提交评论