看到这个主题 很多人会怀疑,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配置文件信息 #### 一、简介 在Java开发领域中,ibatis(现称为...通过上述三个配置文件的设置,ibatis能够自动完成对数据库的操作,包括数据的增删改查以及自动封装数据等功能,极大地提高了开发效率。
iBatis会根据这些语句动态生成SQL执行代码,并通过DBCP连接池获取数据库连接,执行SQL,最后将结果转换为Java对象。 Apache DBCP(Database Connection Pool)是Apache提供的一个数据库连接池组件,它可以帮助我们...
3. 编写DAO(Data Access Object),为每个表提供增删改查的方法。 **Ibatis** 相比Hibernate更为灵活,它是一个“半自动化”的ORM解决方案。Ibatis允许开发者直接控制SQL,提供更精确的数据操作和优化空间。其主要...
MyBatis是Apache的一个开源项目,始于iBatis,2010年迁移到Google Code并改名为MyBatis。MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装,使开发者只需要关心业务逻辑,而不需要关心复杂的...
MyBatis 最初源于 Apache 的一个开源项目 iBatis,在 2010 年该项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis。MyBatis 实质上是对 iBatis 的一次重大改进。 #### 二、JDBC 编程...
- **MyBatis 对 JDBC 的封装**:MyBatis 持久层框架对 JDBC 访问数据库的过程进行了封装,包括创建 Connection、创建 Statement、手动设置参数、结果集检索等过程。 #### 三、MyBatis 的核心功能 MyBatis 可以通过...
- **起源与发展**:MyBatis起源于Apache的一个开源项目iBatis,在2010年由Apache Software Foundation迁移到Google Code,并更名为MyBatis。2013年11月,该项目进一步迁移到GitHub上进行维护和发展。 - **定位与优势...
恭喜你,环境搭建配置成功,接下来第二章,将讲述基于接口的操作方式,增删改查。 整个工程目录结构如下: 除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! mybatis实战教程(mybatis in action)之二:以...
- Apache OJB、TopLink、iBatis(MyBatis)、EJB CMP等也都是常见的ORM框架,但Hibernate以其易用性和强大的功能在业界得到了广泛的应用。 #### 二、为什么需要Hibernate? 1. **减少代码量**:通过ORM技术,可以...
MyBatis是一款强大的Java持久层框架,它与Hibernate和iBatis有所不同,更注重SQL的灵活性和手动控制。在开发过程中,我们常常需要为数据库表创建对应的实体类和映射文件(Mapper XML),以便进行数据操作。MyBatis...
- **Session:** 负责执行增删改查操作,是对Connection的封装。 - **Query:** 负责执行HQL(Hibernate Query Language)查询语句。 - **Transaction:** 负责事务控制,Hibernate必须使用代码控制事务。 #### 四...