- 浏览: 144408 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (129)
- framework (18)
- Java (25)
- web2.0 (7)
- Oracle (23)
- 框架师 (20)
- design pattern (5)
- j2ee (6)
- 日常问题收集 (51)
- linux (12)
- Oralce优化 (4)
- life (3)
- sqlplus (1)
- sql (2)
- C# (4)
- mysql (9)
- 拿来主义 (12)
- 标签 (0)
- ThinkPHP (1)
- python (1)
- mybatis (2)
- html5 (1)
- jquery (2)
- hadoop (3)
- git (1)
- struts2 (1)
- shiro (1)
- struts (1)
最新评论
-
xiao88xian:
...
jQuery常用经典技巧
目录:
一、iBatis简介
二、iBatis基础操作演示
三、如何搭建Spring+iBatis集成开发环境
四、Spring+iBatis的CRUD数据操作实现
五、iBatis高级应用
六、Spring+iBatis方案优点
我们的目标是:能够熟练运用当前流行的java开源框架:iBatis,掌握iBatis与Spring框架的集成方式。
DAO 模式就是在业务逻辑层和持久化存储层之间引入了新的抽象层。业务对象通过数据访问对象访问关系型数据库(数据源)。抽象层简化了应用程序代码增强了灵活性。试想一下哪天改变了数据源,比如更换为其他数据库厂商的产品,只需要修改数据访问对象,并且对业务对象的影响也是最小的。
iBatis简介(一)
采用JDBC实现DAO设计模式的缺点:
代码重复:正如 EmployeeDAOImpl 类列出的,代码重复是基于 JDBC 的传统数据库访问的主要问题。反复书写代码明显违反了基本的 OO 代码复用原则。对于项目开销、时间和消耗都有着明显的不利因素。
耦合:DAO 代码非常紧密的和 JDBC 接口以及核心集合类型耦合在一起。这点可以从每个 DAO 类导入语句的数目体现。
资源泄漏:进入 EmployeeDAOImpl 类的设计,所有 DAO 方法都必须释放已获取的数据库资源的控制权,比如 connection、statements 以及结果集。这样做是很危险的,因为一名没有经验的程序员可以很容易的绕开这些程序块。结果资源将流失,最终导致系统当机。
错误捕获:JDBC 驱动通过抛出 SQLException 报告所有的错误情况。SQLException 是 checked exception。因此开发者被迫处理它——即使无法从大部分异常中恢复,这样也就导致了混乱的代码。此外,从 SQLException 对象获取错误代码和消息是数据库供应商特定的,因此不可能编写灵活的 DAO 错误消息代码。
脆弱的代码:在基于 JDBC 的 DAO 中,为 statement 对象绑定变量的设置,以及获取数据使用的结果集 getter 方法是频繁用到的两个任务。如果 SQL 语句中的列数改变了,或者列的位置改变了,代码将不得不再经过严格的反复修改、测试然后部署。
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 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>
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); } } }
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 { }
发表评论
-
MyBatis延迟加载
2013-05-26 20:15 848当你要使用one to one,many to one 就 ... -
mybatis 自身关联 映射
2013-05-22 14:48 3257使用mybatis的时候遇到关联问题。 可以参考如下 ... -
ThinkPHP学习笔记
2013-05-11 23:09 836from:http://www.thinkphp.cn/in ... -
解决subclipse报错:svn: Can't open file 'D:\project\Xxx.java.svn-base': 系统找不到指定的文件
2013-03-23 16:49 1957环境为:XP, eclipse, subclipse。 我想 ... -
hibernate4+spring3.1整合常见问题解决方法
2013-03-21 19:21 814由于目前网上很少有关于hibernate4+spring3. ... -
解决maven仓库中找不到ojdbc驱动的问题
2013-02-21 16:51 890maven仓库中的ojdbc下载需要oracle的官方授权, ... -
Ant-Ivy使用
2013-02-21 12:27 1077转至:http://blog.csdn.net/leon70 ... -
ibatis(2)关于配置文件的书写
2012-04-06 13:29 1354最近做了些ibatis 的练习,以及spring对ibatis ... -
spring-ibatis-ext-plugin.1.0.0 扩展ibaits原生SQL(转载)
2012-04-01 16:25 1029转载至http://download.csdn.net/ ... -
spring2.5+hibernate2.3整合 annotation
2011-12-31 21:48 939晚上花了点时间写了个spring+hibernate的整合 ... -
Hibernate学习总结001-hibernate概述
2011-10-06 21:35 838说到hiberna ... -
Spring-AOP底层原理-JDK动态代理---转载
2011-10-07 19:29 1657原文http://blog.zdnet.com.cn/html ... -
struts2_ognl表达式
2011-12-27 09:07 736OGNL是Object Graphic Navigati ... -
文件上传 Struts2 fileupload
2011-12-25 22:17 1496struts2文件上传下载非常的简单。 给我们提供了非 ... -
Action中result的各种转发类型——struts2_003
2012-03-31 14:25 1190<action name="hellow ... -
Action配置中的各项默认值——struts2_002
2011-12-23 12:36 1043<package name="it ... -
Action名称的搜索顺序——struts2_001
2011-12-23 12:33 7641.获得请求路径的URI,例如url是:http://se ...
相关推荐
本文将基于作者的初学经验,分享iBATIS的一些核心概念、使用技巧以及学习过程中的常见问题。 首先,理解iBATIS的基本理念至关重要。它是一个基于Java的数据库访问框架,旨在解决对象关系映射(ORM)的问题,使得...
iBATIS 初学者资料
**Ibatis初学者学习例程详解** Ibatis,作为一个经典的Java持久层框架,因其轻量级、易上手的特点,深受开发者的喜爱。本例程是为初学者设计的,旨在帮助快速理解并掌握Ibatis的基本操作和核心概念。下面我们将深入...
这个例子是本人在初学ibatis 写的,对初学者来说是一个很好的例子,一看就明白, 如果不明白的地方请联系我,加入群:73624154
本文档集是为初学者设计的,旨在帮助他们了解如何将流行的Java框架IBatis与Struts进行整合,以构建一个数据库驱动的Web应用。"IBatis结合Struts开发初学文档及实例"包含了四个基础示例,它们提供了逐步的学习路径,...
WebWork、Spring 和 iBATIS 是三个非常重要的Java Web开发框架,它们的组合为初学者提供了丰富的学习资源。WebWork 是一个MVC(Model-View-Controller)框架,Spring 是一个全面的后端开发框架,而 iBATIS 是一个...
对初学者非常有用: 本程序是一个简单ibatis(版本ibatis2.3.4.726)例子, 里面包含单表增,删,改,查。 SimpleExample.java 包含程序与测试. 我用到是sqlServer(其他的数据库,只需更改sqlMapConfig.xml里面的...
Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注...因此,无论你是初学者还是有经验的开发者,掌握Ibatis都是提升自己技能的好选择。
总的来说,IBATIS API和开发文档是学习和使用IBATIS不可或缺的资源,它们涵盖了IBATIS的所有关键特性和用法,无论你是初学者还是有经验的开发者,都能从中受益匪浅。通过深入理解和实践,可以充分利用IBATIS的灵活性...
对于初学者来说,掌握Ibatis的关键在于理解其核心概念和工作流程。首先,Ibatis的核心是SQL Map配置文件,其中包含了SQL语句和参数映射。SQL Map文件通常以XML格式存在,每个SQL语句被定义为一个元素,可以是SELECT...
【描述】中提到的是一个基于C#的IBatis学习项目,适用于初学者。IBatis是一个流行的数据访问层框架,它允许开发者将SQL语句与应用程序代码分离,提高了代码的可维护性和灵活性。在.NET环境中,IBatis为C#开发者提供...
《IBATIS_IN_ACTION》是一本深度探讨iBATIS框架应用与实践的专业书籍,由Clinton Begin、Brandon Goodin和Larry Meadors...无论你是初学者还是有经验的开发者,都能从中获得有价值的见解和启示,提升自己的技能水平。
这个"ibatis小例子Demo"是为了帮助初学者快速理解和掌握Ibatis的核心功能和基本用法。 Ibatis的主要特点包括: 1. **XML配置文件**:Ibatis通过XML配置文件来定义SQL语句、参数映射和结果映射,使得SQL与Java代码...
《iBATIS-SqlMaps-2-Tutorial.pdf》很可能是iBATIS SQL映射器的教程,对于初学者来说,这是快速上手的好资料。它可能涵盖了从安装iBATIS到创建第一个SQL Map,再到执行查询和更新操作的全过程。 《iBATIS_DBL-2.1.5...
3. **iBATIS-SqlMaps-2-Tutorial_cn.pdf**:这是iBATIS SQL Maps 2的中文教程,可能包含一系列逐步的教学章节,指导初学者从零开始学习iBATIS,包括安装环境、创建第一个SQL Map、处理结果集、使用动态SQL以及处理...
本文将深入探讨如何在C# .NET环境中使用IBatis进行数据库操作,这对于初学者来说是一份宝贵的资源。 **一、IBatis .NET简介** IBatis(现在称为MyBatis)是一个轻量级的持久层框架,它允许开发者将SQL语句直接嵌入...
iBatis 是一款开源的Java持久层框架,它允许开发者将SQL语句直接映射到Java对象,从而简化了数据库访问的...无论是初学者还是有经验的开发者,都应该深入阅读并理解这些文档,以便在实际项目中充分利用iBatis的优势。
这通常意味着内容深入浅出,易于理解,对于初学者或希望提升iBatis技能的开发者来说极具价值。 【标签】"ibatis"直接指出了本教程的核心主题,即iBatis。iBatis是一个优秀的SQL映射框架,它允许开发者将SQL语句与...
本练习Demo和笔记旨在帮助初学者快速掌握Ibatis的基本用法和核心概念。 【Ibatis 的主要组件】 1. **SqlSessionFactoryBuilder**:构建SqlSessionFactory的工具类,通常在应用启动时创建一次。 2. **...
这本指南对于初学者和有经验的开发者来说都是宝贵的资源,它帮助读者理解iBatis的工作原理,掌握其核心特性和最佳实践,从而更高效地进行数据库操作。通过阅读《iBatis 开发指南》,开发者可以更好地掌握Java世界的...