重看《ibatis in action》心得
MyBatis核心技术全解与项目实战读书笔记

《MyBatis核心技术全解与项目实战》读书笔记1. 第一章 MyBatis简介本章主要介绍了MyBatis的基本概念、特点和优势,以及其在Java企业级应用开发中的重要作用。
MyBatis是一个优秀的持久层框架,它将SQL语句与Java对象映射(POJO)相结合,使得开发人员可以更加方便地操作数据库。
MyBatis的主要目标是简化数据库操作,提高开发效率,同时也提供了良好的数据封装和安全性。
SqlSessionFactory:用于创建SqlSession对象,SqlSession是MyBatis中执行SQL语句的核心接口。
SqlSession:用于执行SQL语句的会话对象,可以通过它来执行增删改查等操作。
Mapper:映射器接口,用于定义SQL语句和Java对象之间的映射关系。
Configuration:MyBatis的全局配置类,用于配置各种属性,如缓存策略、事务管理等。
插件:MyBatis的插件机制,允许开发者自定义拦截器、类型处理器等组件,以实现对MyBatis的功能扩展。
灵活性:MyBatis支持多种存储结构,如JDBC、ODBC、JNDI等,同时还支持自定义类型处理器和插件,使得MyBatis能够满足各种复杂的数据库操作需求。
易用性:MyBatis提供了简洁的XML映射文件来描述SQL语句和Java对象之间的映射关系,使得开发者无需编写复杂的SQL语句即可完成数据库操作。
性能优化:MyBatis通过一级缓存和二级缓存机制来提高查询性能,同时还支持动态SQL、分页查询等功能,使得MyBatis能够在高并发环境下保持良好的性能表现。
安全性:MyBatis提供了严格的权限控制机制,可以限制不同用户对数据库的操作权限,保证数据的安全性。
1.1 MyBatis概念及特点MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
相比于传统的数据访问技术,MyBatis让开发者能够更加直接地与数据库交互,从而有效地避免了大量繁琐的SQL语句编写工作。
iBatis学习总结

iBatis学习总结1.创建iBatis工程的步骤 (2)2.iBatis与传统JDBC比较 (2)3.Hibernate和ibatis的映射关系 (2)4.认识SqlMapClient接口 (2)5.SqlMapConfig标签详解 (3)(1)<properties>元素 (3)(2)<settings> 元素 (4)(3)<typeAlias>元素 (4)(4)<transactionManager>元素 (4)(5)<datasource>元素 (4)(6)<sqlMap >元素 (5)6.SqlMap标签详解 (5)(1)<cacheModel> (5)(2)<typeAlias> 类别名 (5)(3)<parameterMap> 参数类型外联映射关系 (5)(4)<resultMap>返回类型显示映射关系 (6)(5)<select> (6)(6)<insert> (7)(7)<update> (8)(8)<delete> (8)(9)<procedure> (8)(10)<statement> 执行DDL语句 (9)(11)<sql> SQL语句片段 (9)(12)<include> 组合语句 (9)(13)<selectKey> (9)7.SQL参数详解 (10)8.ibatis事务处理 (10)9.动态SQL (10)(1)一元条件标签 (11)(2)二元条件标签 (11)1.创建iBatis工程的步骤(1)建立数据库(2)创建工程(3)添加lib(4)编写sqlmapconfig.xml(5)编写sqlmap.xml(6)编写代码2.iBatis与传统JDBC比较(1)iBatis比使用JDBC编程减少了61%的代码量(2)iBatis是最简单的持久化框架(3)iBatis框架使SQL代码从程序代码中彻底分离,并且SQL语句可以重用.(4)增强了项目中的分工和项目的可移植性。
Ibatis知识点总结

