`
kobexing933
  • 浏览: 120342 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

第十二章 集成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

分享到:
评论

相关推荐

    JAVA WEB典型模块与项目实战大全.part2(第二卷)

    第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——Oracle数据库 第14章 AJAX技术JQuery框架的经典应用 第15章 在线文件上传和下载(Struts 2.X+FileUpload) 第16章 网上投票系统(Struts2.X+...

    JAVA WEB典型模块与项目实战大全.part3(第三卷)

    第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——Oracle数据库 第14章 AJAX技术JQuery框架的经典应用 第15章 在线文件上传和下载(Struts 2.X+FileUpload) 第16章 网上投票系统(Struts2.X+...

    JAVA WEB典型模块与项目实战大全.part4

    第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——Oracle数据库 第14章 AJAX技术JQuery框架的经典应用 第15章 在线文件上传和下载(Struts 2.X+FileUpload) 第16章 网上投票系统(Struts2.X+...

    JAVA WEB典型模块与项目实战大全.part1(第一卷)

    第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——Oracle数据库 第14章 AJAX技术JQuery框架的经典应用 第15章 在线文件上传和下载(Struts 2.X+FileUpload) 第16章 网上投票系统(Struts2.X+...

    跟我学spring3(8-13)1

    5. **第十二章:零配置** - **12.1 概述**:介绍了Spring 2.5引入的基于注解的配置,减少了XML配置的复杂性。 - **12.2 注解实现Bean依赖注入**:解释了如何使用@Component、@Service、@Repository和@Controller...

    跟我学spring

    【第十二章】零配置。Spring的目标之一是减少代码的配置量,从而提高开发效率。12.1节概述零配置,12.2节和12.3节分别介绍注解实现Bean依赖注入和注解实现Bean定义。 在学习Spring的过程中,读者会从基础到高级,...

    跟我学spring3(8-13)

    【第十二章】零配置: 1. **12.1 概述**:Spring 3引入了更多的注解支持,使得可以实现零XML配置,提高开发效率。 2. **12.2 注解实现Bean依赖注入**:通过@Component、@Autowired等注解,可以省去XML配置文件,直接...

    JAVA WEB典型模块与项目实战大全

    第12章 网络留言板(jsp+servlet+javabean)  12.1 网络留言板原理  12.2 添加留言  12.3 浏览留言  12.4 管理留言  12.5 使用dao模式网络留言板  12.6 小结  第13章 网络留言板续——oracle数据库  ...

    通向架构师的道路(第1-20天)

    (第十二天)之Axis2 Web Service(三) (第十三天)Axis2 Web Service安全初步 (第十四天)Axis2 Web Service安全之rampart (第十五天)IBM Websphere的安装与优化 (第十六天)IBM Websphere与IBM HttpServer的...

    Spring in Action(第2版)中文版

    第12章访问企业服务 12.1从jndi中获取对象 12.1.1使用传统的jndi 12.1.2注入jndi对象 12.1.3在spring2中注入jndi对象 12.2发送电子邮件 12.2.1配置邮件发送器 12.2.2构建电子邮件 12.3调度任务 12.3.1使用...

    Spring in Action(第二版 中文高清版).part2

    第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 ...

    Spring in Action(第二版 中文高清版).part1

    第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 ...

    struts2系列教程

    #### 十五、集成iBatis - **集成原理**:iBatis与Struts2集成的基本原理。 - **应用场景**:适合集成iBatis的情况及其优势。 #### 十六、集成jQuery - **16.1 什么是jQuery**:jQuery库的基本介绍。 - **16.2 ...

    struts2入门教程

    #### 十五、集成iBatis - **iBatis集成**:讨论如何使用iBatis作为持久层解决方案,并与Struts2进行集成。 #### 十六、集成jQuery - **jQuery简介**:简述jQuery库的基本功能和优势。 - **操作CSS**:演示如何使用...

    struts2的速成教程,充电的都来看了

    #### 十五、集成iBatis - **iBatis简介**:介绍iBatis(现称为MyBatis)的基本概念及特点。 - **Struts2与iBatis集成**:指导如何在Struts2项目中引入iBatis,实现数据持久化层的开发。 #### 十六、其他集成 - **...

    网络第一份struts2.0学习文档

    #### 十五、集成iBatis - **iBatis简介**: - iBatis(现已更名为MyBatis):一个支持普通SQL查询的持久层框架。 - **集成Struts2**: - 使用iBatis处理数据库交互。 #### 十六至十八章:实战项目介绍 - **...

Global site tag (gtag.js) - Google Analytics