iBatis小例子
作者:admin 日期:2007-08-17
相对Hibernate提供了全面的数据库封装机制的“全自动化”ORM实现而言,ibatis要求开发者编写具体的SQL语句。ibatis以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。当系统性能要求苛刻、数据处理量大的时候,不失为一种上佳的选择!
这次学习一下ibatis,首先还是来准备必备包:iBATIS_DBL-2.0.0.281-Final.zip、ibatis-common-2.jar、ibatis-dao-2.jar、ibatis-sqlmap-2.jar、commons-logging-1-0-3.jar、log4j-1.2.8.jar。(以上jar包都可以在iBATIS_DBL-2.0.0.281-Final.zip中找到)数据库仍然使用学习Hibernate时使用的Hsqldb。以上必备包可以在ibatis.apache.org和hsqldb.sourceforge.net下载到。
实例:
在Hsqldb中创建ibatisTest数据库,并创建一张T_USER表,编写User.java和User.xml(基于ibatis的O/R映射关系),编写SqlMapConfig.xml配置文件,编写UserAction.java的业务类,实现往T_USER表中插入一条id = 1,name = Erica,sex = 1的数据。
数据库:
使用Hsqldb,TYPE选择HSQL DataBase Engine Service,URL填写jdbc.hsqldb:ibatisTest,其余不变,创建好ibatisTest数据库。在执行框中输入以下SQL语句:
Create TABLE T_USER(
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR NOT NULL,
SEX INTEGER NOT NULL)
数据库建立成功!
O/R映射关系:
分别编写User.java和User.xml两个文件。
1、User.java类
package com.ibatis.sample;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class User implements Serializable {
private Integer id;
private String name;
private Integer sex;
private Set addresses = new HashSet();
public User() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSex() {
return this.sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String toString() {
return "[User] " + name + "(" + id + ") sex=" + sex;
}
}
2、User.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="User">
<typeAlias alias="user" type="com.ibatis.sample.User"/>
<insert id="insertUser" parameterClass="user">
<![CDATA[
Insert INTO T_USER (
ID,
NAME,
SEX)
VALUES (
#id#,
#name#,
#sex#
)
]]>
</insert>
</sqlMap>
配置文件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">
<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
value="org.hsqldb.jdbcDriver"/>
<property
value="jdbc:hsqldb:DB/ibatisTest"/>
<property value="sa"/>
<property value=""/>
<property value="10"/>
<property value="5"/>
<property value="120000"/>
<property value="500"/>
<property value="select 1 from ACCOUNT"/>
<property value="false"/>
<property value="1"/>
<property value="1"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/ibatis/sample/User.xml"/>
</sqlMapConfig>
我们用这个文件配置数据库连接方式,并以<sqlMap resource="com/ibatis/sample/User.xml"/>告知ibatis,应该为User.xml建立映射关系等。
业务类UserAction.java:
package com.ibatis;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.engine.builder.xml.XmlSqlMapClientBuilder;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sample.User;
import java.io.Reader;
public class UserAction {
public static void main(String[] args) throws Exception {
String resource ="com/ibatis/sample/SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilder xmlBuilder = new XmlSqlMapClientBuilder();
SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
//sqlMap系统初始化完毕
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(1));
System.out.println(user);
try{
sqlMap.startTransaction();
sqlMap.insert("insertUser",user);
sqlMap.commitTransaction();
System.out.println(user);
}
catch(Exception e){
}
finally{
sqlMap.endTransaction();
}
}
}
这也是一个没有SQL语句的业务类,但是并不像Hibernate的“全自动化”机制,所有SQL语句由Hibernate自动生成。在这里,我们将sqlMap.insert("insertUser",user);中“insertUser”对应的SQL语句写在了User.xml文件里,并在SqlMapConfig.xml文件里告知ibatis对其进行关系映射。ibatis正是以这种“半自动化”机制来运作的。
执行:
先将之前创建好的ibatisTest数据库文件ibatisTest.properties、ibatisTest.script(位于Hsqldb的data文件夹里),拷贝到工程目录的DB文件夹下。
一切都正常的话,运行后,我们可以在后台看到如下信息:
[User] Erica(1) sex=1
SimpleDataSource - Created connection 10973446.
Connection - {conn-100000} Connection
PreparedStatement - {pstm-100001} PreparedStatement: Insert INTO T_USER ( ID, NAME, SEX) VALUES ( ?, ?, ? )
PreparedStatement - {pstm-100001} Parameters: [1, Erica, 1]
PreparedStatement - {pstm-100001} Types: [java.lang.Integer, java.lang.String, java.lang.Integer]
[User] Erica(1) sex=1
SimpleDataSource - Returned connection 10973446 to pool.
这里ibatis和Hibernate略有不同。同样的数据库工具、同样是做insert操作,当我用Hibernate提交一个id为null的javabean的时候,由于Hibernate的“全自动化”机制,在SQL语句的执行过程中,Hibernate自动生成id号,并成功执行了SQL语句!但是,当我用ibatis提交一个id为null的javabean的时候,SQL语句执行就出错了!
将工程目录下的DB文件夹下的ibatisTest.data、ibatisTest.properties、ibatisTest.script三个文件拷贝到Hsqldb下的data文件夹下,覆盖原来创建的文件。使用原先的配置和数据库名进入,看看数据有没有插入成功!
这次学习一下ibatis,首先还是来准备必备包:iBATIS_DBL-2.0.0.281-Final.zip、ibatis-common-2.jar、ibatis-dao-2.jar、ibatis-sqlmap-2.jar、commons-logging-1-0-3.jar、log4j-1.2.8.jar。(以上jar包都可以在iBATIS_DBL-2.0.0.281-Final.zip中找到)数据库仍然使用学习Hibernate时使用的Hsqldb。以上必备包可以在ibatis.apache.org和hsqldb.sourceforge.net下载到。
实例:
在Hsqldb中创建ibatisTest数据库,并创建一张T_USER表,编写User.java和User.xml(基于ibatis的O/R映射关系),编写SqlMapConfig.xml配置文件,编写UserAction.java的业务类,实现往T_USER表中插入一条id = 1,name = Erica,sex = 1的数据。
数据库:
使用Hsqldb,TYPE选择HSQL DataBase Engine Service,URL填写jdbc.hsqldb:ibatisTest,其余不变,创建好ibatisTest数据库。在执行框中输入以下SQL语句:
Create TABLE T_USER(
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR NOT NULL,
SEX INTEGER NOT NULL)
数据库建立成功!
O/R映射关系:
分别编写User.java和User.xml两个文件。
1、User.java类
package com.ibatis.sample;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class User implements Serializable {
private Integer id;
private String name;
private Integer sex;
private Set addresses = new HashSet();
public User() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSex() {
return this.sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String toString() {
return "[User] " + name + "(" + id + ") sex=" + sex;
}
}
2、User.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="User">
<typeAlias alias="user" type="com.ibatis.sample.User"/>
<insert id="insertUser" parameterClass="user">
<![CDATA[
Insert INTO T_USER (
ID,
NAME,
SEX)
VALUES (
#id#,
#name#,
#sex#
)
]]>
</insert>
</sqlMap>
配置文件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">
<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
value="org.hsqldb.jdbcDriver"/>
<property
value="jdbc:hsqldb:DB/ibatisTest"/>
<property value="sa"/>
<property value=""/>
<property value="10"/>
<property value="5"/>
<property value="120000"/>
<property value="500"/>
<property value="select 1 from ACCOUNT"/>
<property value="false"/>
<property value="1"/>
<property value="1"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/ibatis/sample/User.xml"/>
</sqlMapConfig>
我们用这个文件配置数据库连接方式,并以<sqlMap resource="com/ibatis/sample/User.xml"/>告知ibatis,应该为User.xml建立映射关系等。
业务类UserAction.java:
package com.ibatis;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.engine.builder.xml.XmlSqlMapClientBuilder;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sample.User;
import java.io.Reader;
public class UserAction {
public static void main(String[] args) throws Exception {
String resource ="com/ibatis/sample/SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilder xmlBuilder = new XmlSqlMapClientBuilder();
SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
//sqlMap系统初始化完毕
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(1));
System.out.println(user);
try{
sqlMap.startTransaction();
sqlMap.insert("insertUser",user);
sqlMap.commitTransaction();
System.out.println(user);
}
catch(Exception e){
}
finally{
sqlMap.endTransaction();
}
}
}
这也是一个没有SQL语句的业务类,但是并不像Hibernate的“全自动化”机制,所有SQL语句由Hibernate自动生成。在这里,我们将sqlMap.insert("insertUser",user);中“insertUser”对应的SQL语句写在了User.xml文件里,并在SqlMapConfig.xml文件里告知ibatis对其进行关系映射。ibatis正是以这种“半自动化”机制来运作的。
执行:
先将之前创建好的ibatisTest数据库文件ibatisTest.properties、ibatisTest.script(位于Hsqldb的data文件夹里),拷贝到工程目录的DB文件夹下。
一切都正常的话,运行后,我们可以在后台看到如下信息:
[User] Erica(1) sex=1
SimpleDataSource - Created connection 10973446.
Connection - {conn-100000} Connection
PreparedStatement - {pstm-100001} PreparedStatement: Insert INTO T_USER ( ID, NAME, SEX) VALUES ( ?, ?, ? )
PreparedStatement - {pstm-100001} Parameters: [1, Erica, 1]
PreparedStatement - {pstm-100001} Types: [java.lang.Integer, java.lang.String, java.lang.Integer]
[User] Erica(1) sex=1
SimpleDataSource - Returned connection 10973446 to pool.
这里ibatis和Hibernate略有不同。同样的数据库工具、同样是做insert操作,当我用Hibernate提交一个id为null的javabean的时候,由于Hibernate的“全自动化”机制,在SQL语句的执行过程中,Hibernate自动生成id号,并成功执行了SQL语句!但是,当我用ibatis提交一个id为null的javabean的时候,SQL语句执行就出错了!
将工程目录下的DB文件夹下的ibatisTest.data、ibatisTest.properties、ibatisTest.script三个文件拷贝到Hsqldb下的data文件夹下,覆盖原来创建的文件。使用原先的配置和数据库名进入,看看数据有没有插入成功!
[本日志由 admin 于 2007-09-22 11:35 PM 编辑]
文章来自: 本站原创
引用通告地址: http://www.is21.cn/trackback.asp?tbID=32
Tags:
文章来自: 本站原创
引用通告地址: http://www.is21.cn/trackback.asp?tbID=32
Tags:
评论: 0 | 引用: 0 | 查看次数: 2741
发表评论
你没有权限发表留言!