目录Ibatis知识点学习总结 (2)简介 (2)特点 (2)资源 (3)第Ⅰ部分:使用ibatis开发第一个程序 (3)准备与测试 (3)使用ibatis完成对数据表的增、删、改、查操作 (4)第Ⅱ部分:Ibatis知识点总结 (11)JDBC回顾 (11)Ibatis配置文件— sqlMapConfig (12)Ibatis OR映射文件— sqlMap (16)第Ⅲ部分:SqlMap API使用方法学习总结 (24)SqlMap API使用方法与简单编程 (24)SqlMap API中重要类学习总结 (25)第Ⅳ部分:Ibatis系统架构与映射原理 (28)Ibatis框架的主要类层次结构 (28)Ibatis框架的设计策略 (29)Ibatis框架的运行原理 (30)Ibatis对SQL语句的解析 (31)Ibatis数据库字段映射到Java对象 (31)Ibatis知识点学习总结简介ibatis一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。
最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。
2010年这个项目由apache software foundation 迁移到了google code,并且改名为mybatis。
特点优点:✧简单易于掌握从只懂得JDBC操作到能够使用ibatis进行创建(Create)、更新(Update)、读取(Read)和删除(Delete)等操作可能只需要一天的时间。
✧易于进行sql优化从第一次开始使用,就会明白,用这个持久层框架需要自己完成sql语句的书写。
而hibernate可以全自动的帮我们完成这个工作。
这个半自动的ORM实现可以让我们进行sql语句的优化。
在项目中我们是使用分库分表进行数据操作,使用的数据库是开源数据库MySql。
我问过师兄这个问题,MySql能不能承受的住这么大的数据库操作频率以及复杂的业务逻辑。
用ibatis提升一类数据库检索查询的性能

Abt c sr t a
Frt , bi t d co Q m p O R apn n hi cr sodn o a e adte h r l a teO i l a r fnr u tnt S L a , / m p i adte or p nigt l i m d ,n hntepo e t t h / sy e i o i o g r e o ss b m h
gr( o 产品类 别 ) ds ( y ,ec 对商 品的描 述) 。在 一次按类 别查询 的
0 引 言
关系型数据库在现 阶段 应用 系统 中的地 位已经非 常稳 固 , 绝大部分 的企业应用软件都 要使用 关系型 数据库来存 储数据 。 它作为企业应用软 件的底层 , 有着不 可替代 的作用 。而现 在主 流的开发语言是面 向对 象 的, 如 j a C++等。这类 语 言具 例 a 、 v
由于 它的 粗 粒度 , 失 了 数据 库 操 作 应 有 的灵 活性 。 给 出相 应 的 S L a 丧 Q m p解 决 方 法 : 两 个 类 映 射 同 一 张 表 并且 共 用 一 个 缓 冲 池 。 用 最 后 通 过 实 际 的性 能 比较 , 明 了此 种 解 决 方 案 的有 效 性 。 证 关键 词 O R apn S L a Hb ra Iai / m pi g Q m p ient b t e s
操作中 , 得到 的是一个 pout rdc 的列表 , ec属性 占用 的 内存大 ds 小将 相当可观 , 而这部分数据往往是用不 到的。但 Hb ra 对 ient e 此却无能为力 , 现在对这类问题 比较常 见的做法 是通过在 H L Q 查询语句中加“e c” sl t关键字来选择几个 目前用得到的字段 , e 然
ibatis学习笔记

ibatis学习笔记Ibatis⽀持.net开发。
sqlMap⽂件<alias> <resultMaps> <statements>$ #符号Mobile like '%$mobile%' ->mobile like '%'+#mobile#+'%'ApplicationContext-ibatis.xml1. 数据源配置dataSource2. sqlMapClient 关联sqlmap-config.xml和数据源dataSource3. dao bean配置,关联sqlMapClientsqlMapClient架构设置配置,如缓存模式(cacheModelsEnabled 缺省true),增加模式(字节码增强 enhancementEnabled 缺省false),延迟加载(lazyLoadingEnabled 缺省true),错误跟踪,最⼤线程数(maxRequests),最⼤会话数(maxSession),最⼤事务数(maxTransaction),使⽤命名空间(useStatementNamespaces 缺省false 例如:queryForObject("sqlMapName.statementName"); )。
maxRequests > maxSession,maxTransactions, 缺省512maxSession >= maxTransactions && maxSession < maxRequest 缺省128maxTransactions <= maxSession && maxTransaction <远远⼩于 maxRequest 缺省32数据源配置参数说明:Pool.MaximumActiveConnections: 数据库连接池可维持的最⼤容量Pool.MaximumIdelConnections: 数据库连接池中允许的挂起(idle)连接数SIMPLE模式:Pool.MaximumCheckoutTime: 连接被某个任务所允许占⽤的最⼤时间。
iBATIS In Action:执行非查询语句(一)

