首页 > 代码库 > ibatis实战之基础环境搭建

ibatis实战之基础环境搭建

关于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="http://www.mamicode.com/com.mysql.jdbc.Driver" /> <property name="JDBC.ConnectionURL" value="http://www.mamicode.com/jdbc:mysql://localhost:3306/ibatis" /> <property name="JDBC.Username" value="http://www.mamicode.com/root" /> <property name="JDBC.Password" value="http://www.mamicode.com/root" /> <property name="Pool.MaximumActiveConnections" value="http://www.mamicode.com/10" /> <property name="Pool.MaximumIdleConnections" value="http://www.mamicode.com/5" /> <property name="Pool.MaximumCheckoutTime" value="http://www.mamicode.com/120000" /> <property name="Pool.TimeToWait" value="http://www.mamicode.com/500" /> <property name="Pool.PingQuery" value="http://www.mamicode.com/select 1 from ACCOUNT" /> <property name="Pool.PingEnabled" value="http://www.mamicode.com/false" /> <property name="Pool.PingConnectionsOlderThan" value="http://www.mamicode.com/1" /> <property name="Pool.PingConnectionsNotUsedFor" value="http://www.mamicode.com/1" /> </dataSource> </transactionManager> <sqlMap resource="com/itmyhome/User.xml" /> </sqlMapConfig>

ibatis配置文件各节点简单说明:

(1)Settings节点

參数描写叙述
cacheModelsEnabled是否启用 SqlMapClient 上的缓存机制。


建议设为"true"

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"命名空间。


在useStatementNamespaces="true"的情况下,
Statement调用需追加命名空间,如:
sqlMap.update("User.updateUser",user);
否则直接通过Statement名称调用就可以,如:
sqlMap.update("updateUser",user);
但请注意此时须要保证全部映射文件里,
Statement定义无重名

(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.DriverJDBC驱动.如: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"?

> <!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>

从上面的映射文件能够看出,通过<insert>、<delete>、<update>、

<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


ibatis实战之基础环境搭建