ibatis简单实现与配置

那我们什么时候可以用到ibatis呢,我们用hibernate的时候会发现,有的时候hibernate不支持一些特别精确的查询,这个时候我们完全可以用到ibatis,因为他是半自动化的。一会我们可以看到,他的查询语句是我们在配置文件xml中写的。hibernate可以用到一些大型的项目当中,ibatis我们可以应用到一些小型的项目当中。
下面我们看下ibatis的具体实现,hibernate中,我们都知道有一个hibernate.cfg.xml配置文件,和另一个*.hbm.xml配置文件,在ibatis中,我们同样也有两个配置文件,一个为SqlMapConfig.xml另一个为*.xml下面我们具体的看下两个配置文件中的具体配置方法。
SqlMapConfig.xml配置方法
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE sqlMapConfig
PUBLIC “-//iBATIS.com//DTD SQL Map Config 2.0//EN”
http://www.ibatis.com/dtd/sql-map-config-2.dtd"&gt;
<sqlMapConfig>
<settings cacheModelsEnabled=”true”
enhancementEnabled=”true”
lazyLoadingEnabled=”true”
errorTracingEnabled=”true”
maxRequests=”32″
maxSessions=”10″
maxTransactions=”5″
useStatementNamespaces=”false” />
<!– maxrequest 同时执行sql语句的最大条数
最好至少是maxTransactions的10倍数 而且大于maxSession
maxTransactions 同时进入SqlMapClient.startTransaction()的 最大线程数
maxSession 同一时间段内 最大session数 大于maxTransactions
小于maxRequest
cacheModelsEnabled 全局性的启用或者禁用SqlMapClient的所有缓存model
true为启用 默认为启用
lazyLoadingEnabled
全局性的启用或者禁用SqlMapClient的所有延迟加载,调试程序使用 true为启用
默认为启用
enhancementEnabled 全局性的启用或者禁用运行时字节码增强 false为禁用
默认为禁用
useStatementNamespaces
如果启用本属性,必须使用权限定名来引用mappedstatement。
这是由sql-map的名称和mapped-statment的名称合成,默认为false 禁用。
–>
<transactionManager type=”JDBC”>
<dataSource type=”SIMPLE”>
<property name=”JDBC.Driver” value=”com.mysql.jdbc.Driver”/>
<property name=”JDBC.ConnectionURL”
value=”jdbc:mysql://localhost/sample”/>
<property name=”JDBC.Username” value=”root”/>
<property name=”JDBC.Password” value=”admin”/>
<!– transactionManager元素为SQL Map配置事务管理服务
type指定所使用的管理器类型可以为JDBC JTA EXTERNAL
datasource元素是transactionManager的一部分
为SQL Map数据源设置了一些列参数。
dataSource type为 是根据选择链接数据库的方式决定的
peoperty中的JDBC.Driver为 驱动
ConnectionURL为链接地址
Username为访问数据库的用户名
Password为访问数据库的密码
–>
<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 sample” />
<property name=”Pool.PingEnabled” value=”false” />
<property name=”Pool.PingConnectionsOlderThan” value=”1″ />
<property name=”Pool.PingConnectionsNotUsedFor” value=”1″ />
<!– MaximumIdleConnections数据库连接池中允许的挂起(idle)连接数
MaximumCheckoutTime数据库联接池中,连接被某个任务所允许占用的最大时间,
如果超过这个时间限定,连接将被强制收回。(毫秒)
TimeToWait当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,
此时线程将进入等待状态,直到池中出现空闲连接。
此参数设定了线程所允许等待的最长时间。(毫秒)
PingQuery数据库连接状态检测语句。某些数据库在连接在某段时间持续处于空闲
状态时会将其断开。而连接池管理器将通过此语句检测池中连接是否可用。
检测语句应该是一个最简化的无逻辑SQL。如“select 1 from t_user”,
如果执行此语句成功,连接池管理器将认为此连接处于可用状态
PingEnabled是否允许检测连接状态。
PingConnectionsOlderThan对持续连接时间超过设定值(毫秒)的连接进行检测。
Pool.PingConnectionsNotUsedFor对空闲超过设定值(毫秒)的连接进行检测。
–>
</dataSource>
</transactionManager>
<sqlMap resource=”com/kobe/map/User.xml” />
<!– sqlmap源的 位置”包名/ .xml注意包中间有.的时候用/代替” –>
</sqlMapConfig>
<!– 注意 1.0允许配置多个数据源,这引起了一些不好的实现,因此
2.0版本只允许一个数据源,要使用多个部署/配置参数,您最好使用多个属性文件,
不同的属性文件,或在创建SQL Map时传入不同的属性文件。 –>
里面的配置文件,对我们初级入门的人来说,主要的配置就是连接数据库的配置。
下面,我们在看下*.xml中的配置
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE sqlMap
PUBLIC “-//iBATIS.com//DTD SQL Map 2.0//EN”
http://www.ibatis.com/dtd/sql-map-2.dtd"&gt;
<sqlMap namespace=”User”> <!– 映射文件名称 –>
<typeAlias alias=”user” type=”com.kobe.map.User”/> <!–
给对应的类取别名 –>
<!– sql语句 <![CDATA[可以避免SQL 中与XML
规范相冲突的字符对XML映射文件的合法性造成影响。
–>
<select id=”getUser” parameterClass=”java.lang.String”
resultClass=”user”>
<!– parameterClass是参数类型
resultClass是结果的类型
如果sql语句包括参数, 那么格式是#id# –>
<![CDATA[ select name,sex from t_user where name =
#name#]]>
</select>
<select id=”getAllUser” resultClass=”user”>
<![CDATA[ select name, sex from t_user where name = #name#
]]>
</select>
<update id=”updateUser” parameterClass=”user”>
<![CDATA[ UPDATE t_user SET name=#name#, sex=#sex# WHERE id =
#id# ]]>
</update>
<delete id=”deleteUser” parameterClass=”user”>
delete from t_user where id=#id#
</delete>
<insert id=”insertUser” parameterClass=”user”>
<![CDATA[ insert into t_user (id,name,sex) values
(#id#,#name#,#sex#) ]]>
</insert>
</sqlMap>
这里面配置文件我们可以看出来了。这里体现了ibatis半自动化的体现,因为他的sql语句并不是自动生成,而是我们自己写的,所以这样我们可以执行更精确的查询。
下面我们在看下Test实现
import java.sql.SQLException;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class Test {
public static void main(String args[]){
//首先初始化iBatis获得一个SqlMapClient对象
String resource = “com/kobe/map/SqlMapConfig.xml”;
com.ibatis.sqlmap.client.SqlMapClient sqlMap = null;
try {
java.io.Reader reader = com.ibatis.common.resources.Resources
.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
}
// sqlMap系统初始化完毕,开始执行update操作
try {
sqlMap.startTransaction();
User user = new User();
//user.setId(24);
//user.setName(“lzq”);
//user.setSex(24);
//sqlMap.insert(“insertUser”, user);
//user.setId(24);
//user.setName(“kobelzq”);
//user.setSex(24);
//sqlMap.update(“updateUser”, user); //key为User xml中配置的id名字
键为bean的名字
user.setId(2);
sqlMap.delete(“deleteUser”, user);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(“操作成功”);
}
}
}
上面我加注释的地方,大家可以根据不同的需要,测试下不同的效果,我测试了三个效果,分别为增,删,改,查询大家要是感兴趣的话,可以自己写下。我这里少写了一个持久类,持久类的写法大家都熟悉,我就不在这里给大家展示了,无非就是get与set方法,大家可以自己实现一下。

iBatis是又一个O/R
Mapping解决方案,j2ee的O/R方案真是多,和Hibernate相比,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。

您可能感兴趣的文章:

第一步:
package com.ibatis;

public class Author {
 private int id;
 private String name;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}
第二步:author.xml
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE sqlMap
PUBLIC “-//iBATIS.com//DTD SQL Map 2.0//EN”
http://www.ibatis.com/dtd/sql-map-2.dtd“>
<sqlMap namespace=”Author”>
<!–模块配置–>
<!–设置本映射文件中的别名–>
<typeAlias alias=”author” type=”com.ibatis.Author” />
<!–
<cacheModel type=”LRU” id=”authorCache”>
 设置缓存有效期,如果超出这个时间,则会清空缓存
 <flushInterval hours=”24″></flushInterval> 
 指定执行特定的statement时,清空缓存
 <flushOnExecute statement=”updateAuthor”/>
 SIZE:本cacheModel最大容纳数据对象的数量
 <property value=”1000″ name=”size”/>
</cacheModel>
需要使用模块配置,如:<select id=”getAllAuthor” resultClass=”author”
cacheModel=”authorCache”>
把记录使用cacheModel“authorCache”进行缓存,以后程序再使用statement进行数据查询,就直接
去缓存中取数据,而不是去数据库中取数据
–>
<!–Statement配置–>
<!–修改–>
<update id=”updateAuthor” parameterClass=”author”>
 <![CDATA[UPDATE author SET name=#name# WHERE id=#id#]]>
</update>
<!–删除–>
<delete id=”deleteAuthor” parameterClass=”author”> 
  delete from author WHERE id = #id# 
</delete> 
<!–查询所有的记录–>
<select id=”getAllAuthor” resultClass=”author”>
 <![CDATA[SELECT * FROM author]]>
</select>
<!–添加–>
<insert id=”insertAuthor” parameterClass=”author”>
 <![CDATA[INSERT INTO author(id,name)
VALUES(#id#,#name#)]]>
</insert>
</sqlMap>
第三步:SqlMapConfig.properties
driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=ibatis
username=sa
password=
第四步:SqlMapConfig.xml
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE sqlMapConfig
PUBLIC “-//iBATIS.com//DTD SQL Map Config 2.0//EN”
http://www.ibatis.com/dtd/sql-map-config-2.dtd“>
<!– Ibatis配置文件–>
<sqlMapConfig>
<!– 加载连接数据库属性文件 –>
<properties resource=”com/ibatis/SqlMapConfig.properties” />
<!–
cacheModelsEnabled:是否启动SqlMapClient的缓存机制。
enhancementEnabled:是否针对POJO启用字节码增加机制以提升geter/seter的调用效用,为延迟
     加载带来了及大的性能提升。
lazyLoadingEnabled:是否启用延迟加载机制。
maxRequests:最大并大请求数。
maxSessions:最大Session数,即当前最大允许的开发SqlMapClient数
maxTransactions:最大并发事务数。   
–>
<settings
cacheModelsEnabled=”true”
enhancementEnabled=”true”
lazyLoadingEnabled=”true”
maxRequests=”32″
maxSessions=”10″
maxTransactions=”5″
useStatementNamespaces=”false”
/>

<!– datasource –>
<transactionManager type=”JDBC” >
<dataSource type=”SIMPLE”>
<!–JDBC驱动–>
<property name=”JDBC.Driver” value=”${driver}”/>
<!–数据库URL–>
<property name=”JDBC.ConnectionURL” value=”${url}”/>
<!–数据库用户名–>
<property name=”JDBC.Username” value=”${username}”/>
<!–数据库密码–>
<property name=”JDBC.Password” value=”${password}”/>
<!–不知道,在网站上查不出来,有时间再研究–>
<property name=”JDBC.DefaultAutoCommit” value=”true” />
<!–数据库连接池可维持的最大容量–>
<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 author”/>
<!–是否允许检查连接状态–>
<property name=”Pool.PingEnabled” value=”false”/>
<!–对持续连接超过设定值的连接进行检查–>
<property name=”Pool.PingConnectionsOlderThan” value=”1″/>
<!–对空闲超过设定值的连接进行检查–>
<property name=”Pool.PingConnectionsNotUsedFor” value=”1″/>
</dataSource>
</transactionManager>
<!–加载SqlMap文件–>
<sqlMap resource=”com/ibatis/author.xml” />
</sqlMapConfig>
第五步:
package com.ibatis;

import java.io.IOException;
import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class SqlMapConf {
 //初始化SqlMapClient
 private static SqlMapClient sqlmapclient;
 static{
  //定义ibatis配置文件的路径
  String resource=”com/ibatis/SqlMapConfig.xml”;
  try {
   //读取ibatis配置文件
   Reader reader=Resources.getResourceAsReader(resource);
   //通过SqlMapClientBuilder创建SqlMapClient
   sqlmapclient=SqlMapClientBuilder.buildSqlMapClient(reader);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   System.out.println(“找不到SqlMapConfig.xml文件~~”);
  }
 }
 public static SqlMapClient getInstance(){
 
//返回sqlmapclient,SqlMapClient是ibatis的核心主建,提供数据操作的基础平台
  
  return sqlmapclient;
 }
 /**
  * SqlMapClient的另一种创建方式
  * XmlSqlMapClientBuilder xmlbuilder=new XmlSqlMapClientBuilder();
  * SqlMapClient sqlmapclient=xmlbuilder.builderSqlMap(reader);
  *
XmlSqlMapClientBuilder是ibatis2.0之后版本新引入的组件,用以取代1.X版本中的
  * XmlSqlMapBuilder,其作用就是创建SqlMapClient。
  */
}
第六步:
package com.ibatis;

网站地图xml地图