对数据库执行查询无疑很重要,但多数程序同时也需要将数据写入数据库。
在本章中,我们将探究使用iBATIS操作数据库的几种方式。
本章的内容以第4章介绍的概念为基础,因此,如果您刚开始接触iBATiS,还没读过第4章,可以先去浏览一下,因为这一章中的关于参数映射的绝大部分内容同样适用于本章的非查询语句。
5.1 更新数据的基石在第4章中,您已经学习了所有的语句类型和基本查询相关的部分API。
这里我们再来看一下执行非查询语句常用的API,然后回顾一下更新数据库相关的语句类型。
5.1.1 非查询SQL语句相关的API我们把更新数据库的一些“高级”的技术保留在下章中,这里就仅仅看一下insert,update,delete的基本内容——更新数据库时最常用的三个方法。
不过,现在只给出简单的介绍,暂时已经够用了,它们的详细内容将在本章稍后给出。
Insert方法也许您已猜到,Insert方法用于执行那些对应于SQL中INSERT语句的映射语句:object Insert(string statementName, object parameterObject);Insert方法接受两个参数:映射语句的名称(id)和作为参数的对象,后者包含了要插入到数据库的数据。
在更新数据库所用的三个方法中,Insert方法与另两个不同,它返回的是一个object(见5.2.3节)。
Update方法Update方法用于执行那些对应于SQL中UPDATE语句的映射语句:int Update(string statementName, object parameterObject);与Insert方法一样,Update方法也接受两个参数:映射语句的名称(id)和作为参数的对象。
返回值则是执行UPDATE语句所影响的行数。
Delete方法Delete方法与Update方法几乎一样,只是它是用来执行DELETE语句的:int Delete(string statementName, object parameterObject);Delete方法的两个参数与上面两个方法的参数一样:映射语句的名称(id)和作为参数的对象。
iBATIS In Action:什么是iBATIS(一)

在上一章中我们详细讨论了iBATIS的哲学观,以及这个框架的来历。
我们也说过,iBATIS是一个混合式的解决方案(hybrid solution),借鉴了多种操作关系数据库的方法的理念。
那么iBATIS到底是什么呢?这一章就来回答这个问题。
iBATIS是一种data mapper。
Martin Fowler在他的《Patterns of Enterprise Application Architecture》一书中是这样描述Data Mapper的:一个映射层,在对象和数据库间传递数据,并保持两者与映射层本身相独立。
.注:Mapper是在两个独立对象间建立通信关系的一种对象。
Martin很好地区分了数据映射(Data Mapping)和元数据映射(Metadata Mapping),后者正是O/RM工具的依据,这种工具将数据库的表和列映射到应用程序中的类和字段(field),也就是说它将数据库的元数据映射到类的元数据。
图2.1显示了类和数据库表的O/R 映射的情形。
在这种情况下,类的每个字段映射到了表中的一个相应的列。
译注:在C#中通常在类的属性(Property)与表的列间进行映射。
iBATIS则与之不同,它不是直接在类与数据表或字段与列之间进行关联,而是把SQL语句的参数(parameter)和返回结果(result)映射至类。
在本书的剩余部分您将看到,iBATIS是处于类和数据表之间的一个中间层,这使得它在类和数据表之间进行映射时更加灵活,而不需要数据库模型或对象模型(object model)的任何修改。
我们所说的中间层实际上就是SQL,它使得iBATIS能够更好地分离数据库和对象模型的设计,这样就相对减少了两者间的耦合。
图2.2说明了iBATIS如何使用SQL映射数据。
从图2.2可以看到,iBATIS的映射层正是SQL。
您只管写您的SQL,iBATIS会为您处理类的属性和数据表的列之间的映射。
iBATIS In Action:使用映射语句(二)

