Ibatis学习笔记
- 格式:pdf
- 大小:72.17 KB
- 文档页数:5
配置文件 (2)iBaits中SqlMapClientTemplate的使用 (8)iBatis2之SqlMap配置总结(18条) (10)parameterMap (15)配置文件(1)jdbc连接的属性文件driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testusername=rootpassword=roots(2)总配置文件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMapConfigPUBLIC "-////DTD SQL Map Config 2.0//EN""/dtd/sql-map-config-2.dtd"><sqlMapConfig><properties resource="examples/domain/SqlMapConfigExample.properties" /><settings cacheModelsEnabled="true" enhancementEnabled="true"lazyLoadingEnabled="true" maxRequests="32" maxSessions="10"maxTransactions="5" useStatementNamespaces="false" /><transactionManager type="JDBC"><dataSource type="SIMPLE"><property name="JDBC.Driver" value="${driver}" /><property name="JDBC.ConnectionURL" value="${url}" /><property name="ername" value="${username}" /><property name="JDBC.Password" value="${password}" /> </dataSource></transactionManager><sqlMap resource="examples/domain/Person.xml" /></sqlMapConfig>⑴ Settings 节点参数描述cacheModelsEnabled是否启用SqlMapClient 上的缓存机制。
ibatis 学习之道:iBatis 简单入门教程iBatis 简介:iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。
如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。
官网为:mybatis/搭建iBatis 开发环境:1、导入相关的jar 包,ibatis-2.3.0.677.jar、mysql-connector-java-5.1.6-bin.jar2、编写配置文件:Jdbc 连接的属性文件总配置文件,SqlMapConfig.xml关于每个实体的映射文件(Map 文件)Demo:Student.java:publicclassStudent { // 注意这里需要保证有一个无参构造方法,因为包括Hibernate 在内的映射都是使用反射的,如果没有无参构造可能会出现问题privateintid; privateString name; privateDate birth; privatefloatscore; publicintgetId() { returnid; publicvoidsetId(intid) { this.id = id; publicString getName() { returnname; publicvoidsetName(String name) { = name; publicDate getBirth() { returnbirth; publicvoidsetBirth(Date birth) { this.birth = birth; publicfloatgetScore() { returnscore; publicvoidsetScore(floatscore) { this.score = score; @Override publicString toString() { return”id=“+id +”\tname=“+name +”\tmajor=“+birth +”\tscore=“+ score +”\n”;?xmlversion=“1.0”encoding=“UTF-8”?!DOCTYPE sqlMap PUBLIC “-//ibatis.apache//DTD SQL Map 2.0//EN”“ibatis.apache/dtd/sql-map-2.dtd”sqlMap !--。
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)增强了项目中的分工和项目的可移植性。
核心提示:SqlMap的配置是iBatis中应用的核心。
这部分任务占据了iBatis 开发的70的工作量。
1、命名空间: sqlMap namespace=Account,在此空间外要引用此空间的元素,则需要加上命名空间名。
2、实体的别名: typeAlias alias=Account type=vasoft.ibatissut.simSqlMap的配置是iBatis中应用的核心。
这部分任务占据了iBatis开发的70的工作量。
1、命名空间:<sqlMap namespace="Account">,在此空间外要引用此空间的元素,则需要加上命名空间名。
2、实体的别名:<typeAlias alias="Account"type="vasoft.ibatissut.simple.domain.entity.Account"/>如果有用到的全名的地方,可以用别名代替,受命名空间约束。
3、插入操作对于自增主键的表,插入可以不配置插入的主键列。
否则是必须的。
4、获取主键插入语句之前配置:主要是针对Sequence主键而言,插入前必须指定一个主键值给要插入的记录。
Oracle、DB2亦如此,方法是在插入语句标签<insert....>之前配置上:<insert id="insertAccount" parameterClass="Account"><selectKey resultClass="long" keyProperty="sctId">SELECT SEQ_TEST.NEXTVAL FROM DUAL</selectKey>insert into .... ........</insert>插入语句之后配置:主要是针对自增主键的表而言,这类表在插入时不需要主键,而是在插入过程自动获取一个自增的主键。
Ibatis学习笔记DOCUMENT HISTORY目录一、Ibatis优点 (6)A.优点 (6)1.ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便利。
(6)2.ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数据库编程的重复工作。
(6)3.简单易于学习,易于使用,非常实用。
(6)4.因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。
(6)5.阿里巴巴、慧点科技等多家知名软件公司都使用Ibatis。
(6)B.与JDBC相比较 (6)1.减少了61%的代码量 (6)2.简单 (6)3.架构级性能增强 (7)4.Sql语句与程序代码分离 (7)5.简化项目中的分工 (7)6.增强了移植性 (7)C.缺点 (7)1.参数数量只能一个 (7)2.需要手写sql (7)D.简介 (7)二、准备ibatis环境 (8)A.搭建环境:导入相关的jar包 (8)1.数据库驱动包 (8)2.Ibatis包 (8)B.配置文件: (8)1.Jdbc连接的属性文件 (8)2.总配置文件 (8)3.关于每个实休的映射文件(map文什) (8)C.属性文件 (8)D.总配置文件:SqlMapConfig.xml (9)E.映射文件 (9)F.读取配置 (11)G.CRUD 借助SqlMapClient中的方法 (13)1.queryForObject 查询单条记录 (13)2.queryForList 查询多条记录 (13)3.insert 新增 (13)4.delete 删除 (13)5.update 更新 (13)6.select 查询 (13)H.标签使用 (13)1.typealias 类型别名 (13)三、查询所有的对象 (14)A.select 标签 (14)B.业务逻辑查询所有对象 (14)四、查询指定id的单个对象 (15)A.select 标签 (15)B.业务逻辑查询单个对象 (15)五、插入一个实体对象 (16)A.insert 标签 (16)B.业务逻辑插入一个实体对象 (16)六、删除指定id的单个对象 (17)A.delete 标签 (17)B.业务逻辑删除单个对象 (17)七、修改实体对象 (18)A.update 标签 (18)B.业务逻辑修改单个对象 (18)八、模糊查询实体对象 (19)A.select 标签 (19)B.业务逻辑模糊查询 (19)九、sql主键生成方式 (20)A.insert 标签,使用序列的方式来生成主键 (20)B.业务逻辑插入数据的主键生成方式 (20)十、代码整理 (21)A.项目结构图 (21)1.DAO接口IStudentDAO.java (21)2.DAO接口实现类IStudentDAOImpl.java (22)3.JavaBean实体对象Student.java (25)4.实体类映射文件Student.xml (27)5.日志文件log4j.properties (29)6.属性文件SqlMap.properties (31)7.总配置文件SqlMapConfig.xml (31)8.Junit4测试文件IStudentDAOImplTest.java (32)一、Ibatis优点A. 优点1.ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便利。
ibatis学习笔记(一)>>>>>>>sqlMapConfig.xml文件详解1.sqlMapConfig.xml配置文件详解:Xml代码1.<?xml version="1.0"encoding="UTF-8"?>2.<! DOCTYPE sqlMapConfig3.P UBLIC "-////DTD SQL Map Config 2.0//EN"4."/dtd/sql-map-config-2.dtd" >5.<sqlMapConfig>6.<settings7.cacheModelsEnabled ="true" <!--是否启用缓存机制-- >zyLoadingEnabled="true"<!-- 是否启用延迟加载机制 -->9.enhancementEnabled="true"<!-- 是否启用字节码增强机制 -->10.errorTracingEnabled="true"<!-- 是否启用错误处理机制 -->11.maxRequests="32"<!-- 最大并发请求数 -->12.maxSessions="10"<!-- 最大Session数 -->13.maxTransactions="5"<!-- 最大并发事务数 -->eStatementNamespaces="true"/><!-- 是否启用名称空间 -->15.<transactionManager type ="JDBC"><!-- 定义了ibatis的事务管理器有3中(JDBC,JTA,EXTERNAL) -->16.<dataSource type ="SIMPLE"><!-- type属性指定了数据源的链接类型,也有3种类型(SIMPLE,DBCP,JNDI) -->17.<property name ="JDBC.Driver"value ="com.mysql.jdbc.Driver"/>18.<property name ="JDBC.ConnectionURL"value ="jdbc:mysql://localhost/test"/>19.<property name ="ername"value ="root"/>20.<property name ="JDBC.Password"value ="wyq"/>21.<property name ="Pool.MaximumActiveConnections"value ="10"/><!-- 连接池维持的最大容量 -->22.<property name ="Pool.MaximumIdleConnections"value ="5"/><!-- 连接池允许挂起的最大连接 -->23.<property name ="Pool.MaximumCheckoutTime"value ="120000"/><!-- 连接被某个任务所允许占用的最大时间 -->24.<property name ="TimeToWait"value ="500"/><!-- 线程允许等待的最大时间 -->25.26.</dataSource>27.</transactionManager>28.<sqlMap resource ="com/wyq/map/userMap.xml"/>29.</sqlMapConfig>一transactionManager节点transactionManagerab 定义了ibatis的事务管理器,目前提供了以下几种选择:1) JDBC通过传统JDBC mit/rollback实现事务支持.2) JTA使用容器提供的JTA服务实现全局事务管理.3) EXTERNAL外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自动的事务管理机制.此时ibatis将把所有事务委托给外部容器进行管理.此外,通过Spring等轻量级容量实现事务的配置化管理也是一个不错的选择.二dataSource 节点dataSource 从属于transactionManager, 用于设定ibatis运行期使用DataSource属性.type 属性: dataSource 元素的type 属性指定了dataSource 的实现类型.可选项目:1) SIMPLE:SIMPLE 是ibatis 内置的dataSource 实现,其中实现了一个简单的数据库连接池机制,对应ibatis 实现类为com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory.JDBC 使用数据库自己的事务(局部事务),connect.beginTranstion(), mit()等.2) DBCP基于Apache DBCP连接池组件实现的DataSource封装,当无容器提供DataSource服务时,建议使用该选项,对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory.JTA :使用jta 事务管理器管理事务(全局事务),使用userTranstion对象.3) JNDI使用J2EE容器提供的DataSource实现, DataSource将通过指定的JNDI Name从容器中获取.对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory.Ibatis 不控制事务,事务交由外部控制,一般在CTM,或spring托管事务中使用.JNDI的配置大部分都在应用服务器中进行,所以在ibatis中的配置相对简单(1)jdbc事务控制的JNDI配置Xml代码1.<transctionManager type ="JDBC">2.<dataSource type ="JNDI">3.<property name ="DataSource"value ="java:comp/env/jdbc/myDataSource"/>4.</dataSource>5.</transctionManager>(2)JTA事务控制的JNDI配置Xml代码1.<transctionManager type ="JTA">2.<property name ="UserTransaction"value ="java:/ctx/con/UserTransaction"/>3.<dataSource type ="JNDI">4.<property name ="DataSource"value ="java:comp/env/jdbc/myDataSource"/>5.</dataSource>6.</transctionManager>sqmMap节点指定了映射文件的位置,配置文件中可以定义多个sqlMap元素,以指定项目内所包含的所有映射文件.ibatis学习笔记(二)>>>>>>>sqlMapConfig.xml文件详解ibatis基础代码包括:1.ibatis实例配置一个典型的配置文件如下(具体配置项目的含义见后):<? xml version="1.0" encoding="UTF-8" ?><! DOCTYPE sqlMapConfigPUBLIC "-////DTD SQL Map Config 2.0/"[url]/dtd/[/url]sql-map-config-2.dt<sqlMapConfig >< settingscacheModelsEnabled ="true"enhancementEnabled ="true"lazyLoadingEnabled ="true"errorTracingEnabled ="true"maxRequests ="32"maxSessions ="10"maxTransactions ="5"useStatementNamespaces ="false"/>< transactionManager type ="JDBC" >< dataSource type ="SIMPLE" >< property name ="JDBC.Driver" value ="com.p6spy.engine.spy.P6SpyDriver" />< property name ="JDBC.ConnectionURL" value="jdbc:mysql://localhost/sample" />< property name ="ername" value ="user" />< property name ="JDBC.Password" value ="mypass" />< property name ="Pool.MaximumActiveConnections" value ="10" />< property name ="Pool.MaximumIdleConnections" value ="5" />< property name ="Pool.MaximumCheckoutTime" value ="120000" />< property name ="Pool.TimeToWait" value ="500" />< property name ="Pool.PingQuery" value ="select 1 from ACCOUNT" />< property name ="Pool.PingEnabled" value ="false" />< property name ="Pool.PingConnectionsOlderThan" value ="1" />< property name ="Pool.PingConnectionsNotUsedFor" value ="1" /></ dataSource ></ transactionManager >< sqlMap resource ="com/ibatis/sample/User.xml" /></ sqlMapConfig >⑴Settings 节点cacheModelsEnabled是否启用SqlMapClient上的缓存机制。
目录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?iBatis是一种“半自动”的ORM工具,其对SQL进行了封装(像函数一样设置输入获得输出)和外部化(将SQL代码从java程序中分离出去,在单独的XML映射文件中开发和维护),iBatis的API都是面向对象的,也就是说这些API的输入输出都是通过对象(javabean,Map,基本类型及其封装类,XML)来传递的。
iBatis的几点主要特性:iBatis利用XML来封装SQL。
iBatis所处的位置:iBatis架构位于数据持久层,位于应用程序的业务逻辑层和数据库之间,使代码更容易维护。
感觉这几个层的具体代码实现上都是通过类来组织起来的,就像c是通过函数来组织起来的。
ORM工具将数据库表及其列映射为应用程序中的类及字段,元数据映射正是适合使用ORM 工具的地方。
ORM工具将数据库表及其列映射为应用程序中的类及字段。
iBatis和O/RM不同,不是直接把类映射为数据库表或者把类的字段映射为数据表列,而是把SQL语句的参数和结果(输入输出)映射为类。
iBatis主要有SQL Map配置文件,SQL Map文件,以及相关的API组成。
SQL Map配置文件:<properties>元素,在主配置文件之外提供一个名/值对列表,有两个属性resource 和url,前者在应用程序的类路径上定位资源,后者则是以绝对路径来获取资源。
<properties resource = “db.properties”/><property name = “JDBC.Driver”value = “${driver}”/><settings>元素,有元素lazyLoadingEnabled,延迟加载,只加载必要信息而推迟加载其他未明确请求的数据的技术,用于指定相关联的已映射语句时,是否使用延迟加载,默认值为true. cacheModelsEnabled,用户提高程序性能的技术,基于用过的数据往往很快又会被用的假设,默认值为true,必须为已映射语句配置高速缓存模型。
/62575/83896iBatis2学习笔记:基本原理和配置iBatis2是一个轻量级的数据持久化框架,它是一个半自动化的ORMapping工具,数据库的操作依赖程序员自己书写的SQL,因此可以最大限度发挥JDBC的性能。
据测试,它的性能和JDBC是一个级别的,但代码比JDBC简单的多,据说相对JDBC节省了60%的代码量。
缺点是映射不灵活,有时候感觉很别扭。
当领域对象关系复杂的时候,关联基本上行不通。
--复杂关系通过存储过程解决吧by scott注.iBatis2整个框架的jar包就一个,337KB,相比Hibernate等其他框架非常的小巧可爱,并且有.net语言版本。
iBatis2的优缺点不是关心的重点,主要是在实际中扬长避短。
下面是iBatis2的框架图:和Hibernate的SessionFactory类似,iBatis2有SqlMapClientBuilder一个类,通过配置文件SqlMapConfig.xml类构建,这个是线程安全的类,并且是单例模式,从它里面可以获取SqlMapClient,SqlMapClient相当于Hibernate的session,用来执行预定义的SQL语句。
因此SqlMapClient Builder、SqlMap Config.xml、SqlMap Client将是学习iBatis2的核心。
以后会逐渐展开,下面是从变成角度来构建SqlMapClientBuilder。
String resource ="SqlMapConfig.xml";Reader reader = Resources.getResourceAsReader(resource);SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);由于SqlMapClient Builder的构建是相当耗时的,因此一般都是在程序启动的时候构建一次,并反复使用。
1) 在parameterMap 和resultMap 中,字段数据类型是java .sql.Types 类定义的常量名称。
常用的数据类型包括BLOB ,CHAR,CLOB,DATE,LONGVARBINARY ,INTEGER ,NULL ,NUMERIC ,TIME ,TIMESTAMP 和VARCHAR 等。
2) 对于数据表中NULLBALE 的字段,必须在parameterMap 和resultMap 中指定字段的数据类型。
3) 对于数据类型是DATE,CLOB 或BLOB 的字段,最好在parameterMap 和resultMap中指定数据类型。
4) 对于二进制类型的数据,可以将LONGVARBINARY 映射成byte[] 。
5) 对于文本类型较大的数据,可以将CLOB 映射成String。
6) Java Bean 必须拥有缺省的构造器(即无参数的构造器)。
7) Java Bean 最好实现Serializable 接口,以备应用的进一步扩展。
<dataSource type="SIMPLE">dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性type属性:dataSource节点的type属性指定了dataSource的实现类型1. SIMPLE:SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的数据库连接池机制,对应ibatis 实现类为com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。
resultClassresultClass 属性的值是Java 类的全限定名(即包括类的包名)。
resultClass 属性可以让您指定一个Java 类,根据ResultSetMetaData 将其自动映射到JDBC 的ResultSet。
一、ibatis教程之ibatis介绍:ibatis是什么呢?相对于hibernate和apache ojb等“一站式”orm解决方案而言,ibatis是一种“半自动化”的orm实现。
这个框架将让你能够更好的在java应用中设计和实现实体层。
这个框架有两个主要的组成部分,一个是sql maps,另一个是data access objects。
另外还包括一些可能很有用的工具。
sql maps:sql maps是这个框架中最激动人心的部分,它是整个ibatis database layer的核心价值所在。
通过使用sql maps你可以显著的节约数据库操作的代码量。
sql maps使用一个简单的xml 文件来实现从javabean到sql statements的映射。
跟其他的框架或者对象映射工具相比,sql maps最大的优势是简单。
它需要学习的东西很少,在连接表或复杂查询时也不需要复杂的scheme(怎么翻complex scheme?),使用sql maps,你可以自由的使用sql语句。
data access objects (dao)当我们开发灵活的java应用时,有一个好主意就是通过一个通用api层把实体操作的细节封装起来。
data access objects允许你通过一个简单接口的来操作数据,从而隐藏了实现的细节。
使用dao,你可以动态配置你的应用程序来访问不同的实体存储机制。
如果你有一个复杂的应用需要用到几个不同的数据库,dao可以让你建立一个一致的api,让系统的其他部分来调用。
utilitiesibatis database layer包含一系列的有用的工具,比如simpledatasource,jdbc datasource 2.0(也包括3.0)的一个轻量级实现。
scriptrunner也提供了从单元测试到自动发布的数据库准备工作。
工作流程:sql maps提供一个简单的框架,通过xml描述来映射javabeans,map implementations甚至原始类型的包装(string,integer等)到jdbc preparedstatement。
Spring+ibatis批量存储心得 21、上回的心得中我强调了startBatch()的批处理的作用,但是其中的使用是个错误用法,并没有发挥出startBatch()的实力,对此给与观众的误导我将在此表示到欠,并贴出正确的用法public class LocalDaoImpl extends SqlMapClientDaoSupport implements LocalDao {public void insertBuNaTaxBatLst(final PaginatedList list){getSqlMapClientTemplate().execute(new SqlMapClientCallback() {public Object doInSqlMapClient(SqlMapExecutor executor)throws SQLException {executor.startBatch();// do some iBatis operations herefor(int i=0,count=list.size();i<count;i++){executor.insert("insertBuNaTaxBatLst", list.get(i));if (i % 50 == 0) {System.out.println("----" + i);//没有意义只为测试}}executor.executeBatch();return null;}});}}这样才能利用上startBatch()威力。
2、注意ibatis的事物默认情况下是自动提交的,如果发现速度上有问题可以留意一下,ibatis只有在显示的声明事物管理的情况下才自动将事物管理改为不自动方式。
3、还是startBatch(),据我测试分析这个鬼东西只有在executeBatch(),才把所有的语句提交到数据库,在提交之前缓存中保留了大量的sql语句和数据对象,很有可能out of memony,对此要留意,可以在大量数据要做插入时,分批用Batch,如:有40000条数据可将其分为4个Batch块,让后将这4个Batch用一个事物提交以保证数据完整性。
ibatisiBA TIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。
最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。
iBA TIS 提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。
相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半自动化”的ORM实现。
所谓“半自动”,可能理解上有点生涩。
纵观目前主流的ORM,无论Hibernate 还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全套映射机制。
程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate或者OJB 提供的方法完成持久层操作。
程序员甚至不需要对SQL 的熟练掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。
大多数情况下(特别是对新项目,新系统的开发而言),这样的机制无往不利,大有一统天下的势头。
但是,在一些特定的环境下,这种一站式的解决方案却未必灵光。
在笔者的系统咨询工作过程中,常常遇到以下情况:1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
2.开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交通银行,都在开发规范中严格指定)3.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
面对这样的需求,再次举起Hibernate 大刀,却发现刀锋不再锐利,甚至无法使用,奈何?恍惚之际,只好再摸出JDBC 准备拼死一搏……,说得未免有些凄凉,直接使用JDBC进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码,乏味的字段读取操作令人厌烦。
Tapestry4.1.2入门| [转帖]小●英●的●作●文(超级爆笑) 2008-07-14iBATIS框架理论学习篇关键字: ibatisiBATIS框架学习[20070409]作者:kimsoft自己整理的对iBATIS框架的一些简单理论知识,有助于进一步了解和深入学习iBATIS框架,错误或不当之处,在所难免。
1、什么是iBATIS1.1作者Clinton Begin,很牛X的名字1.2背景故事Clinton Begin于2001年启动iBATIS项目,最先的焦点是发展密码软件解决方案。
第一个iBATIS产品是Secrets,是一个象PGP的个人数据加密器和签名工具。
Secrets完全用Java编写并在一个开源许可下发布。
在发布Secrets Java版后不久,iBATIS项目陷入困境转而关注Web和其它internet相关的技术,在接下来的一年中,两个有趣的软件开发完成,包括Axle web 框架,一个JSP可选工具。
Lookout邮件客户端差不多完成90%在being set on the back burner之前,同时更多有趣的挑战接踵而来…1.3加入Pet Store“基准”在2002年早些时候,Microsoft发布一个纸面文档声称.NET有10倍于J2EE的速度和4倍多的生产效率。
事实是这只是简单的而不是典型的。
iBATIS项目在2002年7月1日快速回应,JPetStore 1.0发布了。
基于相同的Pet Store需求,JPetStore证明了Java不仅比.NET更有生产效率,同时比Microsoft的实现拥有更好的架构。
JPetStore利用有趣的持久层迅速地引起了开源社区的关注。
在JPetStore发布不久,对SQL Maps和DAO框架的问题和要求使大家知道的iBATIS Database Layer产生了。
iBATIS Database Layer包含两个被打包在一起的框架:SQL Maps和DAO。
初学ibatis前段时间ibatis3.0发布出来了,迫不及待,将其源码下载拜读。
相对ibatis 2.x来说,3.0已是完全改变。
具体我就不在这细说,论坛中有一个帖子介绍了ibatis 3.0的新特征及使用。
由于其他模块的源码我还未细读,在这篇中,先来讨论Dynamic Sql在ibatis 3.0中的实现并比较2.x对应模块的设计。
写在前头的话:其实如从设计模式应用角度去看待ibatis 3.0中Dynamic Sql的实现,这篇跟我的上篇(HtmlParser设计解析(1)-解析器模式)相同,都是使用Interpreter模式。
这篇权当Interpreter模式的另一个demo,认我们体会这些开源项目中设计模式的使用。
学习都是从模仿开始的,让我们吸收高人们的经验,应用于我们实践项目需求中。
从总结中提高:一、对比2.x中与3.0的Sqlmap中dynamic sql配置2.x:Xml代码<select id="dynamicGetAccountList"parameterClass="Account" resultClass="Account">select ACC_ID as id,ACC_FIRST_NAME as firstName,ACC_LAST_NAME as lastName,ACC_EMAIL as emailAddress from ACCOUNT<dynamic prepend="WHERE"><isNotNull prepend="AND"property="emailAddress">ACC_EMAIL = #emailAddress#</isNotNull><isNotNull property="idList" prepend=" or ACC_ID in "><iterate property="idList" conjunction=","open="(" close=")" >#id#</iterate></isNotNull></dynamic></select><select id="dynamicGetAccountList"parameterClass="Account" resultClass="Account">select ACC_ID as id,ACC_FIRST_NAME as firstName,ACC_LAST_NAME as lastName,ACC_EMAIL as emailAddress from ACCOUNT<dynamic prepend="WHERE"><isNotNull prepend="AND" property="emailAddress"> ACC_EMAIL = #emailAddress#</isNotNull><isNotNull property="idList" prepend=" or ACC_ID in "> <iterate property="idList" conjunction="," open="("close=")" >#id#</iterate></isNotNull></dynamic></select>3.0:Xml代码<select id="dynamicGetAccountList"parameterType="Account" resultType="Account">select ACC_ID as id,ACC_FIRST_NAME as firstName,ACC_LAST_NAME as lastName,ACC_EMAIL as emailAddress from ACCOUNT<where><if test="emailAddress != null">ACC_EMAIL = #{emailAddress}</if><if test="idList != null">or ACC_ID IN<foreach item="id" index="index" open="(" close=")" separator="," collection="idList">#{idList[${index}]}</foreach></if></where></select><select id="dynamicGetAccountList" parameterType="Account" resultType="Account"> select ACC_ID as id,ACC_FIRST_NAME as firstName,ACC_LAST_NAME as lastName,ACC_EMAIL as emailAddress from ACCOUNT<where><if test="emailAddress != null">ACC_EMAIL = #{emailAddress}</if><if test="idList != null">or ACC_ID IN<foreach item="id" index="index" open="(" close=")" separator="," collection="idList">#{idList[${index}]}</foreach></if></where></select>从上面这个简单的比较中,第一感觉3.0了中其dynamic sql更加简洁明了。
Ibatis学习笔记1.下载Ibatis软件包/java.cgi2. 创建测试数据库,数据库中创建一个testdb,有如下字段:id:namesexaddress3. 为了在开发过程更加直观,我们需要将ibatis 日志打开以便观察ibatis 运作的细节。
ibatis 采用Apache common_logging,并结合Apache log4j 作为日志输出组件。
在CLASSPATH 中新建log4j.properties 配置文件,内容如下:log4j.rootLogger=DEBUG, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%c{1} -%m%nlog4j.logger.java.sql.PreparedStatement=DEBUG4.创建工程4.1 导入相关的jar文件导入ibatis.jar,我在此用的是ibatis-2.3.4.726.jar。
在学习的过程中发现ibatis3.0的版本与以前的版本有很大的不同。
第一次学习ibatis,还没深入研究。
导入数据库驱动、以及日志。
4.2 创建SqlMapConfig.xml文件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMapConfigPUBLIC "-////DTD SQL Map Config 2.0//EN""/dtd/sql-map-config-2.dtd"><sqlMapConfig><transactionManager type="JDBC" commitRequired="false"><dataSource type="SIMPLE"><property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/><property name="JDBC.ConnectionURL"value="jdbc:mysql://localhost:3306/testdb"/><property name="ername" value="root"/><property name="JDBC.Password" value="root"/></dataSource></transactionManager><sqlMap resource="com/zsw/entity/UserInfo.xml"/></sqlMapConfig>4.3创建数据中表对应的实体类UserInfo.javaprivate int id;private String name;private String sex;private String address;4.4 创建实体类对应的UserInfo.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMapPUBLIC "-////DTD SQL Map 2.0//EN""/dtd/sql-map-2.dtd"><sqlMap namespace="UserInfo"><!-- Use type aliases to avoid typing the full classname every time. --><typeAlias alias="UserInfo" type="UserInfo"/><!-- Result maps describe the mapping between the columns returnedfrom a query, and the class properties. A result map isn'tnecessary if the columns (or aliases) match to the propertiesexactly. --><resultMap id="UserInfoResult" class="erInfo"><result property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><result property="address" column="address"/></resultMap><!-- Select with no parameters using the result map for Account class. --><select id="selectAllUserInfo" resultMap="UserInfoResult">select * from UserInfo</select><!-- A simpler select example without the result map. Note thealiases to match the properties of the target result class. --> <select id="selectUserInfoById" parameterClass="int"resultClass="erInfo">selectid,name,sex,addressfrom UserInfowhere id = #id#</select><!-- Insert example, using the Account parameter class --><insert id="insertUserInfo"parameterClass="erInfo">insert into UserInfo (id,name,sex,address)values (#id#, #name#, #sex#, #address#)</insert><!-- Update example, using the Account parameter class --><update id="updateUserInfo"parameterClass="erInfo">update UserInfo setname = #name#,sex = #sex#,address = #address#whereid = #id#</update><!-- Delete example, using an integer as the parameter class --><delete id="deleteUserInfoById" parameterClass="int">delete from UserInfo where id = #id#</delete></sqlMap>现在要写的最基本的文件都OK了,下面就是进行添、删、改、查进行测试了。
5.测试文件public class UserInfoTest {public static SqlMapClient getSqlMapClient() throws Exception {=Resources.getResourceAsReader("SqlMapConfig.xml");readerReaderSqlMapClientBuilder.buildSqlMapClient(reader);=SqlMapClientsqlMapperreader.close();returnsqlMapper;}public static void main(String[] args) throws Exception {SqlMapClient sqlMapClient = Common.getSqlMapClient();/*<------------------添加--------------------->*/UserInfo user = new UserInfo();user.setName("小周");user.setSex("男");user.setAddress("深圳");user);sqlMapClient.insert("insertUserInfo",// /*<---------------------根据id查询UserInfo------------------>*/// UserInfo user = (UserInfo)sqlMapClient.queryForObject("selectUserInfoById", 2); // System.out.println("姓名------------>:"+user.getName());/*<----------------修改信息----------------->*/// UserInfo userSZ = (UserInfo)sqlMapClient.queryForObject("selectUserInfoById", 1); // userSZ.setAddress("湖北");// UserInfo userJZ = (UserInfo)sqlMapClient.queryForObject("selectUserInfoById", 2); // userJZ.setAddress("湖北");//userSZ);// sqlMapClient.update("updateUserInfo",userJZ);// sqlMapClient.update("updateUserInfo",// /*<----------------查询所有信息----------------->*/// List list = sqlMapClient.queryForList("selectAllUserInfo");// for(int i = 0;i<list.size();i++){(UserInfo)list.get(i);=// UserInfouser// System.out.println("名称:"+user.getName()+"地址:"+user.getAddress()); // }/*<----------------删除数据---------------->*/5);sqlMapClient.delete("deleteUserInfoById",}}Ibatis的对数据库的基本的添、删、改、查到此为止。