ibatis 最新最全的开发文档
ibaties 高级用法
ibaties 高级用法【最新版】目录1.ibaties 的概念与作用2.ibaties 的基本用法3.ibaties 的高级用法4.ibaties 的使用示例5.总结正文1.ibaties 的概念与作用ibaties 是一款功能强大的 Python 库,主要用于自动化测试、Web 测试和 API 测试。
它可以帮助开发人员和测试人员快速编写测试脚本,简化测试流程,提高测试效率。
通过模拟用户操作,ibaties 可以检查 Web 应用或 API 的功能是否符合预期,以便及时发现和修复问题。
2.ibaties 的基本用法ibaties 的基本用法主要包括以下几个方面:- 安装与配置:通过 pip 安装 ibaties,然后在项目中导入相关模块。
- 创建测试环境:ibaties 提供了一个可扩展的测试环境,用户可以根据需要添加各种模块,如数据库、文件系统等。
- 编写测试脚本:通过继承 ibaties 提供的测试类,编写测试脚本,并使用断言方法来检查测试结果。
- 运行测试:通过调用 ibaties 提供的测试运行器来执行测试脚本。
- 查看测试报告:ibaties 可以生成详细的测试报告,包括测试用例的执行情况、测试结果等。
3.ibaties 的高级用法除了基本的测试功能外,ibaties 还提供了许多高级用法,如下所示:- 集成其他测试工具:ibaties 可以与 Selenium、unittest 等其他测试工具集成,实现更复杂的测试需求。
- 编写自定义测试插件:ibaties 支持编写自定义测试插件,用户可以根据需要扩展 ibaties 的功能。
- 使用测试模板:ibaties 提供了丰富的测试模板,用户可以根据模板快速创建测试用例。
- 执行分布式测试:ibaties 支持分布式测试,可以同时运行多台机器上的测试用例。
4.ibaties 的使用示例以下是一个使用 ibaties 进行 Web 测试的简单示例:```pythonfrom ibaties import Mocker, Page, TestCaseclass TestLogin(TestCase):@Mocker.mock_http_response({"code": 200})def test_login_success(self):page = Page("login")page.open()page.fill("username", "test")page.fill("password", "test")page.click("submit")page.assert_text("登录成功")if __name__ == "__main__":TestCase.test_run()```在这个示例中,我们使用 ibaties 的 TestCase 类创建了一个测试用例,通过 Mocker 模块模拟了 HTTP 响应,使用 Page 类操作页面元素,并使用断言方法检查登录成功的提示信息。
MyBatis官方中文文档
现在我们来探究一下这里到底是怎么执行的。
探究已映射的 SQL 语句
现在,或许你很想知道 SqlSession 和 Mapper 到底执行了什么操作,而 SQL 语句映射是个相当大的话题,可能会 占去文档的大部分篇幅。不过为了让你能够了解个大概,这里会给出几个例子。 在上面提到的两个例子中,一个语句应该是通过 XML 定义,而另外一个则是通过注解定义。先看 XML 定义这 个,事实上 MyBatis 提供的全部特性可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以 流行。如果你以前用过 MyBatis,这个概念应该会比较熟悉。不过 XML 映射文件已经有了很多的改进,随着文档 的进行会愈发清晰。这里给出一个基于 XML 映射语句的示例,它应该可以满足上述示例中 SqlSession 的调用。
提示 命名空间的一点注释
ቤተ መጻሕፍቲ ባይዱ
命名空间(Namespaces)在之前版本的 MyBatis 中是可选的,容易引起混淆因此是没有益处的。现在的命名空 间则是必须的,目的是希望能比只是简单的使用更长的完全限定名来更进一步区分语句。 命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定以防哪 天你改变了主意。出于长远考虑,使用命名空间,并将它置于合适的 Java 包命名空间之下,你将拥有一份更加整 洁的代码并提高了 MyBatis 的可用性。 命名解析:为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名 解析规则。 完全限定名(比如“com.mypackage.MyMapper.selectAllThings”)将被直接查找并且找到即用。 短名称(比如“selectAllThings”)如果全局唯一也可以作为一个单独的引用。如果不唯一,有两个或两个以上的相 同名称(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”),那么使用时就会收到错误报告说短名称 是不唯一的,这种情况下就必须使用完全限定名。
iBatis详细使用手册(.net版)
目录系列(1) 总览 (2)系列(2) 配置运行环境和日志处理 (4)系列(3) 映射文件基础 (11)系列(4) iBatisNet API基础 (14)系列(5) ParameterMap (19)系列(6) ResultMap (23)系列(1) 总览学习和使用Ibatisnet已经有一段时间了,前段时间也有写过一些与iBatis相关的Blog。
也答应过一些朋友要比较全面地介绍一下iBatis,分享自己的学习过程和使用经验,记录一些常见且容易出现的问题。
但由于前段时间一直在准备考试,而且当前的项目时间进度也比较紧,所以一直迟迟未能开始,在这里表示歉意,希望现在开始不会晚。
不过最近社区(博客园)好消息不断,我发现越来越多的人开始关注iBatis了,并且也有热心网友在极力推广,如果您已经对它已经有一些了解了,那么更推荐您去阅读ShanYou的文章,他写的文章可能更加适合您。
我本人也是一名初学者,这里记录的一些东西可能不会有很多的理论知识(理论知识还不够扎实),更多的可能是突出自己学习过程中需要很长时间来解决的一些问题,或者是个人认为特别重要,并且容易忘记的细节。
水平有限,出现错误在所难免,如在这过程中不当之处敬请愿谅,并请不啬赐教。
废话一翻后,进入今天的正题。
今天的主题是Introduction,非官方正式介绍的中文版,更多详细的介绍请参阅官方文档。
我们要使用它就必须要知道它是干什么用的,能为我们做哪些工作,开发效率如何,执行效率如何,技术难度怎么样。
提到iBatis,大家可能会与ORM技术联系起来。
是的,没错,它与ORM技术有一定程度上的联系,但是更确切地讲,它并不是一种很正统的ORM解决方案。
因为它不像NHi bernate那样,具备全自动的数据操作,包括查询,插入,更新,删除;也没有像它那样,与数据库的约束关系有紧密的联系(对NHibernate的了解不多,如果有不妥之处,希望能留下你们的臭鸡蛋,等着下回用)。
ibatis 开发指南
IBATIS Developer’s Guide Version 1.0OpenDoc Series’iBATIS 2.0开发指南V1.0作者:夏昕xiaxin(at) So many open source projects. Why not Open your Doc uments? J参与人员:作者联络夏昕xiaxin(at)(at) 为email @ 符号发布记录版本日期作者说明0.0 2004.8.1 夏昕第一版1.0 2004.9.1 夏昕补充ibatis in Spring部分OpenDoc版权说明本文档版权归原作者所有。
在免费、且无任何附加条件的前提下,可在网络媒体中自由传播。
如需部分或者全文引用,请事先征求作者意见。
如果本文对您有些许帮助,表达谢意的最好方式,是将您发现的问题和文档改进意见及时反馈给作者。
当然,倘若有时间和能力,能为技术群体无偿贡献自己的所学为最好的回馈。
另外,笔者近来试图就日本、印度的软件开发模式进行一些调研。
如果诸位可以赠阅日本、印度软件研发过程中的需求、设计文档以供研究,感激不尽!ibatis Quick Start (5)准备工作 (5)构建ibatis基础代码 (5)ibatis配置 (11)ibatis基础语义 (16)XmlSqlMapClientBuilder (16)SqlMapClient (16)SqlMapClient基本操作示例 (16)OR映射 (19)ibatis高级特性 (26)数据关联 (26)一对多关联 (26)一对一关联 (28)延迟加载 (30)动态映射 (31)事务管理 (35)基于JDBC的事务管理机制 (35)基于JTA的事务管理机制 (36)外部事务管理 (38)Cache (39)MEMORY类型Cache与WeakReference (40)LRU型Cache (42)FIFO型Cache (43)OSCache (43)相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis是一种“半自动化”的ORM实现。
ibatis配置文件、映射文件详解
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上的缓存机制。
Struts+Spring+Ibatis整合框架搭建配置文档
Struts + Spring +ibatis 整合开发步骤:框架配置-ActionContextCleanUp<!—过滤器,struts2用于销毁某些不再使用的对象等!--》<filter><filter-name>struts-cleanup</filter-name><filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class></filter><!-- 要保证在struts2核心过滤器映射之前配置这一项--> <filter-mapping><filter-name>struts-cleanup</filter-name><url-pattern>/*</url-pattern></filter-mapping>框架配置-FilterDispatcher<!-- 配置Struts 2框架的核心Filter --><filter><!-- 配置Struts 2核心Filter的名字--><filter-name>struts</filter-name><!-- 配置Struts 2核心Filter的实现类--><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><!-- 配置Filter拦截的URL --> <filter-mapping><!-- 配置Struts 2的核心FilterDispatcher拦截所有用户请求--> <filter-name>struts</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 向监听器类中传递初始化参数,以获取beanFactory对象--> <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 使用监听器初始化Spring的beanFactory,并将其放入到Context中,在使用时将其取出,以获取IOC容器中的bean --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>框架配置-Ibatis<!--===IBATIS属性配置===--><bean id="SqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="classpath:sqlMapConfig.xml"/> <property name="dataSource" ref="DataSource"/></bean>一.添加Spring 、Struts框架对web.xml文件的修改1.添加Spring框架2.在web.xml中引入Spring配置文件(注意:applicationContext.xml文件的路径)<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/conf/applicationContext.xml</param-value></context-param><servlet><servlet-name>context</servlet-name><servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>3.添加Struts框架4.在web.xml中引入Spring配置文件(注意:struts-config.xml文件的路径)<servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/conf/struts-config.xml</param-value></init-param><init-param><param-name>debug</param-name><param-value>3</param-value></init-param><init-param><param-name>detail</param-name><param-value>3</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>5.web.xml自动添加的*.jsp文件起始路径(注意:jsp文件的访问路径)<welcome-file-list><welcome-file>/WEB-INF/jsp/emp.jsp</welcome-file></welcome-file-list>二、对Spring配置文件applicationContext.xml文件的修改1.配置JDBC数据源驱动文件jdbc.properties(服务器、端口、账户、密码因具体情况而定)MySql:jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testername=rootjdbc.password=adminOracle:jdbc.driver=oracle.jdbc.driver.OracleDriverjdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orclername=scottjdbc.password=tigerMS Sql Server:jdbc.driver=com.microsoft.jdbc.sqlserver.SQLServerDriverjdbc.url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mssqlername=sajdbc.password=sa2.将JDBC驱动源文件部署到ApplicationContext.xml配置文件中<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"><list><value>/WEB-INF/conf/jdbc.properties</value></list></property></bean>3.将Data Source配置到ApplicationContext文件中<bean id="dataSource" class="mons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName"><value>${jdbc.driver}</value></property><property name="url"><value>${jdbc.url}</value></property><property name="username"><value>${ername}</value></property><property name="password"><value>${jdbc.password}</value></property><property name="minIdle"><value>1</value></property><property name="maxActive"><value>25</value></property><property name="maxIdle"><value>5</value></property></bean>4.在Spring配置中注入3中的datasource数据源<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"><ref local="dataSource"/></property></bean>5.引入具体的sql语句配置文件(注意:sqlMapConfig.xml文件的路径)<bean id="sqlMapClient"c lass="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation"><value>/WEB-INF/conf/sqlMapConfig.xml</value></property><property name="dataSource"><ref local="dataSource"/></property></bean>6.注入操作数据库的dao(empDao是举例)<bean id="empDao" class="com.web.ssi.emp.dao.EmpDaoImpl"><property name="sqlMapClient"><ref local="sqlMapClient"/></property></bean>三.对Struts配置文件struts-config.xml文件的修改1.填写form-bean<form-beans><form-bean name="empForm" type="com.web.ssi.emp.form.EmpForm"/></form-beans>2.填写action-mapping<action-mappings><actionname="empForm"path="/queryEmp"type="org.springframework.web.struts.DelegatingActionProxy"scope="request" ><forward name="queryEmp" path="/jsp/emp.jsp"/></action></action-mappings>3.填写message-resource 和plug-in(注意:action-servlet.xml文件路径)<message-resources parameter="com.web.ssi.ApplicationResources"/><plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-propertyproperty="contextConfigLocation"value="/conf/applicationContext.xml" /> </plug-in>4.Spring与Struts相对用的配置applicationContext.xml<beans><bean name="/queryEmp" class="com.web.ssi.emp.action.EmpAction" singleton="false"> <property name="empService"><ref bean="empService" /></property></bean></beans>附一:配置文件示意图如下附二:包结构建这么一个工程是我做毕业设计的前奏,我打算用myeclipse把毕业设计做一下。
ibatis配置文件详解
iBatis 配置文件详解一:ibatis基础代码包括:1. ibatis实例配置一个典型的配置文件如下(具体配置项目的含义见后):<? xml version="1.0" encoding="UTF-8" ?><! DOCTYPE sqlMapConfigPUBLIC "-////DTD SQL Map Config 2.0/"/dtd/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教程中文版
iBatis教程中文版1.显示数据库所有数据iBatis是个像Hibernate, JDO,EJB一类的数据持久框架,它能将对象映射为SQL 语句.它是个轻量级的框架并且持久性API适合持久化POJO.iBatis也与Hibernate, JDO不同,因为它使用存储过程和现有的SQL来处理数据库.本节我们将向你讲述如何配置iBatis来运行一个小型程序.既然一次性将所有知识全部解释很难,我们索性把本教程分为几个单独的例子来陈述.该例是关于如何从数据库读取数据并将结果显示在你的命令提示符上.在第二个例子中你将学习如何添加更多的数据到数据库中,在此之后的第三个例子将会向你展示如何通过iBatis从记录中删除数据.现在的第一个例子将会向你展示如何从数据库中读取记录,我们需要一个数据库来执行查询,所以我们使用MySQL5.0作为这个例子的数据库.这里我们将要检索一些人的contact的信息, contact的表结构给出如下 :根据Contact表我们需要创建一个POJO类,在我们的例子中,数据库vin有一个表Contact,包括四个字段 :idfirstNamelastNameemailContact.java为了映射配置我们需要创建SqlMapConfig.xml来指定如下信息 : ?针对映射语句的命名空间前缀我们的数据库将使用JDBC来进行访问针对MySQL的JDBC驱动为" com.mysql.jdbc.Driver"连接URL为"jdbc:mysql://192.168.10.112:3306/vin"用户名与密码分别为"root"和"root"我们的SQL语句描述在"Contact.xml"SqlMapConfig.xml映射文件在下面给出,它主要负责为我们的程序执行SQL查询. Contact.xml的代码如下 :现在为了显示数据库中的数据我们需要创建一个类----IbatisExample,它从SqlMapConfig.xml中读取配置并在你的控制台输出所有数据. IbatisExample.java的代码如下 :为了运行该例,你需要遵循如下步骤 :在你的MySQL数据库中创建表Contact下载iBatis的JAR文件(ibatis-common-2.jar,ibatis-dao-2.jar,ib atis-sqlmap-2.jar),并将其放置在你的lib目录中设置类路径创建Contact.java将其编译创建Contact.java创建SqlMapConfig.xml创建IbatisExample.java并将其编译执行IbatisExample文件输出 :你的命令提示符应该有像这样的输出 :2.向数据库插入数据iBatis最棒的特点就是它的简洁,这也是唯一令它在任何数据库程序中更容易使用的原因.iBatis使得通过Java或者任何其它的Microsoft的程序来使用数据库变得非常简单.本章我们将会通过一个例子向你介绍如何向数据库插入一行数据.我们使用MySQL作为本例的数据库,和我们上一章中使用的是一样的.这是"Contact"表和我们上一章使用过的两个文件:"Contact.java"和"SqlMapC onfig.xml"Contact.javaSqlMapConfig.xml我们使用标签来映射SQL语句,在该标签中我们定义了一个"id",它将上面的代码意味着表中被插入数据的下一行. Contact.xml如何执行本例 :1.创建Contact.java并将其编译2.创建Contact.xml和SqlMapConfig.xml3.创建IbatisInsertion.java4.执行IbatisInsertion类文件,结果将在你的命令提示符上输出如下 : "Record Inserted Successfully"输出 :3.iBatis删除操作教程我希望通过上面的例子,你能完全懂得如何向数据库执行插入或者查询操作.所以在本例中你将学习到如何通过iBatis在数据库中删除数据.所以你需要分析代码并清楚的理解在这些代码里到底发生了什么.然而你绝对不需要再创建一个不同的数据库,虽然你知道我们使用上一个MySQL作为数据库而且你已经知道了我们的表名是Contact.但你可以选择是使用这个数据库还是再创建一个,这都由你决定!你唯一需要确定的就是你定义的表名是正确的,否则将会产生Bug.如果你从本iBatis教程的开始学下来的,那么你是不需要修改代码的.仅仅将给定的代码拷贝到文件夹并执行,最终删除数据库表中的数据.正如我之前提到的,在iBatis的本章,我们将要从Ctract表中删除记录,我们使用MySQL的数据库"vin"我们的Contact.java和SqlMapConfig.xm与上一个例子中的是一样的. Contact.java上面几行代码删除了Contract表中的所有记录,这里定义的id"deleteAll"会在以后在IbatisDeletion类中执行数据库的查询操作.Contact.xml我们需要引入下面的包 :mon.resourcescom.ibatis.sqlmap.client上面的代码能从"SqlMapConfig.xml"中读取配置信息, IbatisDeletion.java的代码如下 :IbatisDeletion.java按照如下步骤执行本例 :创建Contact.xml和SqlMapConfig.xml创建Contract.java并将其编译创建IbatisDeletion.java并将其编译执行IbatisDeletion你将会在你的命令提示符中得到如下输出 :4.更新表中的数据对任何数据库程序来说,添加,更新,删除都是十分常见且必要的特性.在该教程里我们已经讲解了使用iBatis在Java中进行插入和删除操作,现在本章将讲述如何使用iBatis在数据表中更新数据.在iBatis中执行一条更新语句是非常简单的.为了更新数据你得在SQL映射文件"Contact.xml"中添加SQL的update 语句.iBatis更新语句例子 :Contact.javaSqlMapConfig.xmliBatis更新查询在我们的例子中,我们通过参数中指定的id更新了表中的数据,因此对于"id"我们将"parameterClass"的属性值分配为"long".Contact.xml现在我们可以在Java程序中通过如下代码执行更新操作了 : sqlMap.update("Contact.updateById",contactId);IbatisUpdate.java代码如下 :为了执行update的例子,遵照如下步骤: 创建Contact.java和SqlMapConfig.xml 编译Contact.java创建Contact.xml创建IbatisUpdate.java并将其编译执行IbatisUpdate类文件,你会得到如下输出 :5.iBatis ResultMap例子如果你使用iBatis的Result Map来工作,那么你一定知道iBatis 的Result Map 是用来提供数据库查询结果和它的对象属性之间的映射的,这是iBatis最常见且重要的特性了.本章仅是一个ResultMap的简单介绍.我们的Contact.java and SqlMapConfig.xml文件和我们的上一个例子是一样的,没有任何变化. Contact POJO的代码如下 : Contact.java。
Ibatis开发实例
Spring宠物店非常典型的展现了Spring和IBatis的整合,下文将围绕宠物店展开介绍。
首先来看宠物店中的一个领域对象(它是一个标准的JavaBean)和它的映射文件,如代码10.13~10.14所示。
代码10.13 Product.javapublic class Product implements Serializable {private String productId;private String categoryId;private String name;private String description;省略getter/setter...}代码10.14 Product.xml<sqlMap namespace="Product">...<resultMap id="result"class="org.springframework.samples.jpetstore.domain.Product "><result property="productId" column="productid" columnIndex="1"/>...</resultMap><select id="getProduct" resultMap="result">select productid, name, descn, category from product where productid = #value#</select><select id="getProductListByCategory" resultMap="result">select productid, name, descn, category from product where category = #value#</select>...</sqlMap>10.3.2 衔接IBatis配置和DAO实现接着给出IBatis的基本配置文件,如代码10.15所示。
Ibatis讲义
iBatis基础回顾1.什么是iBatis,这个技术主要在项目中充当什么作用?是Java半自动化持久层框架,主要负责完成数据库的增删改查操作,可以在一定程度上简化JDBC的代码量它是在JDBC基础上进行封装的一个框架,会自动化完成数据和对象之间的映射(ORM)2.如何理解半自动化?它有什么优点及缺点?所谓半自动化,主要的表现为访问数据库的SQL语句必须由程序员自己编写这种方式在一定程度上增加了代码量,同时不利于代码的数据库移植但是相当于全自动化持久层框架,在访问数据库的代码上,更加灵活,程序员可以方便的完成数据库脚本的优化DTO:数据传输对象 Data Transfer ObjectIbatis其实也是四类驱动直连的方式访问数据库3.iBatis框架的开发步骤是什么?第一步:设计数据库和数据表第二步:将ibatis需要的jar包和数据库驱动jar包复制到项目的lib目录下第三步:在src目录下创建主配置文件第四步:创建实体类和映射文件第五步:编写数据库访问代码4.iBatis的主配置文件中主要包含哪些信息?主要内容为访问数据库的基本属性(驱动类、连接串、用户名、访问密码)关联映射文件指定名称空间、关联属性文件(可选)5.映射文件中主要包含哪些信息?主要内容为访问数据库的操作节点(insert update delete select)定义指定类的别名typeAlias (可选)定义结果映射resultMap (可选)6.什么时候需要定义resultMap元素,该元素主要负责完成什么操作?当属性名和数据表上的字段名不相同时,iBatis就无法完成数据的自动映射此时就必须通过定义resultMap来完成手工映射该元素主要负责指定属性和字段间的对应关系<resultMap id="" class=""><result property="" column=""/>.....</resultMap>7.如果属性名和字段名不相同,能否不使用resultMap元素完成映射?字段:id name age address属性:id personName,age,personAddress<select id="findAll" resultClass="p">select id,name as personName,age,address as personAddress from person</select>8.如何解决多个映射文件中节点重名问题?使用iBatis提供的名称空间功能第一步:在主配置文件中增加<settings useStatementNamespace="true"/>第二步:在映射文件的根元素上增加属性<sqlMap namespace="别名">第三步:在调用指定节点中的语句时,指定别名:别名.节点名9.如何在插入记录时即获得插入的编号?<insert id="" parameterClass="">insert into .....<selectKey resultClass="int">SELECT LAST_INSERT_ID() //MySQLSELECT @@identity //SQLServer 2000 || 2005</selectKey></insert>10.如何在进行查询时,传递多个参数?使用Map作为参数类型传递,在语句中赋加数值时,应指定map对象中保存的key------------------------------------------------------------------------------------------------------------------------------------------iBatis高级操作1.如何理解DTD文件DTD: Document Type Definition 文档类型定义该文件负责规范XML文档的结构,当XML文档引入一个dtd文件后,那么该文档就必须按照这个dtd的规定去定义否则解析时会报错2.对XML文档的解析分为几个步骤?XML文档解析一般会分为两个步骤第一:首先判断是否为一个良格式文档文档必要有且只有一个根元素、元素和属性的大小写区分、每个开始元素都必须有一个对应的结尾元素第二:有效性验证指该文档是否符合其引用的DTD定义注意:在映射文件中,操作数据库的节点一般不使用存储过程,因为存储过程是和数据库进行绑定的,移植性不好(尽管存储过程是预编译的,执行效率比较高)<!ELEMENT sqlMapConfig (properties?, settings?, resultObjectFactory?, typeAlias*, typeHandler*, transactionManager?, sqlMap+)+>以上代码的含义:!ELEMENT代表声明了一个元素,元素名为sqlMapConfig(元素,元素,....)代表这个父元素所能拥有的子元素,而且定义的子元素必须按照这里的声明顺序出现,顺序颠倒也视为无效文档(这些元素之间若使用逗号隔开,则顺序固定,若使用| 隔开,则顺序不固定 )元素名后面所跟的符号含义:?代表该元素可以在父元素下出现0次或1次*代表该元素可以在父元素下出现0次或多次+该元素可以在父元素下出现1次或多次无符号则代表该元素必须且只能出现一次<!ATTLIST sqlMapConfigxmlns:fo CDATA #IMPLIED>ATTLITS:attribute list(属性列表)<!ATTLIST sqlMapConfig 代表为sqlMapConfig元素定义属性xmlns:fo CDATA #IMPLIED 可以包含一个名称为xmlns:fo的属性CDATA:属性值为字符串类型#IMPLIED:该属性在文档中可以不出现,即非必选属性<!ELEMENT settings EMPTY> //代表settings元素为空元素,是自闭合的<!ATTLIST settingsclassInfoCacheEnabled (true | false) #IMPLIEDlazyLoadingEnabled (true | false) #IMPLIEDstatementCachingEnabled (true | false) #IMPLIEDcacheModelsEnabled (true | false) #IMPLIEDenhancementEnabled (true | false) #IMPLIEDerrorTracingEnabled (true | false) #IMPLIEDuseStatementNamespaces (true | false) #IMPLIEDmaxSessions CDATA #IMPLIEDmaxTransactions CDATA #IMPLIEDmaxRequests CDATA #IMPLIEDdefaultStatementTimeout CDATA #IMPLIED>classInfoCacheEnabled (true | false) #IMPLIED该属性的取值只能是true或false,而且是可选的<!ATTLIST transactionManagertype CDATA #REQUIREDcommitRequired (true | false) #IMPLIED>transactionManager的type属性即为必选属性3.为什么需要使用ibatis缓存?目的是为了优化数据库查询效率当对数据库频繁的进行相同或相似的查询操作时,且数据库记录不会发生改变这个时候可以将查询到数据暂时缓冲到内存中,当再次需要检索这些数据的时候可以直接从内存中获得,因此避免了连接对象的频繁创建以及访问数据库时的网络开销4.缓存可能带来的问题?第一:内存溢出问题因为内存的容量要远远小于硬盘的存储空间,因此如果将硬盘上的所有记录加载到内存肯定是无法保存的可以设定缓存的大小,当数据加载满了以后,可以将暂时不被使用的记录对象转移到硬盘那么该JavaBean对象必须拥有序列化的功能,即必须实现序列化接口第二:脏数据读取到了无效数据,或者是和数据库不一致的数据第一次读取:将数据纳入到缓存其他用户(线程)对数据库进行了增删改操作第二次读取:从缓存中获得记录,将出现脏数据现象解决办法:当对数据库进行了增删改类型的操作后,应该立即清空缓存,防止脏数据情况出现只要使用缓存,就应该能够容忍脏数据的出现5.使用iBatis缓存的步骤第一步:在主配置文件的settings元素中指定要使用缓存<settings cacheModelsEnabled="true"/> 不过该属性默认值就是true 第二步:在映射文件中配置缓存节点第三步:在select节点上定义cacheModel属性,指定使用缓存时间戳:从1970年1月1日凌晨0点0分0秒到现在的毫秒数因为在内存中,iBatis是使用Map结构来完成缓存的保存的Map中的key就是访问数据库时的SQL语句public class CacheDemo{private static Map map=new HashMap();public Object get(String sql,Object condition){if(map.containsKey(sql)){return map.get(sql);}else{//访问数据库,获得记录集合,保存到map中map.put(sql,list);}}}6.对象关系一对一中国公民<-->身份证一对多国家<-->城市多对一反之即多对一多对多老师<-->同学职员<-->项目一对多或多对一关系在数据表上是如何表现的?外键引用哪个表应该包含外键?子表通过外键参照主表,即多方表,为了防止数据冗余在设计的JavaBean上应该如何表现以上的关系一方对象上拥有多方对象的集合引用多方对象上拥有一方对象的唯一引用如果彼此都有对方的引用,就称为双向关联如果仅仅是单向引用,则成为单向关联延迟加载:当需要访问数据库时才发送SQL语句,否则不执行默认情况下,iBatis针对一对多关联查询会开启延迟加载策略默认情况下,iBatis针对多对一关联查询不会开启延迟加载策略7.Ibatis一对多,返回结果为resultMap可以取出多,为resultClass时取不出多原因:resultMap映射时,指定了主从表的关联关系:<result column="ID" property="news" select="tablenewsandkind.getNewsByKindId" /> 所以iBATIS知道怎么取出newsKind对应的newsresultClass映射时,你没有指定主从表的关联关系,自然iBATIS无从知道怎么取出newsKind对应的news。
ibatis 最新最全的开发文档
public void setSex(Integer sex) {
this.sex = sex;
}
}
3.映射文件
与Hibernate不同。因为需要人工编写SQL代码,ibatis的映射文件一般采
用手动编写(通过Copy/Paste,手工编写映射文件也并没想象中的麻烦)。
针对上面POJO的映射代码如下:
这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”
ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及SQL的自动
生成和执行。而ibatis的着力点,则在于POJO与SQL之间的映射关系。也就是说,ibatis
并不会为程序员在运行期自动生成SQL执行。具体的SQL需要程序员编写,然后通过映
行。
大多数情况下(特别是对新项目,新系统的开发而言)
,这样的机制无往不利,大有一
统天下的势头。但是,在一些特定的环境下,这种一站式的解决方案却未必灵光。
在笔者的系统咨询工作过程中,常常遇到以下情况:
1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几
条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
ACCOUNT"/>
<property name="Pool.PingEnabled" ="false"/>
<property name=
value="1"/>
<property name=
value="1"/>
</dataSource>
iBATIS教程
2.2 XML配置--SqlMap
查询
Select
火龙果整理
2.2 XML配置--SqlMap
procedure
用{call proc_name()}来调用数据库中的存储过程
火龙果整理
2.2 XML配置--SqlMap
statement
<statement>标签是个通用标签.可以写任何SQL语句,上述为实现查询的SQL
火龙果整理
2.2 XML配置--SqlMap
insert
SqlMap的操作都有三种写法.现在就以插入说明 <insert>标签中parameterMap为上面所定义的输入值映射 <selectKey keyProperty=“pid” resultClass=“int”>获取自动增长的主键 keyProperty中必须为parameterMap中所定义过映射的字段,resultClass是说明获 取主键后返回的是那种类型的变量 利用设置parameterMap属性后.在SQL语句中就可以用’?’来代替插入的值了.特别要 注意的一点..’?’是有顺序的.所以在上面定义的parameterMap中的顺序要与输 入值的顺序相同.这样我觉得就带来了不便.所以比较喜欢第2种方法
2.2 XML配置--SqlMap
条件查询2
动态添加关键字WHERE
判断per.pname字段是否为空.添 加关键字AND.并添加条件SQL
判断sscore字段是否大于0.添加关键 字AND.并添加条件SQL,compareValue. 是判断大于的数值
火龙果整理
2.3
2.实际操作
火龙果整理
2.2 XML配置--SqlMap
ibatis开发步骤
和spring spring和和sturts2sturts2集成使用集成使用集成使用orcle orcle orcle数据库数据库数据库1写一个db-config.propertis 的数据连接配置文件的数据连接配置文件basedb.url=basedb.url=jdbc jdbc :oracle:thin:@10.10.65.114:1521:ppbid basedb.driver=basedb.driver=oracle.jdbc.driver.OracleDriver oracle.jdbc.driver.OracleDriverername=ername=ppbid ppbidbasedb.password=basedb.password=a123456 a1234562.创建一个sqlmap-base.xml 的配置文件cacheModelsEnabled :启用或者禁用sqlMapClient 所以的缓存,默认为启用enhancementEnabled :启用或者启用运行是字节码增强,以优化java bean 属性的性能,同时优化延迟加载的性能,默认为falselazyLoadingEnabled lazyLoadingEnabled::启用或者禁用sqlMapClient 的延迟加载,默认为trueerrorTracingEnabled errorTracingEnabled:: 是否启动错误日志,在开发期间建议设为"true"以方便调试 maxSessions maxSessions::同一时间内活动的最多session ,它总是大于或者等于maxTransactions 并小于maxRequests 。
减少这个参数通常能减少内存的使用。
默认值为:64maxRequests :同时支行sql 语句的最大线程数,大于这个值,线程将阻塞,,通常这个值是maxTranaction 的10倍,并且总是大于maxSession 和maxTranaction,减少这个值通常能提高性能,默认值为512.maxTransactions :同时支行sqlMapClinet.startSqlMapClinet 语句的最大线程数,大于这个值,线程将阻塞.总是大于或者等于maxSession 总是远小于maxRequest. 减少这个参数通常能减少内存的使用。
IbatisAPI使用文档
I b a t i s2.3A P I使用文档拟制:魏铁胜审核:_______________批准:_______________联创科技(南京)有限公司二零零九年八月一.配置1.第一步配置sqlMap配置文件与sqlMap XML文件,配置文件的简单样例如下:SqlMapConfig.xml(sqlMap配置文件)<?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="oracle.jdbc.driver.OracleDriver"/><property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:ora1"/><property name="ername" value="scott"/><property name="JDBC.Password" value="tiger"/></dataSource></transactionManager><!- 这里写出所有的sqlMap XML文件-><sqlMap resource="cn/david/domain/ Person.xml"/></sqlMapConfig>Person.xml(sqlMapXML文件)<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMapPUBLIC "-////DTD SQL Map 2.0//EN""/dtd/sql-map-2.dtd"><sqlMap namespace="Person"><typeAlias alias="Person" type="cn.david.domain.Person"/><resultMap id="PersonResult" class="Person"><result property="id" column="P_ID"/><result property="name" column="P_NAME"/><result property="email" column="P_EMAIL"/><result property="birthday" column="P_BIRTHDAY"/></resultMap><insert id="insertBySequence" parameterClass="Person"><selectKey keyProperty="id" resultClass="int">select PERSON_SEQ.nextVal as id from dual</selectKey>insert into Person values(#id#,#name#,#email#,#birthday#)</insert>……</sqlMap>说明: typeAlias定义了别名,以后引用中就不用写上类的全限类名, resultMap将Domain Object类与表进行了对应的映射,以后的查询结果就可以引用这个resultMap.Person类是个简单的JavaBean只有id,name,email,birthday几个属性.这个文件中只列出了一种sql insert statement,其他的statement将在例子中给出.,这些文件配置好以后就可以创建SqlMapClient实例,调用它提供的增删改查的方法.2.构建SqlMapClient实例代码如下:Reader reader= Resources.getResourceAsReader("cn/david/test/SqlMapConfig.xml"); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);reader.close();二.用SqlMapClient执行SQL语句SqlMapClient类提供了执行所有mapped statement的API,下文配合相关代码介绍它所有API的使用.1.插入方法Object insert(String id, Object parameterObject) throws SQLException;根据在sqlMapXML文件中mapped statement名称作为第一个参数, 第二个参数是参数对象.向数据库插入数据,返回的Object为主键. 插入动作时用的是sqlMapXML文件中的sql insert statement,sqlMapXML文件中的insert片断如下: <insert id="insertBySequence" parameterClass="Person"><selectKey keyProperty="id" resultClass="int">select PERSON_SEQ.nextVal as id from dual</selectKey>insert into Person values(#id#,#name#,#email#,#birthday#)</insert>说明: Person表的主键生成方式是通过selectKey使用sequence. parameterClass="Person"这里引用了定义的别名,没有写类的全限类名.程序代码: (IbatisCommon类提供了构建SqlMapClient实例的方法getClient) SqlMapClient sqlMap = IbatisCommon.getClient();Person person = new Person();person.setName(“david”);person.setEmail(“xx@”);person.setBirthday(new Date());sqlMap.insert("insertBySequence", person);2.插入方法,只需mapped statement名称一个参数Object insert(String id) throws SQLException;这个方法同Object insert(String id, Object parameterObject)使用一样,只是不需要参数对象.3.更新方法int update(String id, Object parameterObject) throws SQLException;参数id为mapped statement名称, 第二个参数是参数对象.进行更新操作,返回的是受影响的行数. 更新动作时用的是sqlMapXML文件中的sql update statement,sqlMapXML文件中的update片断如下:<update id="updateById" parameterClass="Person">update Person set P_NAME=#name#,P_EMAIL=#email#,P_BIRTHDAY=#birthday#where P_ID=#id#</update>程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();Person person = person = new Person();person.setId(1);person.setName(“robin”);person.setEmail(“robin@”);person.setBirthday(new Date());sqlMap.update("updateById", person);4.更新方法,只需mapped statement名称一个参数int update(String id) throws SQLException;这个方法同update(String id, Object parameterObject)使用一样,只是不需要参数对象. sqlMapXML文件中的update片断如下:<statement id="dropTable">DROP TABLE PERSON</statement>程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();sqlMap.update("dropTable");5.删除方法int delete(String id, Object parameterObject) throws SQLException;删除操作,参数同上,返回受影响的行数. 删除动作时用的是sqlMapXML文件中的sql delete statement,sqlMapXML文件中的delete片断如下:<delete id="deleteByName" parameterClass="ng.String">delete from Person where P_NAME=#name#</delete>程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();sqlMap.delete("deleteByName",”david”);6.删除方法,只需mapped statement名称一个参数int delete(String id) throws SQLException;这个方法同delete(String id, Object parameterObject)使用一样,只是不需要参数对象. sqlMapXML文件中的delete片断如下:<delete id="deleteAll">delete from Person</delete>程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();sqlMap.delete("deleteAll ");7.查询方法,返回的是OjbectObject queryForObject(String id, Object parameterObject) throws SQLException;参数id为mapped statement名称, 第二个参数是参数对象,返回查询得到的新对象.查询动作时用的是sqlMapXML文件中的sql select statement,sqlMapXML文件中的select片断如下:<select id="selectPersonById" resultMap="PersonResult" parameterClass="int"> select * from Person a where a.P_ID=#id#</select>程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();Person person = (Person)sqlMap.queryForObject("selectPersonById", 2);8.查询方法,返回的是OjbectObject queryForObject(String id, Object parameterObject, Object resultObject) throws SQLException;这个方法和上一个方法的唯一区别是通过查询出的对象的值赋给了第三个参数.程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();Person person = new Person();sqlMap.queryForObject("selectPersonById", 2,person);最终查询到对象赋值给了参数person.9.查询方法,返回的是ListList queryForList(String id) throws SQLException;执行一个查询并返回所有的查询结果,返回的是List. 查询动作时用的是sqlMapXML文件中的sql select statement,sqlMapXML文件中的select片断如下: <select id="selectAll" resultMap="PersonResult">select * from Person</select>程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();List list = sqlMap.queryForList("selectAll");10.查询方法,返回的是ListList queryForList(String id, Object parameterObject) throws SQLException;这个方法是根据mapped statement名称和参数对象查询返回List,用法与上一个方法相同.11.查询方法,返回的是List,可以控制返回的结果集List queryForList(String id, Object parameterObject, int skip, int max) throws SQLException;List queryForList(String id, int skip, int max) throws SQLException;这两个方法的后两个参数允许指定跳过结果的数目和返回结果的最大数目.对于查询一个数量很大的结果集,并且不想返回所有的数据时很有用. sqlMapXML文件中的定义片断与其他的查询的一样,程序代码如下:SqlMapClient sqlMap = IbatisCommon.getClient();List list = sqlMap.queryForList("selectByName", name, 3, 5);执行一次查询,返回的结果跳过3行,最终返回的是5行.12.查询方法,可以对返回的每结果行进一步进行处理void queryWithRowHandler(String id, RowHandler rowHandler) throws SQLException;void queryWithRowHandler(String id, Object parameterObject, RowHandler rowHandler) throws SQLException;这两个方法的用途是对查询的结果,可以针对每结果行进一步进行处理, sqlMapXML文件中的定义片断与其他的查询的一样,程序代码有些不同,首先定义一个类实现了RowHandler接口:public class PersonXmlRowHandler implements RowHandler {private StringBuffer xmlDocument = new StringBuffer("<PersonList>");private String returnValue = null;public void handleRow(Object valueObject) {Person person = (Person) valueObject;xmlDocument.append("<name>");xmlDocument.append(person.getName());xmlDocument.append("</name>");}public String getPersonListXml() {if (null == returnValue) {xmlDocument.append("</PersonList >");returnValue = xmlDocument.toString();}return returnValue;}}SqlMapClient sqlMap = IbatisCommon.getClient();PersonXmlRowHandler rh = new PersonXmlRowHandler ();sqlMap.queryWithRowHandler("selectAll",rh);String xmlData = rh.getPersonListXml ();说明:用mapped statement名称为”selectAll”进行查询,最后对查询到的结果封装成自定义的XML字符串.13.查询方法,返回的结果可以进行分页显示PaginatedList queryForPaginatedList(String id, Object parameterObject, int pageSize) throws SQLException;PaginatedList queryForPaginatedList(String id, int pageSize) throws SQLException;这两个方法由于性能原因已不推荐使用.14.查询方法,返回的对象是MapMap queryForMap(String id, Object parameterObject, String keyProp) throws SQLException;将查询到的结果集放在一个Map对象中,这个Map对象用一个传入参数keyProperty作为key值,value值为查询返回的对象,sqlMapXML文件中的片断与其他的查询的一样,程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();Map map = sqlMap.queryForMap("selectPersonById",8, "name");Person p = (Person)map.get("wei7");说明:查询到的结果被保存到Map中,用Person类的name属性作为key,通过name 属性就可以获得查询到的每一个Person对象.15.查询方法,返回的对象是Map,可以指定Map的valueMap queryForMap(String id, Object parameterObject, String keyProp, String valueProp) throws SQLException;此方法与上一个方法区别是将Map的value值指定为结果类中具体的某一个属性,程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();Map map = sqlMap.queryForMap("selectPersonById",8, "name",”email”);String email = (String)map.get("wei7");说明:查询到的结果被保存到Map中,用Person类的name属性作为key,value是Person类的email属性.16.批处理的方法void startBatch() throws SQLException;int executeBatch() throws SQLException;这两个方法在我们要执行很多非查询(如:insert/update/delete)的语句时推荐使用,将它们作为一个批处理来执行,以减少网络通讯流量,并让JDBC Driver进行优化.SQL Map API使用批处理很简单,可以使用两个简单的方法划分批处理的边界,程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();Person person = null;sqlMapClient.startBatch();for (int i=0;i<100;i++) {person = new Person();person.setName(“david” + i);person.setEmail(“xx@”);person.setBirthday(new Date());sqlMap.insert("insertBySequence", person);}sqlMapClient.executeBatch();三.用SqlMapClient执行其他操作1.如何调用数据库中的存储过程或函数首先在数据库在建立一个简单的存储过程testStr只有两个参数,参数类型为in out, sqlMapXML文件中的片断如下:<parameterMap id="procMap" class="java.util.Map"><parameter property="userId" javaType="int" jdbcType="INTEGER" mode="INOUT" /><parameter property="rtnStr" javaType="string" jdbcType="V ARCHAR" mode="INOUT" /></parameterMap><procedure id="callProc" parameterMap="procMap">{call testStr(?,?)}</procedure>程序代码:String rtnStr = "";HashMap map = new HashMap();map.put("userId", 1);map.put("rtnStr", rtnStr);IbatisCommon.getClient().queryForObject("callProc", map);System.out.println(map.get("rtnStr"));2.将查询结果转换成XMLsqlMapXML文件中的片断如下:<select id="selectValueXml" resultClass="xml" xmlResultName="person" parameterClass="int">select * from person where p_id = #value#</select>说明: 注意xmlResultName="person"这是XML内容中根节点显示的值.程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();String xmlData = (String) sqlMap.queryForObject("selectValueXml",new Integer(1));3.动态SQL的用法sqlMapXML文件中的片断如下:<select id="selectByDynSQL" parameterClass="Person" resultMap="PersonResult"> select * from person<dynamic prepend="where "><isNull property="email" prepend="and">p_email IS NULL</isNull><isNotNull property="name" prepend="and">p_name like '%$name$%'</isNotNull><isGreaterEqual property="id" compareValue="10" prepend="and"> p_id >= #id#</isGreaterEqual></dynamic></select>程序代码:SqlMapClient sqlMap = IbatisCommon.getClient();Person p = new Person();p.setId(10);p.setName("wei");List list = sqlMap.queryForList("selectByDynSQL", p)。
ibatis配置文档
<resultMap id="AccountResult" class="Account">
<result property="id" column="ACC_ID"/>
<result property="firstName" column="ACC_FIRST_NAME"/>
[xml] view plaincopyprint?
01.<insert id="insertAccount" parameterClass="Account">
02. <selectKey resultClass="long" keyProperty="sctId">
03. SELECT SEQ_TEST.NEXTVAL FROM DUAL
07. </isGreaterThan>
08. </dynamic>
<dynamic prepend="where">
<isNotEmpty prepend="and" property="$$$$$">
9、SQL中参数的引用
SQL中引用parameterClass的参数有三种方式:
iBatis内置支持的类型,比如int、string,使用#value#来引用,这个value是不是关键字,可变。
map类型的参数,使用#keyName#来引用,keyName为键名。
IBatis教程
IBatis教程iBATIS教程⼀.iBATIS官⽅⽹站:⽬前官⽅发布的.net部分组件:DataMapper1.6.1[MD5][PGP](Apache General Availability)DataAccess1.9.1[MD5][PGP](Apache General Availability)Source Revision513437[MD5][PGP]⼆.前⾔:iBATIS框架有助于帮助开发⼈员在利⽤Java或.NET进⾏应⽤程序开发时更好的使⽤数据库。
iBATIS DataMapper(数据映射)使⽤XML⽂件来存储数据库中的存储过程或者SQL语句,因此,可以说iBATIS DataMapper就是依赖于对象、XML、SQL。
在iBATIS DataMapper框架下,既可以使⽤SQL基本语句,也可以使⽤存储过程。
iBATIS框架的⽬标就是⽤20%的编码达到80%的数据访问功能。
三.iBATIS DataMapper Version1.6.0的改进(1)解决了带有group by的Select语句中N+1问题;(2)通过节点标识,增加了对SQL⽚段的⽀持(3)增加了对字典查询IDictionaryQueryForDictionary(...)的⽀持(4)允许存储过程⽆参数映射;(5)删除了⼏个不再使⽤的⽅法:Configure(XmlDocument document),Configure(),Configure(string resource),ConfigureAndWatch(ConfigureHandler configureDelegate),ConfigureAndWatch(string resource,ConfigureHandler configureDelegate)(6)允许通过扩展ISqlMapper+,允许使⽤⾃定义ISqlMapper;(7)允许⽤户⾃定义缓存;(8)原版本中的QueryForPaginatedList⽅法不再使⽤;四、iBATIS DataMapper⼯作流程说明:(1)参数提供——把⼀个对象或者⼀个基本类型作为参数,这些参数⽤于运⾏SQL语句或存储过程运⾏时的参数。
ibatis教程
SQLMAP API(3)
List queryForList(ng.String id); List queryForList(ng.String id, int skip, int max); List queryForList(ng.String id, ng.Object parameterObject); List queryForList(ng.String id, ng.Object parameterObject, int skip, int max);
二,sqlmapconfig.xml
它是使用iBATIS的起点,负责把所有的SQL 映射文件组合在一起.用于配置文件中告 诉iBATIS如何连接数据库,以及获取哪些 SQL映射文件.
sqlMapConfig标签
<properties>主配置文件之外提供一个名值对列如: <properties resource="db.properties" /> <settings> 添加各种属性如:延迟加载,使用限定名
SQLMAP API(4)
Object insert(String id, Object parameterObject); Object insert(String id); int update(String id, Object parameterObject) ; int update(String id) ; int delete(String id, Object parameterObject) ; int delete(String id);
四,事务处理
1.什么是事务 2.事务的特性ACID 原子性,一致性,隔离性,持久性 3.iBATIS独特的事务机制
myibatis详细步骤
<generatorConfiguration>
<classPathEntrylocation="mysql-connector-java-5.1.6-bin.jar"/>
<contextid="DB2Tables"targetRuntime="MyBatis3">
2、创建工程,引入jar包
3、运行generator自动生成的jar包
先创建config.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEgeneratorConfiguration
PUBLIC"-////DTD MyBatis Generator Configuration 1.0//EN"
publicvoidupdatevalue(intid, String username) {
SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession();
User user =newUser();
}
publicSqlSessionFactory getSqlSessionFactory() {
returnsqlSessionFactory;
}
}
6、编写DAO(接口省)
publicclassDealUserDAOImplimplementsIDealUserDAO{
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public void setSex(Integer sex) {
this.sex = sex;
}
}
3.映射文件
与Hibernate不同。因为需要人工编写SQL代码,ibatis的映射文件一般采
用手动编写(通过Copy/Paste,手工编写映射文件也并没想象中的麻烦)。
针对上面POJO的映射代码如下:
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://localhost/sample"/>
<property name="ername" ="user"/>
<property name="JDBC.Password" ="mypass"/>
CLASSPATH中新建log4j.properties配置文件,内容如下:
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
yout=org.apache.log4j.PatternLayout
2.创建测试数据库,并在数据库中创建一个t_user表,其中包含三个字段:
. id(int)
. name(varchar)
. sex(int)。
3.为了在开发过程更加直观,我们需要将ibatis日志打开以便观察ibatis运作的细节。
ibatis采用Apache common_logging,并结合Apache log4j作为日志输出组件。在
面对这样的需求,再次举起Hibernate大刀,却发现刀锋不再锐利,甚至无ቤተ መጻሕፍቲ ባይዱ使用,
奈何?恍惚之际,只好再摸出JDBC准备拼死一搏……,说得未免有些凄凉,直接使用JDBC
进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码,乏味的字段读取操作
令人厌烦。
“半自动化”的ibatis,却刚好解决了这个问题。
2.开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由
存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交
通银行,都在开发规范中严格指定)
3.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高
度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
“全自动”ORM机制而言,ibatis以SQL开发的工作量和数据库移植性上的让步,为系统
设计提供了更大的自由空间。作为“全自动”ORM实现的一种有益补充,ibatis的出现显
得别具意义。ibatis Quick Start
准备工作
1.下载ibatis软件包()。
"Pool.PingConnectionsNotUsedFor"
2.POJO(Plain Ordinary Java Object)
下面是我们用作示例的一个POJO:
public class User implements Serializable {
private Integer id;
private String name;
Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO到数据库表的全
套映射机制。程序员往往只需定义好了POJO到数据库表的映射关系,即可通过Hibernate
或者OJB提供的方法完成持久层操作。程序员甚至不需要对SQL的熟练掌握,
Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-////DTD SQL Map 2.0//EN"
"/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
yout.ConversionPattern=%c{1} -%m%n
log4j.logger.java.sql.PreparedStatement=DEBUG
构建ibatis基础代码
ibatis基础代码包括:
1.ibatis实例配置
一个典型的配置文件如下(具体配置项目的含义见后):
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
this.id = id;
}
public String getName() {
return ;
}
public void setName(String name) {
= name;
}
public Integer getSex() {
return this.sex;
<property name=
value="10"/>
<property name=value="5"/>
<property name=
value="120000"/>
<property name="Pool.TimeToWait" ="500"/>
<property name="Pool.PingQuery" ="select 1 from
</sqlMapConfig>
valuevalue"Pool.MaximumActiveConnections"
"Pool.MaximumIdleConnections"
"Pool.MaximumCheckoutTime"
valuevaluevalue"Pool.PingConnectionsOlderThan"
ACCOUNT"/>
<property name="Pool.PingEnabled" ="false"/>
<property name=
value="1"/>
<property name=
value="1"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/ibatis/sample/User.xml"/>
行。
大多数情况下(特别是对新项目,新系统的开发而言)
,这样的机制无往不利,大有一
统天下的势头。但是,在一些特定的环境下,这种一站式的解决方案却未必灵光。
在笔者的系统咨询工作过程中,常常遇到以下情况:
1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几
条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
SqlMapClient .............................................. 16
SqlMapClient基本操作示例................................. 16
OR映射................................................ 19
ibatis高级特性...................................... 26
数据关联.......................................... 26
一对多关联....................................... 26
一对一关联...................................... 28
MEMORY类型Cache与WeakReference .................. 40
LRU型Cache ............................................... 42
FIFO型Cache ....................................... 43
延迟加载.................................... 30
动态映射..................................... 31
事务管理........................................... 35
基于JDBC的事务管理机制.................................... 35
ibatis开发指南
ibatis Quick Start......................................... 5
准备工作............................................... 5