iBATIS In Action:使用映射语句(二)上一篇:iBATIS In Action:使用映射语句(一);4.3 映射参数(Mapping Parameters)对于大多数SQL语句来说,它们有用是因为我们可以在运行时向其传入参数。
有两种方式可以将参数(parameter)映射到语句中:内联(inline)参数和外部(external)参数。
使用内联参数,配置一般较为简单,iBATIS会根据您的配置进行“揣测”,以获取其它细节信息。
而使用外部参数时,配置一般更为显式的(具体)——因为您告诉iBATIS它该如何去做。
4.3.1 外部参数映射参数映射(Parameter Map)定义了一个参数的有序列表,它与查询语句的占位符相匹配。
注意,参数对象的属性定义可以按任意顺序,参数映射会确保每个值得以正确地传入。
使用外部参数映射时,我们可以指定多达10个的特性。
如果没有完全指定,iBATIS会藉由反射来确定出一些合理的默认值,这个过程会花费一定的时间,也有可能不够准确。
表4.4列出了适用于映射参数的特性,并对其做了简要的介绍。
映射参数的特性(attribute)内联参数在多数情况下效果不错。
如果您希望改善性能,或者遇到了意外的情况,外部参数可能就用得上了。
在第5章中,我们会更全面地讨论外部参数,在这里,暂不需要。
4.3.2 重温内联参数如果您更喜欢使用内联参数,同样可以为参数指定更多的信息,如属性的类型,类的类型以及null值替换(即nullValue特性)。
看下面四个例子:<statement id="insertProduct" parameterClass="Product">insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)values (#id#, #description#)</statement>这是最简单的情况,下面这个例子指定了dbType:<statement id="insertProduct" parameterClass="Product">insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)values (#id:int#, #description:VarChar#)</statement>下面这个例子指定了nullValue:<statement id="insertProduct" parameterClass="Product">insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)values (#id:int:-999999#, #description:VarChar#)</statement>类似于Java中的DataMapper,内联参数还有另外一种语法,使用逗号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、ibatis。
net可以应用于其他编程语言2、ibatis不适用的地方a:对数据库有永远拥有控制权b:当应用程序需要完全动态的sqlc:当数据库不是关系数据库时3、使用内联参数#和$区别:在IbatiS的select中有两个占位符# 和$我们先看一个一个查询语句:select * from user where Name = #userName#;我们用#这个占位符可以查询到我们想要的结果,可是当我们需要模糊查询的时候该怎么办呢?select * from user where Name = ‘%#userName#%’(错误的写法);如果我们这样写,程序在编译的时候会报错,因为# 这个占位符前面还有别的符号,#这个占位符是不允许这样写的,这个时候我们就可以用$ 这个占位符:select * from user where Name = ‘%$userName$%’(正确的模糊查询写法),这样写编译器不会报错,也能得到我们想要的结果。
归根结底的原因就是# 占位符会把我们的SQL 语句翻译成select * from user where Name = ? 这样的语句,然后在填充参数。
$ 占位符会把我们的SQL语句翻译成select * from user where Name = '想要查询的东西' 这个样标准的SQL语句这样使用$也会带来sql注入的问题。
4、自动插入主键selectkey标签的使用,做为select的子元素使用5、如果子查询过多,可以考虑使用存储过程,后续需要进一步对存储过程进行进一步学习。
6、ibatis中还可以使用xml做为参数或结果,这样就可以以string的方式传入参数或传出结果7、数量过多时会存在数据库I/O问题,这是可以使用高速缓存,另外也可以使用延迟加载,就是在主配置文件中将<setting>元素的lazyloadingenabled设置为true,另外关于高速缓存的方案····8、在有子查询时,会出现N+1问题,解决方案:groupby方法,需要进一步去理解。
9、元素<statement>类型的已映射语句,没有对应的发放可以调用,由于ibatis并没有正式的支持DDL,因此可以用<statement>定义表和索引,但不能确保所有数据库都支持10、处理超大型数据集可以使用RowHandler(行处理器)11、一定要对事务有好的把握,比如特性:原子性、一致性、隔离性,还有事务的分类,自动事务、局部事务和全局事务,局部事务是通过JDBC Connection API来管理事务的,需要有事务的start、commit 和end,全局事务有主动和被动之分另外事务划界遵循原则:事务的范围越宽越好,但绝不能超过一次用户的动作范围。
实例:Java代码1.public void runStatementsUsingSetUserConnection() {2.SqlMapClient sqlMapClient =3.SqlMapClientConfig.getSqlMapClient();4.Connection conn = null;5.try {6.conn = dataSource.getConnection();7.conn.setAutoCommit(false);8.sqlMapClient.setUserConnection(conn);9.Person p =10.(Person)sqlMapClient.queryForObject11.("getPerson", new Integer(9));12.p.setLastName("Smith");13.sqlMapClient.update("updatePerson", p);14.Department d =15.(Department)sqlMapClient.queryForObject16.("getDept", new Integer(3));17.p.setDepartment(d);18.sqlMapClient.update("updatePersonDept", p);mit();20.} finally {21.sqlMapClient.setUserConnection(null);22.if (conn != null) conn.close();23.}24.}25.26.也可以使用openSession27.28.public void runStatementsUsingSetUserConnection() {29.SqlMapClient sqlMapClient =30.SqlMapClientConfig.getSqlMapClient();31.Connection conn = null;32.SqlMapSession session = null;33.try {34.conn = dataSource.getConnection();35.conn.setAutoCommit(false);36.session = sqlMapClient.openSession(conn);37.Person p =38.(Person)session.queryForObject("getPerson",39.new Integer(9));40.p.setLastName("Smith");41.session.update("updatePerson", p);42.Department d =43.(Department)session.queryForObject44.("getDept", new Integer(3));45.p.setDepartment(d);46.session.update("updatePersonDept", p);mit();48.} finally {49.if (session != null) session.close();50.if (conn != null) conn.close();51.}52.}12、ibatis的DAO层也能够管理接口与实现的分离,但是Spring也能够用来管理你的数据库连接与事务,就像ibatis的DAO层所做的一样,Spring的最大优势就是在于它不仅仅是针对DAO类的它能够管理应用程序的所有部分。
13、动态sql是一个强大的查询方法,一般先简单考虑问题,写出静态SQL语句,然后将静态变为动态SQL。
14、ibatis提供了高速缓存的机制的,ibatis内置的各种高速缓存模型类型有MEMORY、FIFO、LRU和OSCACHE,MEMORY:这个模型简单的将高速缓存保存在内存中,直至垃圾收集器将它移出FIFO:先进先出、LRU:最近最少使用、OSCACHE:这个模型使用OpenSymphony高速缓存高速缓存的清除使用flushOnExecute、flushInterval标签可以定义清空缓存触发条件<flushOnExecute> 定义查询已映射语句,其执行将引起相关高速缓存的清除<flushInterval> 定义一个时间间隔,高速缓存将以此间隔定期清除<flushInterval>标签属性如下:hours(可选) 每次清除高速缓存前应该经过的小时数minutes(可选)每次清除高速缓存前应该经过的分钟数seconds(可选) 每次清除高速缓存前应该经过的秒数milliseconds(可选)每次清除高速缓存前应该经过的毫秒数实例:Xml代码1.<cacheModel id="product-cache"type="MEMORY">2.<flushInterval hours="24"/> //每隔多长时间更新,hours,minutes,seconds等3.<flushOnExecute statement="insertProduct"/> //定义的映射id,当执行insertProduct时,执行高速缓存4.<flushOnExecute statement="updateProduct"/>5.<flushOnExecute statement="deleteProduct"/>6.<property name=”reference-type” value=”WEAK” /> //MEMORYcache实现只认识一个<property>元素。
这个名为“reference-type”属性的值必须是STRONG,SOFT和WEAK三者其一。
7.默认是weak,让垃圾处理器去处理8.</cacheModel>9.<cacheModel id="product-cache"type="LRU">10.<flushInterval hours="24"/>11.<flushOnExecute statement="insertProduct"/>12.<flushOnExecute statement="updateProduct"/>13.<flushOnExecute statement="deleteProduct"/>14.<property name=”size” value=”1000” /> //缓冲区大小15.</cacheModel>16.<cacheModel id="product-cache"type="FIFO">17.<flushInterval hours="24"/>18.<flushOnExecute statement="insertProduct"/>19.<flushOnExecute statement="updateProduct"/>20.<flushOnExecute statement="deleteProduct"/>21.<property name=”size” value=”1000” />22.</cacheModel>23.<cacheModel id="product-cache"type="OSCACHE">24.<flushInterval hours="24"/>25.<flushOnExecute statement="insertProduct"/>26.<flushOnExecute statement="updateProduct"/>27.<flushOnExecute statement="deleteProduct"/>28.</cacheModel>实际用法Xml代码1.<select id=”getProductList” cacheModel=”productCache”>2.select * from PRODUCT where PRD_CAT_ID = #value#3.</select>。