`

ibatis初学001

 
阅读更多

目录:

一、iBatis简介
二、iBatis基础操作演示
三、如何搭建Spring+iBatis集成开发环境
四、Spring+iBatis的CRUD数据操作实现
五、iBatis高级应用
六、Spring+iBatis方案优点

我们的目标是:能够熟练运用当前流行的java开源框架:iBatis,掌握iBatis与Spring框架的集成方式。




 DAO 模式就是在业务逻辑层和持久化存储层之间引入了新的抽象层。业务对象通过数据访问对象访问关系型数据库(数据源)。抽象层简化了应用程序代码增强了灵活性。试想一下哪天改变了数据源,比如更换为其他数据库厂商的产品,只需要修改数据访问对象,并且对业务对象的影响也是最小的。



iBatis简介(一)


Ø iBatis原是apache的一个开源项目,一个O/R Mapping解决方案。iBatis最大的特点就是小巧、灵活、上手快。iBatis是能满足你的要求又足够灵活且简单的持久化解决方案。
Ø2010iBatis项目由apache sofeware foundation 迁移到了google code,并且改名为MyBatis,从iBatisMyBatis,不只是名称上得变化,提供了更为强大的功能,使用上也有较大变化。
Ø与其他持久化解决方案比较。
lJDBC 存在的缺点:“代码重复”、“耦合”、“资源泄漏”、“错误捕获”、“脆弱的代码”。

采用JDBC实现DAO设计模式的缺点:


代码重复:正如 EmployeeDAOImpl 类列出的,代码重复是基于 JDBC 的传统数据库访问的主要问题。反复书写代码明显违反了基本的 OO 代码复用原则。对于项目开销、时间和消耗都有着明显的不利因素。


耦合DAO 代码非常紧密的和 JDBC 接口以及核心集合类型耦合在一起。这点可以从每个 DAO 类导入语句的数目体现。


资源泄漏:进入 EmployeeDAOImpl 类的设计,所有 DAO 方法都必须释放已获取的数据库资源的控制权,比如 connectionstatements 以及结果集。这样做是很危险的,因为一名没有经验的程序员可以很容易的绕开这些程序块。结果资源将流失,最终导致系统当机。


错误捕获JDBC 驱动通过抛出 SQLException 报告所有的错误情况。SQLException checked exception。因此开发者被迫处理它——即使无法从大部分异常中恢复,这样也就导致了混乱的代码。此外,从 SQLException 对象获取错误代码和消息是数据库供应商特定的,因此不可能编写灵活的 DAO 错误消息代码。


脆弱的代码:在基于 JDBC DAO 中,为 statement 对象绑定变量的设置,以及获取数据使用的结果集 getter 方法是频繁用到的两个任务。如果 SQL 语句中的列数改变了,或者列的位置改变了,代码将不得不再经过严格的反复修改、测试然后部署。

lHibernate 提供了全面的数据库封装机制的“全自动化”ORM 实现,程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate提供的方法完成持久层操作, SQL的自动生成和执行。
ØiBatis的实现原理:(非常重要)
iBatis使用简单的XML描述文件,将Java BeanMap和基本数据类型映射成JDBC
PreparedStatement的输入参数和ResultSet结果集,实现Sql语句的动态拼接,及ResultSet结果
集到Java对象的自动转换。

iBatis基本操作演示
ØiBatis基础代码
liBatis实例配置( iBaits总配置文件 SqlMapConfig.xml 文件 
l实体Java Bean  UserVO.java文件
l实体映射文件 USER.xml文件
ØiBatis基础语义
lXmlSqlMapClientBuilder 其作用是根据配置文件创建SqlMapClient实例。
lSqlMapClient(非常重要)
  SqlMapClientibatis的核心组件,提供数据操作的基础平台。SqlMapClient可以通过SqlMapClientBuilder创建。

ØSqlMapClient基本操作
l数据写入操作(insert, update, delete)
  sqlMapClient. insert ("USER.insert", user) ; 
l数据查询 (select)
  sqlMapClient. queryForObject ("USER.getUserInfoById", userid);
l执行批量查询 (select)
  sqlMapClient. queryForList ("EMP.getUserByCond", params);

定义一个VO对象
package com.anduo.ssi.domain;

public class UserVO {
    /**
     * This field was generated by Apache iBATIS ibator.
     * This field corresponds to the database column user.userid
     *
     * @ibatorgenerated Tue Mar 27 19:50:47 CST 2012
     */
    private Integer userid;

    /**
     * This field was generated by Apache iBATIS ibator.
     * This field corresponds to the database column user.username
     *
     * @ibatorgenerated Tue Mar 27 19:50:47 CST 2012
     */
    private String username;
    
    /**
     * <p>Discription:[构造器方法描述]</p>
     * @coustructor 方法.
     */
    public UserVO()
    {
    }
    
    public UserVO(String username)
    {
        this.username = username;
    }
    
    /**
     * This method was generated by Apache iBATIS ibator.
     * This method returns the value of the database column user.userid
     *
     * @return the value of user.userid
     *
     * @ibatorgenerated Tue Mar 27 19:50:47 CST 2012
     */
    public Integer getUserid() {
        return userid;
    }

    /**
     * This method was generated by Apache iBATIS ibator.
     * This method sets the value of the database column user.userid
     *
     * @param userid the value for user.userid
     *
     * @ibatorgenerated Tue Mar 27 19:50:47 CST 2012
     */
    public void setUserid(Integer userid) {
        this.userid = userid;
    }

    /**
     * This method was generated by Apache iBATIS ibator.
     * This method returns the value of the database column user.username
     *
     * @return the value of user.username
     *
     * @ibatorgenerated Tue Mar 27 19:50:47 CST 2012
     */
    public String getUsername() {
        return username;
    }

    /**
     * This method was generated by Apache iBATIS ibator.
     * This method sets the value of the database column user.username
     *
     * @param username the value for user.username
     *
     * @ibatorgenerated Tue Mar 27 19:50:47 CST 2012
     */
    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }
}
 
编写映射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="USER">
	<typeAlias alias="user" type="com.anduo.ssi.domain.UserVO" />
	<resultMap id="user" class="com.anduo.ssi.domain.UserVO">
		<!-- WARNING - This element is automatically generated by Apache iBATIS 
			ibator, do not modify. This element was generated on Tue Mar 27 19:50:47 
			CST 2012. -->
		<result column="userid" property="userid" jdbcType="INTEGER" />
		<result column="username" property="username" jdbcType="VARCHAR" />
	</resultMap>

	<!-- 新增 -->
	<insert id="insert" parameterClass="user">
		INSERT INTO USER(USERNAME) VALUES(#username#)
	</insert>

	<!-- 删除 -->
	<delete id="delete" parameterClass="user">
		DELETE FROM USER T
		WHERE T.USERID = #userid#
	</delete>

	<!-- 更新 -->
	<update id="update" parameterClass="user">
		UPDATE USER
		<dynamic prepend="SET">
			<isNotNull prepend="," property="username">
				USERNAME=#USERNAME#
			</isNotNull>
			<isNotNull prepend="," property="password">
				PASSWORD=#PASSWORD#
			</isNotNull>
		</dynamic>
		WHERE ID=#ID#
	</update>

	<!-- 查询全部 -->
	<select id="selectAllUserInfo" resultClass="user">
		SELECT T.USERID,T.USERNAME
		FROM USER T
	</select>

	<!-- 根据ID查询 -->
	<select id="selectUserInfoById" resultClass="user">
		SELECT T.USERID,T.USERNAME
		FROM USER T
		WHERE T.USERID=#userid#
	</select>

	<!-- 动态查询 -->
	<select id="dynamicSelectUserInfo" resultClass="user">
		SELECT T.USERID,T.USERNAME
		FROM USER T
		<dynamic prepend="WHERE">
			<isNotEmpty prepend="AND" property="userid">
				T.USERID = #userid#
			</isNotEmpty>
			<isNotEmpty prepend="AND" property="username">
				T.USERNAME LIKE '%$username$%'
			</isNotEmpty>
		</dynamic>
	</select>
</sqlMap>
 
编写BaseDAO

package com.anduo.ssi.dao;

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

import org.springframework.dao.DataAccessException;
import org.springframework.orm.ibatis.SqlMapClientCallback;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.ibatis.sqlmap.client.SqlMapExecutor;
import com.anduo.ssi.common.exception.BaseDataAccessException;

public abstract class BaseDAO<E> extends SqlMapClientDaoSupport implements DAO<E>{
    
    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param parameter
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    @SuppressWarnings("unchecked")
	public List<E> getDataList(String statement, Object parameter) throws BaseDataAccessException {
    	List<E> result = null;
    	try{
    		result = getSqlMapClientTemplate().queryForList(statement, parameter);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	}  	
        return result;
    }
    
    
    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param parameter
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    @SuppressWarnings("unchecked")
    public E getData(String statement, Object parameter) throws BaseDataAccessException {
    	E result = null;
    	try{
    		result = (E) getSqlMapClientTemplate().queryForObject(statement, parameter);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	} 
        return result;
    }
    
    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param parameter
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    public int getDataCount(String statement, Object parameter) throws BaseDataAccessException {
    	Integer  result= null;
    	try{
    		result = (Integer) getSqlMapClientTemplate().queryForObject(statement, parameter);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	}   	
        return result;
    }

    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param data
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    public int updateData(String statement, E data) throws BaseDataAccessException {
    	Integer  result= null;
    	try{
    		result = getSqlMapClientTemplate().update(statement, data);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	}     	
        return result;
    }

    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param map
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    public int updateData(String statement, Map<String, Object> map) throws BaseDataAccessException {
    	Integer  result= null;
    	try{
    		result = getSqlMapClientTemplate().update(statement, map);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	}   
        return result;
    }

    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param data
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    public Object insertData(String statement, E data) throws BaseDataAccessException {
    	Object result = null;
    	try{
    		result = getSqlMapClientTemplate().insert(statement, data);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	} 
    	return result;
    }
    
    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param map
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    public Object insertData(String statement, Map<String, Object> map) throws BaseDataAccessException {
    	Object result = null;
    	try{
    		result = getSqlMapClientTemplate().update(statement, map);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	} 
    	return result;
    }
    
    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param data
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    public int deleteDate(String statement, String data) throws BaseDataAccessException{
    	Integer result = null;
    	try{
    		result = getSqlMapClientTemplate().delete(statement, data);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	} 
    	return result;

    }
    
    /**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param map
     * @return
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    public int deleteDate(String statement, Map<String, Object> map) throws BaseDataAccessException{
    	Integer result = null;
    	try{
    		result = getSqlMapClientTemplate().delete(statement, map);
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	} 
    	return result;
    }
        
	/**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param map
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    
	public void executeBatch(final String statement, final Map<String, E> map) throws BaseDataAccessException {
    	try{
	        getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
	            public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {              
	            	executor.startBatch();
	                for (Object o : map.keySet()) {
	                    executor.update(statement, map.get(o));
	                }
	                executor.executeBatch();              
	                return null;
	            }
	        });
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	}        
    }
    
	/**
     * <p>Discription:[方法功能中文描述]</p>
     * @param statement
     * @param list
     * @throws BaseDataAccessException
     * @author:[安多]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    
    
	public void executeBatch(final String statement, final List<?> list) throws BaseDataAccessException {
    	try{
	        getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
	            public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
	                executor.startBatch();
	                for (Object o : list) {
	                    executor.update(statement, o);
	                }
	                executor.executeBatch();
	                return null;
	            }
	        });
    	}catch(DataAccessException e){
    		throw new BaseDataAccessException(e);
    	}  
    }

}
 
编写UserDAO
package com.anduo.ssi.dao.impl;

import com.anduo.ssi.dao.BaseDAO;
import com.anduo.ssi.dao.UserDAO;
import com.anduo.ssi.domain.UserVO;

/** 
 * <p>Description: [描述该类概要功能介绍]</p>
 * @author
 * @version $Revision$ 
 */
public class UserDAOImpl extends BaseDAO<UserVO> implements UserDAO
{
}
 
编写测试用例 略。。。


 

 
















 

  • 大小: 54.3 KB
分享到:
评论

相关推荐

    iBATIS初学经验.doc

    本文将基于作者的初学经验,分享iBATIS的一些核心概念、使用技巧以及学习过程中的常见问题。 首先,理解iBATIS的基本理念至关重要。它是一个基于Java的数据库访问框架,旨在解决对象关系映射(ORM)的问题,使得...

    iBATIS初学者

    iBATIS 初学者资料

    ibatis初学者学习例程,一看就懂!

    **Ibatis初学者学习例程详解** Ibatis,作为一个经典的Java持久层框架,因其轻量级、易上手的特点,深受开发者的喜爱。本例程是为初学者设计的,旨在帮助快速理解并掌握Ibatis的基本操作和核心概念。下面我们将深入...

    ibatis 初学Demo

    这个例子是本人在初学ibatis 写的,对初学者来说是一个很好的例子,一看就明白, 如果不明白的地方请联系我,加入群:73624154

    IBatis结合Struts开发初学文档及实例

    本文档集是为初学者设计的,旨在帮助他们了解如何将流行的Java框架IBatis与Struts进行整合,以构建一个数据库驱动的Web应用。"IBatis结合Struts开发初学文档及实例"包含了四个基础示例,它们提供了逐步的学习路径,...

    webwork+spring+ibatis很适合初学者的实例

    WebWork、Spring 和 iBATIS 是三个非常重要的Java Web开发框架,它们的组合为初学者提供了丰富的学习资源。WebWork 是一个MVC(Model-View-Controller)框架,Spring 是一个全面的后端开发框架,而 iBATIS 是一个...

    ibatis java初学例子

    对初学者非常有用: 本程序是一个简单ibatis(版本ibatis2.3.4.726)例子, 里面包含单表增,删,改,查。 SimpleExample.java 包含程序与测试. 我用到是sqlServer(其他的数据库,只需更改sqlMapConfig.xml里面的...

    Ibatis入门例子,Ibatis教程

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注...因此,无论你是初学者还是有经验的开发者,掌握Ibatis都是提升自己技能的好选择。

    ibatis 相关使用文档及安装包ibatis 相关使用文档及安装包

    《iBATIS-SqlMaps-2-Tutorial.pdf》很可能是iBATIS SQL映射器的教程,对于初学者来说,这是快速上手的好资料。它可能涵盖了从安装iBATIS到创建第一个SQL Map,再到执行查询和更新操作的全过程。 《iBATIS_DBL-2.1.5...

    ibatis api 帮助文档+IBATIS 开发文档

    总的来说,IBATIS API和开发文档是学习和使用IBATIS不可或缺的资源,它们涵盖了IBATIS的所有关键特性和用法,无论你是初学者还是有经验的开发者,都能从中受益匪浅。通过深入理解和实践,可以充分利用IBATIS的灵活性...

    Ibatis例子,很适合初学者

    对于初学者来说,掌握Ibatis的关键在于理解其核心概念和工作流程。首先,Ibatis的核心是SQL Map配置文件,其中包含了SQL语句和参数映射。SQL Map文件通常以XML格式存在,每个SQL语句被定义为一个元素,可以是SELECT...

    C# IBatis IBatis基础 完整项目

    【描述】中提到的是一个基于C#的IBatis学习项目,适用于初学者。IBatis是一个流行的数据访问层框架,它允许开发者将SQL语句与应用程序代码分离,提高了代码的可维护性和灵活性。在.NET环境中,IBatis为C#开发者提供...

    IBATIS_IN_ACTION

    《IBATIS_IN_ACTION》是一本深度探讨iBATIS框架应用与实践的专业书籍,由Clinton Begin、Brandon Goodin和Larry Meadors...无论你是初学者还是有经验的开发者,都能从中获得有价值的见解和启示,提升自己的技能水平。

    ibatis小例子Demo

    这个"ibatis小例子Demo"是为了帮助初学者快速理解和掌握Ibatis的核心功能和基本用法。 Ibatis的主要特点包括: 1. **XML配置文件**:Ibatis通过XML配置文件来定义SQL语句、参数映射和结果映射,使得SQL与Java代码...

    ibatis

    3. **iBATIS-SqlMaps-2-Tutorial_cn.pdf**:这是iBATIS SQL Maps 2的中文教程,可能包含一系列逐步的教学章节,指导初学者从零开始学习iBATIS,包括安装环境、创建第一个SQL Map、处理结果集、使用动态SQL以及处理...

    IBatis .NET框架实例

    本文将深入探讨如何在C# .NET环境中使用IBatis进行数据库操作,这对于初学者来说是一份宝贵的资源。 **一、IBatis .NET简介** IBatis(现在称为MyBatis)是一个轻量级的持久层框架,它允许开发者将SQL语句直接嵌入...

    iBatis文档

    iBatis 是一款开源的Java持久层框架,它允许开发者将SQL语句直接映射到Java对象,从而简化了数据库访问的...无论是初学者还是有经验的开发者,都应该深入阅读并理解这些文档,以便在实际项目中充分利用iBatis的优势。

    01_传智播客ibatis教程_准备ibatis环境

    这通常意味着内容深入浅出,易于理解,对于初学者或希望提升iBatis技能的开发者来说极具价值。 【标签】"ibatis"直接指出了本教程的核心主题,即iBatis。iBatis是一个优秀的SQL映射框架,它允许开发者将SQL语句与...

    Ibatis 练习Demo和笔记

    本练习Demo和笔记旨在帮助初学者快速掌握Ibatis的基本用法和核心概念。 【Ibatis 的主要组件】 1. **SqlSessionFactoryBuilder**:构建SqlSessionFactory的工具类,通常在应用启动时创建一次。 2. **...

    ibatis 开发指南 2004

    这本指南对于初学者和有经验的开发者来说都是宝贵的资源,它帮助读者理解iBatis的工作原理,掌握其核心特性和最佳实践,从而更高效地进行数据库操作。通过阅读《iBatis 开发指南》,开发者可以更好地掌握Java世界的...

Global site tag (gtag.js) - Google Analytics