`
xingkaistart
  • 浏览: 40078 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

将Ibatis的Connection改为长连接,并且封装

阅读更多
    看到这个主题 很多人会怀疑,Ibatis已经为我们做了很多事情,例如连接池管理、获取连接、增、删、改、查等操作,
    为什么还需要通过Ibatis获取JDBC连接做连接保持呢(长连接)?
我的解释是有很多操作需要在同一个数据源连接下完成。如:oracle的临时表操作。
    熟悉oracle的人都不陌生关于oracle的内部临时表,分为2种,1:事务级。2:会话级。而我在一次项目开发(老存报表储过程进行改装成java逻辑)中就遇到这样,而又没有足够的时间去重写这样的业务逻辑。于是项目经理要求将逻辑平移到java项目中。
    而就是原先的操作使用到了oracle的会话级临时表,因此,使用Ibatis的插入、更改、删除临时表后,在执行下一次操作时,无法查询到临时表的数据。
   这个原因就是 会话级的临时表在作怪,而要解决这样原因只能采用JDBC的Connection来完成整个操作。
    于是,我想到了Ibatis已经封装好的属性和方法,为什么我不调用封装呢。
具体的封装方式如下:

首先:通过Ibatis获取指定Id的SQL语句
/**
	 * 获取SQL
	 * ibatais根据sqlMap的Id获取sql语句
	 * @param sqlId 是xml文件配置的ID
	 * @return sql语句  以“$”注入的会自动转换,“#”不会
	 */
	public static String getSql(SqlMapClientImpl sqlclientImpl,String sqlId,Object params){
		
		String sqlStr = "";
		/**获取隐身对象*/
		MappedStatement stmt = sqlclientImpl.getMappedStatement(sqlId); 
		Sql sql = stmt.getSql();
		/**获取规则*/
		SessionScope sessionScope = new SessionScope();   
		sessionScope.incrementRequestStackDepth();   
		StatementScope statementScope = new StatementScope(sessionScope);   
		stmt.initRequest(statementScope);   
		/**获取sql映射对象*/
		sqlStr = sql.getSql(statementScope, params);
		
		log.debug("sqlMap:"+sqlId);
		log.debug("sql:"+sqlStr);
		
		return sqlStr;
	}



其次:将请求参数通过Java反射方式封装起来。
	/**
	 *  预编译封装对象
	 * @param sqlmap
	 * @param ps
	 * @param sqlId
	 * @param params
	 * @return 绘制PreparedStatement
	 */
	public static PreparedStatement getSqlParameterMap(SqlMapClientImpl sqlmap,PreparedStatement ps,String sqlId,Object params) {
		
		/**获取ibatis参数*/
		ParameterMapping[]paramMappSet = IbatisMapping.getParameterMapp( sqlmap, sqlId);
		/**反射来装配参数*/
		try {
			int index=0;
			for(ParameterMapping paramMapp : paramMappSet){
				index++;
				String methodName = "get"+ToolUtil.toFirstLetterUpperCase(paramMapp.getPropertyName());
				Method method = params.getClass().getDeclaredMethod(methodName);
				Object obj = null; 
				obj = method.invoke(params, null);
				putPreparedStatement(ps,index,obj ,method.getGenericReturnType());
			}
		} catch (Exception e) {
                           logger.error("反射装配ibatais参数异常,系统错误!",e);
		} 
		
		return ps;
	}
	
	
	/**
	 * 获取ibatis预编译参数
	 * */
	private static ParameterMapping[] getParameterMapp(SqlMapClientImpl sqlmap,String sqlId){
		/**获取sqlMap.xml映射*/
		MappedStatement stmt = sqlmap.getMappedStatement(sqlId);
		/**获取指定ID的parameterClass参数*/
		ParameterMapping[] paramMappSet = stmt.getParameterMap().getParameterMappings();
		
		return paramMappSet;
	}
	
	private static void putPreparedStatement(PreparedStatement ps,int index,Object obj ,Object type) throws SQLException{
		/*String*/
		if(obj instanceof String){
			ps.setString(index, obj.toString());
		}
		/*Integer*/
		if(obj instanceof Integer){
			ps.setInt(index, Integer.valueOf(obj.toString()));
		}
		/*Long*/
		if(obj instanceof Long){
			ps.setLong(index, Long.valueOf(obj.toString()));
		}
		/*Double*/
		if(obj instanceof Double){
			ps.setDouble(index, Double.valueOf(obj.toString()));
		}
		/*Date*/
		if(obj instanceof Date){
                           java.util.Date utilDate = (Date) obj;
			java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
			ps.setDate(index, sqlDate);
		}
		if(obj instanceof BigDecimal){
			ps.setBigDecimal(index, BigDecimal.valueOf(Long.valueOf(obj.toString())));
		}
	}


//**
  * 将手字母大写
**/
	public static String toFirstLetterUpperCase(String strName) {
		if (strName == null || strName.length() < 2) {
			return strName;
		}
		String firstLetter = strName.substring(0, 1).toUpperCase();
		return firstLetter + strName.substring(1, strName.length());
	}



最后:调用方法如下
Connection conn = null;
		PreparedStatement ps = null;
		try {			
			//获取JDBC连接
			conn = sqlMapClient.getDataSource().getConnection();
			conn.setAutoCommit(true);
			
			//执行	
			for(String sqlId : sqlIdSet){
				/**获取配置sql*/
				String sql = this.getSql((SqlMapClientImpl)sqlMapClient, sqlId, params);
				ps = conn.prepareStatement(sql);
				/**动态装配参数*/
				ps = getSqlParameterMap((SqlMapClientImpl)sqlMapClient, ps, sqlId, params);
				/**执行*/
				executeUpdate(ps);
				/**清空预编译参数*/
				ps.clearParameters();
			}	
						
		} catch (SQLException e) {
                           logger.error("访问数据库异常,执行政企报表失败!",e);
		}

分享到:
评论

相关推荐

    ibatis配置文件信息

    ### ibatis配置文件信息 #### 一、简介 在Java开发领域中,ibatis(现称为...通过上述三个配置文件的设置,ibatis能够自动完成对数据库的操作,包括数据的增删改查以及自动封装数据等功能,极大地提高了开发效率。

    struts2+spring+ibatis 增删改查例子(2)

    iBatis会根据这些语句动态生成SQL执行代码,并通过DBCP连接池获取数据库连接,执行SQL,最后将结果转换为Java对象。 Apache DBCP(Database Connection Pool)是Apache提供的一个数据库连接池组件,它可以帮助我们...

    选用ibatis和hibernate的区别

    3. 编写DAO(Data Access Object),为每个表提供增删改查的方法。 **Ibatis** 相比Hibernate更为灵活,它是一个“半自动化”的ORM解决方案。Ibatis允许开发者直接控制SQL,提供更精确的数据操作和优化空间。其主要...

    mybatis框架课程.docx

    MyBatis是Apache的一个开源项目,始于iBatis,2010年迁移到Google Code并改名为MyBatis。MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装,使开发者只需要关心业务逻辑,而不需要关心复杂的...

    Mybatis复习文档

    MyBatis 最初源于 Apache 的一个开源项目 iBatis,在 2010 年该项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis。MyBatis 实质上是对 iBatis 的一次重大改进。 #### 二、JDBC 编程...

    mybatis开发文档

    - **MyBatis 对 JDBC 的封装**:MyBatis 持久层框架对 JDBC 访问数据库的过程进行了封装,包括创建 Connection、创建 Statement、手动设置参数、结果集检索等过程。 #### 三、MyBatis 的核心功能 MyBatis 可以通过...

    mybatis第一阶段

    - **起源与发展**:MyBatis起源于Apache的一个开源项目iBatis,在2010年由Apache Software Foundation迁移到Google Code,并更名为MyBatis。2013年11月,该项目进一步迁移到GitHub上进行维护和发展。 - **定位与优势...

    springmybatis

    恭喜你,环境搭建配置成功,接下来第二章,将讲述基于接口的操作方式,增删改查。 整个工程目录结构如下: 除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! mybatis实战教程(mybatis in action)之二:以...

    韩顺平hibernate笔记

    - Apache OJB、TopLink、iBatis(MyBatis)、EJB CMP等也都是常见的ORM框架,但Hibernate以其易用性和强大的功能在业界得到了广泛的应用。 #### 二、为什么需要Hibernate? 1. **减少代码量**:通过ORM技术,可以...

    mybatis自动生成实体类及实体类映射文件

    MyBatis是一款强大的Java持久层框架,它与Hibernate和iBatis有所不同,更注重SQL的灵活性和手动控制。在开发过程中,我们常常需要为数据库表创建对应的实体类和映射文件(Mapper XML),以便进行数据操作。MyBatis...

    Hibernate笔记

    - **Session:** 负责执行增删改查操作,是对Connection的封装。 - **Query:** 负责执行HQL(Hibernate Query Language)查询语句。 - **Transaction:** 负责事务控制,Hibernate必须使用代码控制事务。 #### 四...

Global site tag (gtag.js) - Google Analytics