Mybatis学习培训

1,430 views
1,242 views

Published on

mybatis学习,内部培训

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,430
On SlideShare
0
From Embeds
0
Number of Embeds
137
Actions
Shares
0
Downloads
23
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Mybatis学习培训

  1. 1. Mybatis 学习 国际机票产品组:李红甫
  2. 2. What is MyBatis? <ul><li>mybaits 是第一个支持自定义 sql, 存储过程,半自动化的持久化框架。让你彻底消除烦人的 jdbc 中 get,set 结果的操作。 </li></ul><ul><li>mybatis 用 xml 或者注解进行配置。 </li></ul>
  3. 3. 同类产品介绍 <ul><li>JDBC </li></ul><ul><li>Hibernate </li></ul><ul><li>JDO </li></ul><ul><li>SpringJdbcTemplate </li></ul><ul><li>…… . </li></ul>
  4. 4. 版本历史 <ul><li>我刚接触时是 ibatis2.x ,托管在 Apache </li></ul><ul><li>3.X 之后改名为 Mybatis, 从 Apache 迁移到 googlecode 平台。 </li></ul><ul><li>2.x-3.x 内部设计改动较大 </li></ul>
  5. 5. <ul><li>Helloword </li></ul><ul><li>全局参数配置 </li></ul><ul><li>Sql 映射配置 </li></ul><ul><li>分页扩展 (mybatis 插件开发 ) </li></ul><ul><li>缓存机制 ( 如何自定义缓存,如 mecached 集成 ) </li></ul><ul><li>Spring 集成 </li></ul><ul><li>代码生成器 ( MyBatis Generator ) </li></ul>
  6. 6. HelloWorld 先行 单表 CURD 操作 参见 demo 代码 cn.tempus.study.mybatis.helloworld
  7. 7. 全局参数配置 详细参见: cntempusstudymybatisconfigdetail
  8. 9. Sql 映射配置 <ul><li>ResultMap </li></ul><ul><li>id (property,column,javatype,jdbctype) </li></ul><ul><li>result(property,column,javatype,jdbctype) </li></ul><ul><li>Id 和 result 基本是一样的,都是把数据表中字段映射到 java 类中的 property 字段。 但是指定 id 可以提升性能 (后续讲到)。 </li></ul>
  9. 10. Sql 映射配置 <ul><li>Select 语句 </li></ul><ul><li>id 唯一标识 </li></ul><ul><li>parameterType 查询时传进来的完整参数类型 (Class) </li></ul><ul><li>resultType 返回数据参数类型(建议用 resultMap ) </li></ul><ul><li>resultMap 前面配置 ResultMap 的一个引用 </li></ul><ul><li>flushCache 是否清空缓存,对于 select 语句,默认为 false </li></ul><ul><li>useCache 是否缓存本条 select 语句生成的结果 </li></ul><ul><li>timeout 查询超时时间 </li></ul><ul><li>fetchSize 查询返回的最大结果数 </li></ul><ul><li>statementType 三种选择: statement( 简单 ),prepared( 预编译 ),callable( 存储过程 ) </li></ul><ul><li>resultType 三种选择: FORWARD_ONLY( 游标仅前移 )SCROLL_SENSITIVE|SCROLL_INSENSITIVE ,默认驱动支持 </li></ul><ul><li>timeout,fetchsize,resultType 这三个参数依赖驱动 </li></ul>
  10. 11. Sql 映射配置 <ul><li>insert update delete 语句配置 </li></ul><ul><li>id … </li></ul><ul><li>parmaterType … </li></ul><ul><li>flushCache 对 insert,update,delete 操作会清空缓存 </li></ul><ul><li>timeout … </li></ul><ul><li>statementType … </li></ul><ul><li>userGeneratedKeys 默认为 false 对于 mysql 或 sqlserver ,主键设置自动增长值 </li></ul><ul><li>keyProperty 当 userGeneratedKeys 为 true 时,把数据库生成的值设置对指定的属性中 </li></ul><ul><li>对于 mysql 自动增长主键和 oracle 序列生成器,怎样配置 id?( 参见 demo 代码 ) </li></ul>
  11. 12. Sql 映射配置 <ul><li>实例关联(一对多(一对一,多对多)) </li></ul><ul><li><resultMap type=&quot;cn.tempus.study.mybatis.domain.User&quot; id=&quot;userResultMap&quot;> </li></ul><ul><li><id property=&quot;id&quot; column=&quot;id&quot; jdbcType=&quot;INTEGER&quot;/> </li></ul><ul><li><id property=&quot;name&quot; column=&quot;name&quot; jdbcType=&quot;VARCHAR&quot;/> </li></ul><ul><li>< association property=&quot;department&quot; column=&quot;department_id&quot; select =&quot;department.selectOne&quot;/> </li></ul><ul><li></resultMap> </li></ul>
  12. 13. Sql 映射配置 <ul><li>实例关联(一对多(一对一,多对多)) </li></ul><ul><li><resultMap type=&quot;cn.tempus.study.mybatis.domain.Department&quot; id=&quot;departmentResultMap&quot;> </li></ul><ul><li><id property=&quot;id&quot; column=&quot;id&quot; jdbcType=&quot;INTEGER&quot;/> </li></ul><ul><li><id property=&quot;code&quot; column=&quot;code&quot; jdbcType=&quot;VARCHAR&quot;/> </li></ul><ul><li><id property=&quot;name&quot; column=&quot;name&quot; jdbcType=&quot;VARCHAR&quot;/> </li></ul><ul><li><!-- 一对多关系 </li></ul><ul><li>< collection property=“users&quot; column=&quot;id&quot; select =&quot;user.selectByDepartmentId&quot; /> </li></ul><ul><li> --> </li></ul><ul><li></resultMap> </li></ul>
  13. 14. Sql 映射配置 <ul><li>N+1 问题? </li></ul><ul><li>如何解决,没有 绝对 答案,视具体业务场景而对待 , 缓存策略,数据量大小,访问频率不同而设计不同 </li></ul><ul><li>参见代码: cntempusstudymybatisconfigdetailUser.xml </li></ul>
  14. 15. Sql 映射配置 <ul><li>动态 SQL (Object Graph Notation Language ) </li></ul><ul><li>条件组合查询时拼接 SQL 是件痛苦的活,经常要判断 where ,分号等在条件不同时是否显示,动态 sql 可以很好的处理这部分的需求。 </li></ul><ul><li>if </li></ul><ul><li>when(choose,when) </li></ul><ul><li>trim(where, set) </li></ul><ul><li>foreach </li></ul>
  15. 16. Sql 映射配置 <ul><li>if </li></ul><ul><li>select * from users </li></ul><ul><li>where </li></ul><ul><li><if test=&quot; name != null &quot;> </li></ul><ul><li>name = #{name} </li></ul><ul><li></if> </li></ul><ul><li>choose(when,otherwise) </li></ul><ul><li>……………… . </li></ul>
  16. 17. Sql 映射配置 <ul><li>上例 if 中如果没有设置查询条件,那么生成 sql 将会有语法错误 ( where 应该消除 ). </li></ul><ul><li>< where > </li></ul><ul><li>如果这里有查询语句生成,则会前面加 where </li></ul><ul><li></ where > </li></ul><ul><li>------------------------------------------------------------------------------- </li></ul><ul><li>update user </li></ul><ul><ul><li>< set > </li></ul></ul><ul><ul><ul><li><if test=“name != null&quot;>name=#{name}</if> </li></ul></ul></ul><ul><ul><li></ set > </li></ul></ul><ul><ul><li>where id=#{id} </li></ul></ul>
  17. 18. 插件开发 <ul><li>@Intercepts({@Signature(type=StatementHandler.class,method=“prepare”,args={Connection.class})}) public class ExamplePlugin implements Interceptor{ // 实现你的业务方法 </li></ul><ul><li>} </li></ul><ul><li>配置文件 : </li></ul><ul><ul><li><plugins> </li></ul></ul><ul><ul><ul><li><plugin interceptor=&quot;org.mybatis.example.ExamplePlugin&quot;> </li></ul></ul></ul><ul><ul><ul><li><property name=&quot;someProperty&quot; value=&quot;100&quot;/> </li></ul></ul></ul><ul><ul><ul><li></plugin> </li></ul></ul></ul><ul><ul><li></plugins> </li></ul></ul><ul><ul><li>参考 : http://www.cnblogs.com/jcli/archive/2011/08/09/2132222.html </li></ul></ul>
  18. 19. Cache <ul><li>eviction ( 缓存移除策略 ) </li></ul><ul><li>LRU Least Recently Used </li></ul><ul><li>FIFO first in first out </li></ul><ul><li>SOFT soft reference </li></ul><ul><li>WEAK weak reference </li></ul>
  19. 20. Cache <ul><li>flushInterval ( 清空缓存时间间隔 ) </li></ul><ul><li>默认不设置的话是不清空。单位为秒。 </li></ul><ul><li>size ( 缓存最大数 ( 个数不是内存容量 )) </li></ul><ul><li>默认不设置的话是不清空。单位为秒。 </li></ul><ul><li>readonly ( 只读模式 ) </li></ul><ul><li>默认为 false ,即每次返回的是缓存中的副本(通过 serilization 生成),为 true 时返回唯一实例 ( 线程安全,性能因素设置不同 ) </li></ul>
  20. 21. Cache <ul><li>自定义缓存实现( memcached ) </li></ul><ul><li>java 文件 </li></ul><ul><li>public class MemcachedCache implements Cache{ </li></ul><ul><li>//…… </li></ul><ul><li>} </li></ul><ul><li>xml 配置: </li></ul><ul><li><cache eviction=&quot;LRU&quot; type=&quot; cn.tempus.study.mybatis.cache.MemcachedCache &quot;></cache> </li></ul><ul><li>参见代码: cntempusstudymybatiscache </li></ul>
  21. 22. Spring 集成 <ul><li>目前 spring3.x 版本对 mybatis3.X 还没有提供集成接口。但是 mybatis 官网提供了开源的实现。 </li></ul><ul><li>mybatis 和 spring 集成,可以将 mybatis 的事务交给 spring 容器管理 </li></ul>
  22. 23. Spring 集成 <ul><li>Mybatis 和 Spring 集成开发是 高效率 的,甚至 dao 层我们不用任何代码,因为 Mapper 的引入可以 proxy 生成 dao 层 </li></ul><ul><li>Mapper 只是一个 接口 ,如果 dao 层有自己的特殊业务,也可以写 dao 实现(继承 SqlSessionDaoSupport ) </li></ul><ul><li>代码参见: cntempusstudymybatisspring </li></ul>
  23. 24. 代码生成器 <ul><li><generatorConfiguration> </li></ul><ul><li><classPathEntry location=&quot; lib/ojdbc14.jar &quot; /> </li></ul><ul><li><context id=&quot;DB2Tables&quot; targetRuntime=&quot;MyBatis3&quot;> </li></ul><ul><li><jdbcConnection driverClass=&quot;oracle.jdbc.driver.OracleDriver&quot; </li></ul><ul><li>connectionURL=&quot;jdbc:oracle:thin:@172.16.3.101:1521:ticketdb&quot; </li></ul><ul><li>userId=&quot;gongdan&quot; </li></ul><ul><li>password=&quot;gongdan&quot;> </li></ul><ul><li></jdbcConnection> </li></ul><ul><li><javaTypeResolver > </li></ul><ul><li><property name=&quot;forceBigDecimals&quot; value=&quot;false&quot; /> </li></ul><ul><li></javaTypeResolver> </li></ul>
  24. 25. 代码生成器 <ul><li><javaModelGenerator targetPackage=&quot; cn.tempus.yj.domain &quot; targetProject=&quot;gongdansrc&quot;> </li></ul><ul><li><property name=&quot;enableSubPackages&quot; value=&quot;true&quot; /> </li></ul><ul><li><property name=&quot;trimStrings&quot; value=&quot;true&quot; /> </li></ul><ul><li></javaModelGenerator> </li></ul><ul><li><sqlMapGenerator targetPackage=&quot; cn.tempus.yj.persistence &quot; targetProject=&quot;gongdansrc&quot;> </li></ul><ul><li><property name=&quot;enableSubPackages&quot; value=&quot;true&quot; /> </li></ul><ul><li></sqlMapGenerator> </li></ul><ul><li><javaClientGenerator type=&quot;XMLMAPPER&quot; targetPackage=&quot; cn.tempus.yj.persistenc e&quot; targetProject=&quot;gongdansrc&quot;> </li></ul><ul><li><property name=&quot;enableSubPackages&quot; value=&quot;true&quot; /> </li></ul><ul><li></javaClientGenerator> </li></ul><ul><li><table tableName=&quot;T_YJ_PRICE&quot; domainObjectName=&quot;Price&quot; > </li></ul><ul><li><property name=&quot;useActualColumnNames&quot; value=&quot;false&quot;/> </li></ul><ul><li></table> </li></ul><ul><li></context> </li></ul>
  25. 26. <ul><li>谢谢! </li></ul>

×