第十二章 集成iBatis

第十二章 集成iBatis

iBatis是众多OR Mapping工具中的一个。

OR Mapping产生源自于面向对象的计算机语言(Object-Oriented Language,例如Java)和

关系型数据库(Relationship Database)之间的矛盾,即面向对象的操作和SQL语句之间的矛盾。

iBatis有Java版本和.NET两个版本可供选择。

以下以Java本本为例讲解。

原理

iBatis中需要涉及到以下几部分

1.Object 面向对象的概念,表示某一类的实例(下图中的Hashtable,Java/.Net object,Primitive)。

2. Table 数据库表,用来以关系化的方式存储Object(下图中的数据库部分)。

3. Object到Table的映射信息,例如将哪个Object映射到哪个表,

Object的哪个属性映射到表的哪个字段等(下图中的SqlMap.xml)。

4. iBatis引擎(下图中SqlMap config 和 SqlMap Statement两部分之和)。

图表如下

以Insert为例说明

第一步,SqlMap Statement根据SqlMap Config配置自己,配置信息包括数据库信息,等内容。

第二步,将Java Object传递给SqlMap Statement

第三步,SqlMap Statement根据当前传入Java Object在SqlMap.xml 文件中找到对应的配置信息

第四步,根据SqlMap.xml中的配置信息,自动生成 Insert Sql语句

第五部,针对当前配置的数据库执行第四步中生成的Sql语句,将数据插入到数据库中

以Select为例说明:

第一步,同上

第二步,将包含部分字段(查询条件)内容的Java Object传递给SqlMap Statement

第三步,同上

第四步,根据SqlMap中的配置信息,生成Select Sql语句

第五部,执行第四步中生成的Sql语句

第六步,根据SqlMap.xml 文件中的配置信息,将第五步中查询出来的ResultSet抓变为对应对象的列表,之后返回给调用端

具体使用

首先是一个SqlMap Config的配置文件,配置了数据库等信息,例如:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

<!--数据库等信息 -->

<transactionManager type="JDBC" commitRequired="false">
<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>

<!--SqlMap.sqlOR 映射文件的位置-->

<sqlMap resource="com/mydomain/data/Account.xml"/>
</sqlMapConfig>

Java Object对象

package com.mydomain.domain;

public class Account {

private int id;
private String firstName;
private String lastName;
private String emailAddress;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public String getEmailAddress() {
return emailAddress;
}

public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}

}

Account对应到数据库表的映射文件,即com/mydomain/data/Account.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Account">

<!-- 对类型定义的别名 -->
<typeAlias alias="Account" type="com.mydomain.domain.Account"/>

<!-- 数据库中的字段名和Java Object中的属性明的对应关系 -->
<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>

<!-- 查询 SQL语句 -->
<select id="selectAllAccounts" resultMap="AccountResult">
select * from ACCOUNT
</select>

<!-- 基于ID的查询Sql语句 -->
<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>

<!-- 更新SQL语句 -->
<update id="updateAccount" parameterClass="Account">
update ACCOUNT set
ACC_FIRST_NAME = #firstName#,
ACC_LAST_NAME = #lastName#,
ACC_EMAIL = #emailAddress#
where
ACC_ID = #id#
</update>

<!-- 删除SQL语句 -->
<delete id="deleteAccountById" parameterClass="int">
delete from ACCOUNT where ACC_ID = #id#
</delete>

</sqlMap>

使用代码:

首先装在配置文件:

try {
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);
}

各种方法的使用:

查询列表,返回List

sqlMapper.queryForList("selectAllAccounts");
查询对象

(Account) sqlMapper.queryForObject("selectAccountById", id);
插入

sqlMapper.insert("insertAccount", account);
更新

sqlMapper.update("updateAccount", account);
删除

sqlMapper.delete("deleteAccount", id);

在Struts2环境中结合Springframework使用ibatis

在Struts2环境中结合Springframework使用ibatis

想要使用ibatis必须首先定义数据源,这里使用DBCP数据源。

DBCP是apache jakarta下面的一个opensouce 名字叫做Database Connection Pool

使用DBCP需要将以下两个文件拷贝到WEB-INF/lib目录下:

commons-dbcp.jar

commons-pool.jar


在Spring配置文件中可以使用Ioc的方式配置数据库连接池(DBCP)


通常将数据库链接信息放在database.properties文件中,该文件通常放在WEB-INF目录下

文件内容为:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/teamware
jdbc.username=teamware
jdbc.password=teamware


为了在spring配置文件中读取这些信息需要如下配置:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>WEB-INF/database.properties</value>
</list>
</property>
</bean>

配置数据库链接池:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<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>

其中${}部分内容引用了database.properties文件中的内容。

配置ibatis

配置ibatis需要的sqlmap-config.xml和TodoVO.xml

sqlmap-config.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
<sqlMap resource="com/jpleasure/teamware/vo/TodoVO.xml" />

</sqlMapConfig>

TodoVO.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="TodoVO">

<typeAlias alias="TodoVO" type="com.jpleasure.teamware.vo.TodoVO"/>

<resultMap id="TodoVOResult" class="TodoVO">
<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 id="selectAllTodoVOs" resultMap="TodoVOResult">
select * from todo
</select>

</sqlMap>

package com.jpleasure.teamware.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.jpleasure.teamware.vo.TodoVO;

public class TodoDao {
private SqlMapClient sqlMap = null;

public SqlMapClient getSqlMap() {
return sqlMap;
}

public void setSqlMap(SqlMapClient sqlMap) {
this.sqlMap = sqlMap;
}

public List<TodoVO> listAll() {

List todos = new ArrayList();
try {
todos = sqlMap.queryForList("selectAllTodoVOs");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return todos;
}

public TodoVO insert(TodoVO todo) {
return todo;
}

public TodoVO update(TodoVO todo) {
return todo;
}

public TodoVO delete(TodoVO todo) {
return todo;
}
}

配置DAO

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

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

</beans>

使用DAO

package com.jpleasure.teamware.logic;

import java.util.List;

import com.jpleasure.teamware.dao.TodoDao;
import com.jpleasure.teamware.vo.TodoVO;

public class TodoLogic {

/****************************************
* TodoDao
****************************************/


private TodoDao todoDao;

public TodoDao getTodoDao() {
return todoDao;
}

public void setTodoDao(TodoDao 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;
}
}

由于使用了Spring配置的DBCP,所以其中的数据库链接部分不需要再配置。

只需要配置使用的映射文件即可。

spring中配置ibatis

<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="sqlmap-config.xml"/>
<property name="dataSource" ref="dataSource" />
</bean>

使用Ibatis做数据库访问
定义DAO

你可能感兴趣的:(spring,sql,bean,ibatis,jdbc)