iBatis是眾多OR Mapping工具中的一個。
OR Mapping產(chǎn)生源自于面向?qū)ο蟮挠嬎銠C語言(Object-Oriented Language,例如Java)和
關(guān)系型數(shù)據(jù)庫(Relationship Database)之間的矛盾,即面向?qū)ο蟮牟僮骱蚐QL語句之間的矛盾。
iBatis有Java版本和.NET兩個版本可供選擇。
以下以Java本本為例講解。
原理
iBatis中需要涉及到以下幾部分
1. Object 面向?qū)ο蟮母拍睿硎灸骋活惖膶嵗ㄏ聢D中的Hashtable,Java/.Net object,Primitive)。
2. Table 數(shù)據(jù)庫表,用來以關(guān)系化的方式存儲Object(下圖中的數(shù)據(jù)庫部分)。
3. Object到Table的映射信息,例如將哪個Object映射到哪個表,
Object的哪個屬性映射到表的哪個字段等(下圖中的SqlMap.xml)。
4. iBatis引擎(下圖中SqlMap config 和 SqlMap Statement兩部分之和)。
圖表如下
以Insert為例說明
第一步,SqlMap Statement根據(jù)SqlMap Config配置自己,配置信息包括數(shù)據(jù)庫信息,等內(nèi)容。
第二步,將Java Object傳遞給SqlMap Statement
第三步,SqlMap Statement根據(jù)當前傳入Java Object在SqlMap.xml 文件中找到對應(yīng)的配置信息
第四步,根據(jù)SqlMap.xml中的配置信息,自動生成 Insert Sql語句
第五部,針對當前配置的數(shù)據(jù)庫執(zhí)行第四步中生成的Sql語句,將數(shù)據(jù)插入到數(shù)據(jù)庫中
以Select為例說明:
第一步,同上
第二步,將包含部分字段(查詢條件)內(nèi)容的Java Object傳遞給SqlMap Statement
第三步,同上
第四步,根據(jù)SqlMap中的配置信息,生成Select Sql語句
第五部,執(zhí)行第四步中生成的Sql語句
第六步,根據(jù)SqlMap.xml 文件中的配置信息,將第五步中查詢出來的ResultSet抓變?yōu)閷?yīng)對象的列表,之后返回給調(diào)用端
具體使用
首先是一個SqlMap Config的配置文件,配置了數(shù)據(jù)庫等信息,例如:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig <sqlMapConfig> <!-- 數(shù)據(jù)庫等信息 --> <transactionManager type="JDBC" commitRequired="false"> <!-- SqlMap.sql OR 映射文件的位置 --> <sqlMap resource="com/mydomain/data/Account.xml"/> Java Object對象 package com.mydomain.domain; public class Account { private int id; public int getId() { public void setId(int id) { public String getFirstName() { public void setFirstName(String firstName) { public String getLastName() { public void setLastName(String lastName) { public String getEmailAddress() { public void setEmailAddress(String emailAddress) { } Account對應(yīng)到數(shù)據(jù)庫表的映射文件,即com/mydomain/data/Account.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap <sqlMap namespace="Account"> <!-- 對類型定義的別名 --> <!-- 數(shù)據(jù)庫中的字段名和Java Object中的屬性明的對應(yīng)關(guān)系 --> <!-- 查詢 SQL語句 --> <!-- 基于ID的查詢Sql語句 --> <!-- 更新SQL語句 --> <!-- 刪除SQL語句 --> </sqlMap> 使用代碼: 首先裝在配置文件: try { 各種方法的使用: 查詢列表,返回List sqlMapper.queryForList("selectAllAccounts"); (Account) sqlMapper.queryForObject("selectAccountById", id); sqlMapper.insert("insertAccount", account); sqlMapper.update("updateAccount", account); sqlMapper.delete("deleteAccount", id); 在Struts2環(huán)境中結(jié)合Springframework使用ibatis 在Struts2環(huán)境中結(jié)合Springframework使用ibatis 想要使用ibatis必須首先定義數(shù)據(jù)源,這里使用DBCP數(shù)據(jù)源。 DBCP是apache jakarta下面的一個opensouce 名字叫做Database Connection Pool 使用DBCP需要將以下兩個文件拷貝到WEB-INF/lib目錄下: commons-dbcp.jar commons-pool.jar 在Spring配置文件中可以使用Ioc的方式配置數(shù)據(jù)庫連接池(DBCP) 通常將數(shù)據(jù)庫鏈接信息放在database.properties文件中,該文件通常放在WEB-INF目錄下 文件內(nèi)容為: jdbc.driverClassName=com.mysql.jdbc.Driver 為了在spring配置文件中讀取這些信息需要如下配置: <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 配置數(shù)據(jù)庫鏈接池: <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 其中${}部分內(nèi)容引用了database.properties文件中的內(nèi)容。 配置ibatis 配置ibatis需要的sqlmap-config.xml和TodoVO.xml sqlmap-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig <sqlMapConfig> </sqlMapConfig> TodoVO.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap <sqlMap namespace="TodoVO"> <typeAlias alias="TodoVO" type="com.jpleasure.teamware.vo.TodoVO"/> <resultMap id="TodoVOResult" class="TodoVO"> <select id="selectAllTodoVOs" resultMap="TodoVOResult"> </sqlMap>
package com.jpleasure.teamware.dao; import java.sql.SQLException; import com.ibatis.sqlmap.client.SqlMapClient; public class TodoDao { public void setSqlMap(SqlMapClient sqlMap) { public List<TodoVO> listAll() { List todos = new ArrayList(); return todos; public TodoVO insert(TodoVO todo) { public TodoVO update(TodoVO todo) { public TodoVO delete(TodoVO todo) { 配置DAO <?xml version="1.0" encoding="UTF-8"?> <beans>
</beans> 使用DAO package com.jpleasure.teamware.logic; import java.util.List; import com.jpleasure.teamware.dao.TodoDao; public class TodoLogic { public void setTodoDao(TodoDao todoDao) { /**************************************** 由于使用了Spring配置的DBCP,所以其中的數(shù)據(jù)庫鏈接部分不需要再配置。
只需要配置使用的映射文件即可。 spring中配置ibatis <bean id="sqlMapClient" 使用Ibatis做數(shù)據(jù)庫訪問
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.hsqldb.jdbcDriver"/>
<property name="JDBC.ConnectionURL" value="jdbc:hsqldb:."/>
<property name="JDBC.Username" value="sa"/>
<property name="JDBC.Password" value="sa"/>
</dataSource>
</transactionManager>
</sqlMapConfig>
private String firstName;
private String lastName;
private String emailAddress;
return id;
}
this.id = id;
}
return firstName;
}
this.firstName = firstName;
}
return lastName;
}
this.lastName = lastName;
}
return emailAddress;
}
this.emailAddress = emailAddress;
}
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"
<typeAlias alias="Account" type="com.mydomain.domain.Account"/>
<resultMap id="AccountResult" class="Account">
<result property="id" column="ACC_ID"/>
<result property="firstName" column="ACC_FIRST_NAME"/>
<result property="lastName" column="ACC_LAST_NAME"/>
<result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>
<select id="selectAllAccounts" resultMap="AccountResult">
select * from ACCOUNT
</select>
<select id="selectAccountById" parameterClass="int" resultClass="Account">
select
ACC_ID as id,
ACC_FIRST_NAME as firstName,
ACC_LAST_NAME as lastName,
ACC_EMAIL as emailAddress
from ACCOUNT
where ACC_ID = #id#
</select>
<!-- 插入SQL語句 -->
<insert id="insertAccount" parameterClass="Account">
insert into ACCOUNT (
ACC_ID,
ACC_FIRST_NAME,
ACC_LAST_NAME,
ACC_EMAIL
values (
#id#, #firstName#, #lastName#, #emailAddress#
)
</insert>
<update id="updateAccount" parameterClass="Account">
update ACCOUNT set
ACC_FIRST_NAME = #firstName#,
ACC_LAST_NAME = #lastName#,
ACC_EMAIL = #emailAddress#
where
ACC_ID = #id#
</update>
<delete id="deleteAccountById" parameterClass="int">
delete from ACCOUNT where ACC_ID = #id#
</delete>
Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// Fail fast.
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
查詢對象
插入
更新
刪除
jdbc.url=jdbc:mysql://localhost:3306/teamware
jdbc.username=teamware
jdbc.password=teamware
<property name="locations">
<list>
<value>WEB-INF/database.properties</value>
</list>
</property>
</bean>
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMap resource="com/jpleasure/teamware/vo/TodoVO.xml" />
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<result property="startDate" column="start_date"/>
<result property="startTime" column="start_time"/>
<result property="endDate" column="end_date"/>
<result property="endTime" column="end_time"/>
<result property="status" column="status"/>
<result property="priority" column="priority"/>
<result property="category" column="category"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
</resultMap>
select * from todo
</select>
import java.util.ArrayList;
import java.util.List;
import com.jpleasure.teamware.vo.TodoVO;
private SqlMapClient sqlMap = null;
public SqlMapClient getSqlMap() {
return sqlMap;
}
this.sqlMap = sqlMap;
}
try {
todos = sqlMap.queryForList("selectAllTodoVOs");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return todo;
}
return todo;
}
return todo;
}
}
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<bean id="todo" class="com.jpleasure.teamware.action.TodoAction"
singleton="false">
<property name="todoLogic" ref="todoLogic"></property>
</bean>
<bean id="todoLogic"
class="com.jpleasure.teamware.logic.TodoLogic">
<property name="todoDao" ref="todoDao"></property>
</bean>
<bean id="todoDao" class="com.jpleasure.teamware.dao.TodoDao">
<property name="sqlMap" ref="sqlMapClient"></property>
</bean>
import com.jpleasure.teamware.vo.TodoVO;
/****************************************
* TodoDao
****************************************/
private TodoDao todoDao;
public TodoDao getTodoDao() {
return todoDao;
}
this.todoDao = todoDao;
}
* Logic Method
****************************************/
public List<TodoVO> listAll() {
List<TodoVO> todos = todoDao.listAll();
return todos;
}
public TodoVO insert(TodoVO todo) {
return todo;
}
public TodoVO update(TodoVO todo) {
return todo;
}
public TodoVO delete(TodoVO todo) {
return todo;
}
}
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="sqlmap-config.xml"/>
<property name="dataSource" ref="dataSource" />
</bean>
定義DAO
ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程