最简单的iBatis入门例子
iBatis是一个O/R Mapping解决方案,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。下面我们看一个最简单的入门例子,是《ibatis 开发指南》上的例子改的,不过上面讲的不仔细,我开始学的时候搞了一个晚上才把那个例子跑起来的,相信一些朋友也和我一样,在入门的时候有一点小郁闷,我把整个工程项目打包了供朋友下载 ,工具是eclipse3.2+myeclipse5.0,导入即可运行,数据库用的是MySQL。也可以改用别的数据库!
先建数据库和表吧;sql语句我导出来了:
/**/ /*
SQLyog 企业版 - MySQL GUI v4.1
主机 - 5.0.7-beta-nt : 数据库 - sample
*********************************************************************
服务器版本 : 5.0.7-beta-nt
create database if not exists `sample`;
USE `sample`;
/* 数据表 `t_user` 的表结构 */
drop table if exists `t_user`;
CREATE TABLE `t_user` (
`id` int ( 11 ) NOT NULL auto_increment,
` name ` varchar ( 50 ) default NULL ,
`sex` int ( 11 ) default NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
/**/ /* 数据表 `t_user` 的数据 */
insert into `t_user` values ( 1 , ' zhupan ' , 1 ),( 2 , ' zhupan ' , 2 ),( 3 , ' 3 ' , 3 ),( 4 , ' 4 ' , 4 ),( 5 , ' 5 ' , 5 );
整个工程目录结构如下: (图片未能显示,附件里面有)
lib包下面的文件: (图片未能显示,附件里面有)
下面开始编写每个文件:
编写iBatis必须的配置文件SqlMapConfig.xml,放在包com.ctgusec.zhupan.maps下,文件名可以任意改,内容如下:
<? 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/sample" />
< property name ="JDBC.Username" value ="root" />
< property name ="JDBC.Password" value ="" />
< 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 sample" />
< property name = "Pool.PingEnabled" value = "false" />
< property name = "Pool.PingConnectionsOlderThan" value = "1" />
< property name = "Pool.PingConnectionsNotUsedFor" value = "1" />
</ dataSource >
</ transactionManager >
< sqlMap resource = "com/ctgusec/zhupan/maps/User.xml" />
</ sqlMapConfig >
如果不用mysql数据库,需要重新配置数据源(红色加粗字体标出),更改相应的属性即可。
然后注意到这个配置文件还引用了一个User.xml,iBatis把每个需要O/R Mapping的Java对象关联到一个xml配置文件,我们需要把t_user表映射到一个User类:
package com.ctgusec.zhupan.model;
import java.io.Serializable;
public class User implements Serializable {
/** */ /**
* @author zhupan
*/
private static final long serialVersionUID = 1L ;
private Integer id ;
private String name ;
private Integer sex ;
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;
}
}
编写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.ctgusec.zhupan.model.User" />
< select id = "getUser" parameterClass = "java.lang.String"
resultClass = "user" >
<![CDATA[ select name, sex from t_user where name = #name# ]]>
</ select >
< select id = "getAllUser" resultClass = "user" >
<![CDATA[ select name, sex from t_user ]]>
</ select >
< update id = "updateUser" parameterClass = "user" >
<![CDATA[ UPDATE t_user SET name=#name#, sex=#sex# WHERE id = #id# ]]>
</ update >
< insert id = "insertUser" parameterClass = "user" >
INSERT INTO t_user ( name, sex) VALUES ( #name#, #sex# ) </ insert >
< delete id = "deleteUser" parameterClass = "java.lang.String" >
delete from t_user where id=#value#
</ delete >
</ sqlMap >
通过<insert>、<delete>、<update>、<select>节点,分别定义了针对TUser 对象的增删改查操作。在这些节点中,我们指定了对应的SQL 语句:ID 指定了操作ID,之后我们可以在代码中通过指定操作id 来执行此节点所定义的操作,如:sqlMap.update("updateUser",user); ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)parameterClass 指定了操作所需的参数类型,此例中update 操作以com.ctgusec.zhupan.model.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。parameterClass="user"中,user为“com.ctgusec.zhupan.model.User”类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:<typeAlias alias="user" type="com.ctgusec.zhupan.model.User"/>“#name#”在运行期会由传入的user对象的name属性填充。“#sex#”,将在运行期由传入的user 对象的sex属性填充。“#id#”,将在运行期由传入的user对象的id属性填充。
只要你会写SQL,就能非常容易地写出配置文件。
最后便是如何使用iBatis实现O/R映射,测试给个例子:
package com.ctgusec.zhupan;
import java.sql.SQLException;
import java.util.List;
import com.ctgusec.zhupan.model.User;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
/** *//**
*
* @author zhupan
*/
public class ExampleMain {
public static void update() {
// 首先初始化 iBatis 获得一个 SqlMapClient 对象
String resource = " com/ctgusec/zhupan/maps/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( new Integer( 1 ));
user.setName( " zhupan " );
user.setSex( new Integer( 1 ));
sqlMap.update( " updateUser " , user);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static List getUser() {
// 首先初始化 iBatis 获得一个 SqlMapClient 对象
String resource = " com/ctgusec/zhupan/maps/SqlMapConfig.xml " ;
com.ibatis.sqlmap.client.SqlMapClient sqlMap = null ;
List user = null ;
try {
java.io.Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
}
// sqlMap 系统初始化完毕,开始执行 getAllUser 操作
try {
sqlMap.startTransaction();
user = sqlMap.queryForList( " getAllUser " , null );
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
public static void main(String[] args) {
update();
List user = getUser();
for ( int i = 0 ;i < user.size();i ++ )
{
System.out.println(((User)user.get(i)).getName());
}
}
}
运行时把lib包下的所有.jar构建到路径中,操作如下: (图片未能显示,附件里面有)
点击 (图片未能显示,附件里面有) 找到.jar文件全部选中,确认即可
最简单的iBatis入门例子
iBatis是一个O/R Mapping解决方案,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。下面我们看一个最简单的入门例子,是《ibatis 开发指南》上的例子改的,不过上面讲的不仔细,我开始学的时候搞了一个晚上才把那个例子跑起来的,相信一些朋友也和我一样,在入门的时候有一点小郁闷,我把整个工程项目打包了供朋友下载 ,工具是eclipse3.2+myeclipse5.0,导入即可运行,数据库用的是MySQL。也可以改用别的数据库!
先建数据库和表吧;sql语句我导出来了:
/**/ /*
SQLyog 企业版 - MySQL GUI v4.1
主机 - 5.0.7-beta-nt : 数据库 - sample
*********************************************************************
服务器版本 : 5.0.7-beta-nt
create database if not exists `sample`;
USE `sample`;
/* 数据表 `t_user` 的表结构 */
drop table if exists `t_user`;
CREATE TABLE `t_user` (
`id` int ( 11 ) NOT NULL auto_increment,
` name ` varchar ( 50 ) default NULL ,
`sex` int ( 11 ) default NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
/**/ /* 数据表 `t_user` 的数据 */
insert into `t_user` values ( 1 , ' zhupan ' , 1 ),( 2 , ' zhupan ' , 2 ),( 3 , ' 3 ' , 3 ),( 4 , ' 4 ' , 4 ),( 5 , ' 5 ' , 5 );
整个工程目录结构如下: (图片未能显示,附件里面有)
lib包下面的文件: (图片未能显示,附件里面有)
下面开始编写每个文件:
编写iBatis必须的配置文件SqlMapConfig.xml,放在包com.ctgusec.zhupan.maps下,文件名可以任意改,内容如下:
<? 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/sample" />
< property name ="JDBC.Username" value ="root" />
< property name ="JDBC.Password" value ="" />
< 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 sample" />
< property name = "Pool.PingEnabled" value = "false" />
< property name = "Pool.PingConnectionsOlderThan" value = "1" />
< property name = "Pool.PingConnectionsNotUsedFor" value = "1" />
</ dataSource >
</ transactionManager >
< sqlMap resource = "com/ctgusec/zhupan/maps/User.xml" />
</ sqlMapConfig >
如果不用mysql数据库,需要重新配置数据源(红色加粗字体标出),更改相应的属性即可。
然后注意到这个配置文件还引用了一个User.xml,iBatis把每个需要O/R Mapping的Java对象关联到一个xml配置文件,我们需要把t_user表映射到一个User类:
package com.ctgusec.zhupan.model;
import java.io.Serializable;
public class User implements Serializable {
/** */ /**
* @author zhupan
*/
private static final long serialVersionUID = 1L ;
private Integer id ;
private String name ;
private Integer sex ;
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;
}
}
编写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.ctgusec.zhupan.model.User" />
< select id = "getUser" parameterClass = "java.lang.String"
resultClass = "user" >
<![CDATA[ select name, sex from t_user where name = #name# ]]>
</ select >
< select id = "getAllUser" resultClass = "user" >
<![CDATA[ select name, sex from t_user ]]>
</ select >
< update id = "updateUser" parameterClass = "user" >
<![CDATA[ UPDATE t_user SET name=#name#, sex=#sex# WHERE id = #id# ]]>
</ update >
< insert id = "insertUser" parameterClass = "user" >
INSERT INTO t_user ( name, sex) VALUES ( #name#, #sex# ) </ insert >
< delete id = "deleteUser" parameterClass = "java.lang.String" >
delete from t_user where id=#value#
</ delete >
</ sqlMap >
通过<insert>、<delete>、<update>、<select>节点,分别定义了针对TUser 对象的增删改查操作。在这些节点中,我们指定了对应的SQL 语句:ID 指定了操作ID,之后我们可以在代码中通过指定操作id 来执行此节点所定义的操作,如:sqlMap.update("updateUser",user); ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)parameterClass 指定了操作所需的参数类型,此例中update 操作以com.ctgusec.zhupan.model.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。parameterClass="user"中,user为“com.ctgusec.zhupan.model.User”类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:<typeAlias alias="user" type="com.ctgusec.zhupan.model.User"/>“#name#”在运行期会由传入的user对象的name属性填充。“#sex#”,将在运行期由传入的user 对象的sex属性填充。“#id#”,将在运行期由传入的user对象的id属性填充。
只要你会写SQL,就能非常容易地写出配置文件。
最后便是如何使用iBatis实现O/R映射,测试给个例子:
package com.ctgusec.zhupan;
import java.sql.SQLException;
import java.util.List;
import com.ctgusec.zhupan.model.User;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
/** *//**
*
* @author zhupan
*/
public class ExampleMain {
public static void update() {
// 首先初始化 iBatis 获得一个 SqlMapClient 对象
String resource = " com/ctgusec/zhupan/maps/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( new Integer( 1 ));
user.setName( " zhupan " );
user.setSex( new Integer( 1 ));
sqlMap.update( " updateUser " , user);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static List getUser() {
// 首先初始化 iBatis 获得一个 SqlMapClient 对象
String resource = " com/ctgusec/zhupan/maps/SqlMapConfig.xml " ;
com.ibatis.sqlmap.client.SqlMapClient sqlMap = null ;
List user = null ;
try {
java.io.Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
}
// sqlMap 系统初始化完毕,开始执行 getAllUser 操作
try {
sqlMap.startTransaction();
user = sqlMap.queryForList( " getAllUser " , null );
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
public static void main(String[] args) {
update();
List user = getUser();
for ( int i = 0 ;i < user.size();i ++ )
{
System.out.println(((User)user.get(i)).getName());
}
}
}
运行时把lib包下的所有.jar构建到路径中,操作如下: (图片未能显示,附件里面有)
点击 (图片未能显示,附件里面有) 找到.jar文件全部选中,确认即可
总结:iBatis确实简单灵活,上手容易,代码很少,配置稍嫌复杂。动态SQL的确是个强点,熟悉后感觉很不错。iBatis中所有的DAO方法都只传一个值对象,复杂查询当然也不例外。另外对常见的1:1,1:N关系的支持不如Hibernate。使用iBatis 2.0和1.0有较大区别,主要体现在配置文件上,iBatis 2.0新增了DAO框架,不需要Spring提供的DAO也能很方便地实现DAO模式。持久层使用了iBatis后,团队中以前乱七八糟的jdbc包装不见了,大家的编码风格统一了,可以集中精力进行业务组件的编写!
源文件下载 进入页面:http://ctguzhupan.go1.icpcn.com/ibatis/ibatis.html
参考文献:《ibatis 开发指南》
Ps:第一次写这东西,表达能力实在不怎么样!结合《ibatis 开发指南》会更容易明白!有不明白的地方也可以联系我,我将尽力帮助,有错误地方也请指正,谢谢!
总结:iBatis确实简单灵活,上手容易,代码很少,配置稍嫌复杂。动态SQL的确是个强点,熟悉后感觉很不错。iBatis中所有的DAO方法都只传一个值对象,复杂查询当然也不例外。另外对常见的1:1,1:N关系的支持不如Hibernate。使用iBatis 2.0和1.0有较大区别,主要体现在配置文件上,iBatis 2.0新增了DAO框架,不需要Spring提供的DAO也能很方便地实现DAO模式。持久层使用了iBatis后,团队中以前乱七八糟的jdbc包装不见了,大家的编码风格统一了,可以集中精力进行业务组件的编写!
源文件下载 进入页面:http://ctguzhupan.go1.icpcn.com/ibatis/ibatis.html
参考文献:《ibatis 开发指南》
Ps:第一次写这东西,表达能力实在不怎么样!结合《ibatis 开发指南》会更容易明白!有不明白的地方也可以联系我,我将尽力帮助,有错误地方也请指正,谢谢!