关于ibatis的介绍、优缺点,以及ibatis和hibernate的比較再此不在赘述。可參阅其它资料。
一、准备工作
1、下载ibatis软件包http://download.csdn.net/detail/itmyhome/7473661
所需jar包为:ibatis-xxx.jar,mysql-connector-java-xxx-bin.jar
2、创建測试数据库。并新建user表,当中包括三个字段:
id(int)
name(varchar)
age(int)
ps:以mysql数据库为例
create table user( id int, name varchar(50), age int );
二、构建ibatis基础代码
ibatis基础代码包括:
1、ibatis实例配置
一个典型的配置文件例如以下
<?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"> <sqlMapConfig> <settings cacheModelsEnabled="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.mysql.jdbc.Driver" /> <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatis" /> <property name="JDBC.Username" value="root" /> <property name="JDBC.Password" value="root" /> <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/itmyhome/User.xml" /> </sqlMapConfig>
ibatis配置文件各节点简单说明:
(1)Settings节点
參数 | 描写叙述 |
cacheModelsEnabled | 是否启用 SqlMapClient 上的缓存机制。
|
enhancementEnabled | 是否针对POJO启用字节码增强机制以提升 getter/setter 的调用效能,避免使用Java Reflect 所带来的性能开销。 同一时候,这也为Lazy Loading带来了极大的性能 提升。 建议设为"true" |
errorTracingEnabled | 是否启用错误日志,在开发期间建议设为"true" 以方便调试 |
lazyLoadingEnabled | 是否启用延迟载入机制,建议设为"true" |
maxRequests | 最大并发请求数(Statement并发数) |
maxTransactions | 最大并发事务数 |
maxSessions | 最大Session数.即当前最大同意的并发SqlMapClient数 maxSessions设定必须介于 maxTransactions和maxRequests之间,即 maxTransactions<maxSessions=< maxRequests |
useStatementNamespaces | 是否使用Statement命名空间。 这里的命名空间指的是映射文件里,sqlMap节点 的namespace属性,如在上例中针对user 表的映射文件sqlMap节点: <sqlMap namespace="User"> 这里,指定了此sqlMap节点下定义的操作均从 属于"User"命名空间。
|
(2)transactionManager节点
transactionManager节点定义了ibatis的事务管理器,眼下提供了以下几种选择:
1) JDBC
通过传统 JDBC Connection.commit/rollback实现事务支持。
2) JTA
使用容器提供的JTA服务实现全局事务管理。
3) EXTERNAL
外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置就可以实现自己主动的事务管理机制。
此时ibatis将把全部事务托付给外部容器进行管理。此外,通过Spring等轻量级容器实现事务的配置化管理也是一个不错的选
择。关于结合容器实现事务管理,參见“高级特性”中的描写叙述。
(3)dataSource节点
dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。
type属性:dataSource节点的type属性指定了dataSource的实现类型。
可选项目:
1) SIMPLE:
SIMPLE是ibatis内置的dataSource实现,当中实现了一个简单的数据库连接池机制,相应ibatis实现类为
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。
3) DBCP:
基于Apache DBCP连接池组件实现的DataSource封装,当无容器提
供DataSource服务时,建议使用该选项,相应ibatis实现类为com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。
3) JNDI:
使用J2EE容器提供的DataSource实现,DataSource将通过指定
的JNDI Name从容器中获取.相应ibatis实现类为com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。
dataSource的子节点说明(SIMPLE&DBCP):
JDBC.Driver | JDBC驱动.如:com.mysql.jdbc.Driver |
JDBC.ConnectionURL | 数据库URL。如:jdbc:mysql://localhost:3306/ibatis 假设用的是SQLServer JDBC Driver,须要 在url后追加SelectMethod=Cursor以获得 JDBC事务的多Statement支持。 |
JDBC.Username | 数据库username |
JDBC.Password | 数据库用户password |
Pool.MaximumActiveConnections | 数据库连接池可维持的最大容量。 |
Pool.MaximumIdleConnections | 数据库连接池中同意的挂起(idle)连接数。 |
(4)sqlMap节点
sqlMap节点指定了映射文件的位置,配置中可出现多个sqlMap节点,以指定
项目内所包括的全部映射文件。
2、POJO
以下是我们用作演示样例的一个POJO
public class User implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private int age; 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; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3、映射文件
与Hibernate不同,由于须要人工编写sql代码 ibatis的映射文件一般採用手动编写
<?xml version="1.0" encoding="UTF-8"?从上面的映射文件能够看出,通过<insert>、<delete>、<update>、> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="User"> <typeAlias alias="user" type="com.itmyhome.User" /> <!-- 查询 --> <select id="getUser" parameterClass="java.lang.Integer" resultClass="user"> <![CDATA[ select name,age from user where id = #id# ]]> </select> <!-- 插入 --> <insert id="insertUser" parameterClass="user"> insert into user values(#id#,#name#,#age#) </insert> <!-- 更新 --> <update id="updateUser" parameterClass="user"> <![CDATA[ update user SET name=#name#, age=#age# WHERE id = #id# ]]> </update> <!-- 删除 --> <delete id="deleteUser" parameterClass="java.lang.Integer"> delete from user where id = #id# </delete> </sqlMap>
<select>四个节点,我们分别定义了针对User对象的增删改查操作。
在这
四个节点中,我们指定了相应的SQL语句,以update节点为例:
<update id="updateUser" (1 parameterClass="user"> (2 <![CDATA[ (3 update user (4 SET name=#name#, age=#age# (5 WHERE id = #id# ]]> </update>⑴ID
指定了操作ID,之后我们能够在代码中通过指定操作id来运行此节点所定义的操作,如:
sqlMap.update("updateUser",user);
ID设定使得在一个配置文件里定义两个同名节点成为可能(两个update节点,以不同id区分)
⑵ parameterClass
指定了操作所需的參数类型,此例中update操作以
com.itmyhome.User 类型的对象作为參数,目标是将提供的User实例更新到数据库。
parameterClass="user"中,user为"com.itmyhome.User"类的别名,别名可通过typeAlias节点指定,
如演示样例配置文件里的:<typeAlias alias="user" type="com.itmyhome.User"/>
⑶ <![CDATA[… ]]>
通过<![CDATA[… ]]>节点,能够避免SQL中与XML规范相冲突的字符对XML映射文件的合法性造成影响。
⑷运行更新操的SQL,这里的SQL即实际数据库支持的SQL语句,将由ibatis填入參数后交给数据库运行。
⑸ SQL中所需的username參数,"#name#"在运行期会由传入的user对象的name属性填充。(其它參数同)
对于这个演示样例,ibatis在运行期会读取id为"updateUser"的update节点
的SQL定义,并调用指定的user对象的相应getter方法获取属性值,并用此
属性值,对SQL中的參数进行填充后提交数据库运行。
好了,我们完毕了全部的配置文件和映射文件。就剩下应用的编码工作了。
首先要设置SQL Map,读入刚创建好的SQL Map XML配置文件。为简化这个工作。能够使用
SQL Map架构中提供的Resources类。
Stringresource ="SqlMapConfig.xml"; Readerreader=Resources.getResourceAsReader(resource); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
以上的SqlMapClient对象是线程安全,而且应持久生存。对于一个特定的应用。仅仅需
进行一次SqlMap配置。因此,它能够作为基类的一个静态对象(即DAO对象的基类),或
者,假设您想让它有更大的作用范围,能够把它封装在方便使用的类中。比如:
public class MyAppSqlConfig { private static final SqlMapClient sqlMap; static { try { String resource = "SqlMapConfig.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e); } } public static SqlMapClient getSqlMapInstance() { return sqlMap; } }
从数据库读取对象
既然SqlMap对象已完毕初始化,那么就能够方便地使用它了。
首先我们用它
从数据库中读取一个User对象(本例中 先假设User表中一村庄N条记录,id从i到N)
要从数据库中得到一个User对象,仅仅须要SqlMap实例,让我们读入id为1的User对象
SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance(); User user = (User)sqlMap.queryForObject ("getUser", 1);
把对象写入数据库
User u = new User(); u.setId(2); u.setName("wangwu"); u.setAge(23); sqlMap.insert("insertUser",u);
更新对象
User u = new User(); u.setId(3); u.setName("itmyhome"); u.setAge(25); sqlMap.update("updateUser",u)
删除对象
sqlMap.delete("deleteUser", 1)
项目project图例如以下:
项目源代码下载:http://download.csdn.net/detail/itmyhome/7473721
作者:itmyhome
转载请注明出处:http://blog.csdn.net/itmyhome1990/article/details/28267901