`
iamzhongyong
  • 浏览: 804568 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDBC-JdbcTemplate-spring、Ibatis

    博客分类:
  • java
 
阅读更多

JDBC 作为java程序员基本上都使用过,但是后面真正做东西的时候,由于JDBC过于底层,除了需要编写数据执行的代码,还需要编写创建connection、释放资源以及对象转换等等问题,相当繁琐。

常见的几个基础类:

DataSource

Conection

Statement

ResultSet

这些类比较基础,灵活运用功能强大,但是写起来比较繁琐。

Spring提供了JdbcTemplate模板,共性的东西模板里面给你做了。

下面是模板类的大体结构。

 

用JdbcTemplate模板来调用,很简单,只需要简单几步,例如:

 

 

public static void main(String[] args) {
		//(1)获取数据源
		DriverManagerDataSource ds = new DriverManagerDataSource("url", "userName", "password");
		//(2)创建JdbcTemplate模板类,并设置数据源
		JdbcTemplate template = new JdbcTemplate(ds);
		//(3)调用模板类中的方法
		template.execute("select *from uses");
	}

 

 

下面分析一下JdbcTemplate中的execute(String sql)这个方法,见代码

 

public void execute(final String sql) throws DataAccessException {
		if (logger.isDebugEnabled()) {
			logger.debug("Executing SQL statement [" + sql + "]");
		}

		class ExecuteStatementCallback implements StatementCallback, SqlProvider {
			public Object doInStatement(Statement stmt) throws SQLException {
				stmt.execute(sql);
				return null;
			}
			public String getSql() {
				return sql;
			}
		}
		execute(new ExecuteStatementCallback());
	}

 

 

方法中有一个回调类,重点是execute中的最后一行,代码

 

public Object execute(StatementCallback action) throws DataAccessException {
		Assert.notNull(action, "Callback object must not be null");

		Connection con = DataSourceUtils.getConnection(getDataSource());
		Statement stmt = null;
		try {
			Connection conToUse = con;
			if (this.nativeJdbcExtractor != null &&
					this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
				conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
			}
			stmt = conToUse.createStatement();
			applyStatementSettings(stmt);
			Statement stmtToUse = stmt;
			if (this.nativeJdbcExtractor != null) {
				stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
			}
			Object result = action.doInStatement(stmtToUse);
			handleWarnings(stmt);
			return result;
		}
		catch (SQLException ex) {
			// Release Connection early, to avoid potential connection pool deadlock
			// in the case when the exception translator hasn't been initialized yet.
			JdbcUtils.closeStatement(stmt);
			stmt = null;
			DataSourceUtils.releaseConnection(con, getDataSource());
			con = null;
			throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
		}
		finally {
			JdbcUtils.closeStatement(stmt);
			DataSourceUtils.releaseConnection(con, getDataSource());
		}
	}
 

 

(1)Connection con = DataSourceUtils.getConnection(getDataSource());

获取数据库链接,方法的入参是getDataSource(),通过数据源来获取链接,数据源是JdbcTemplate作为属性或者构造函数设置进去的

(2)先看catch以及finally中的代码

JdbcUtils.closeStatement(stmt);

DataSourceUtils.releaseConnection(con, getDataSource());

关闭statement以及释放数据库链接

(3)真正执行的是try中的代码体

Object result = action.doInStatement(stmtToUse);其中这一行是重点,调用入参StatementCallback action

action中的doInStatement方法来执行。

 

 

从上面可以看出,template实际上把数据库查询的完整过程都实现了,中间需要用户自定义的部分通过回调的方式让用户传入,

用户只需要关注核心的逻辑即可,其余的脏活累活让模板去干吧。

 

上面通过一个简单方法,说明了整个过程,JdbcTemplate模板使用了大量的回调接口来完成对数据的访问操作,十分简单易用。

 

 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------

JdbcTemplate虽然简化了很多代码量,但是有个不足,就是sql和代码绑定在一起,看上去不是很优雅,重要的是一些公共的SQL复用起来难度较大,

于是出现了Ibatis来解决这个问题,我任务Ibatis解决了两个问题:

(1)SQL和代码的分离,解耦的同时简化了复用的难度

(2)对象和数据库属性的对应关系在配置文件中申明,然后通过反射来实现

下面我满看一下Ibatis和spring的集成:

 

 

<bean id="sqlMapTDDL" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation">
			<value>classpath:sqlmap-config.xml</value>
		</property>
		<property name="dataSource">
			<ref bean="transaction_Proxy_datasource" />
		</property>
	</bean>
	
	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
		<property name="sqlMapClient">
			<ref bean="sqlMapTDDL" />
		</property>
	</bean>
 

 

 

SqlMapClientTemplate是iBatis框架中SqlMapClient的模板类;

SqlMapClientFactoryBean来负责需找ibatis的配置文件以及设置数据源的工作;

 

Spring虽然为各个模板类提供了support类来进一步简化使用,但是在实际编码中,通常自己是先一个BaseDao来定义常用的方法,

因为Template已经非常简单易用乐呵呵。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Spring-Reference_zh_CN(Spring中文参考手册)

    11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. ...

    Spring iBatis Learning Notes

    1. **JdbcTemplate**:Spring提供的JdbcTemplate是Spring JDBC支持的核心类,它提供了一系列方便的方法来执行数据库操作。 2. **批处理操作**:对于大量数据的操作,Spring JDBC支持提供了批处理的功能,可以极大地...

    spring+ibatis所需jar包

    Spring通过其DataSourceTransactionManager可以管理iBATIS的事务,而Spring的JdbcTemplate或MyBatis-Spring库可以帮助无缝集成这两者,使得业务逻辑代码更加简洁。 在压缩包中列出的"Spring所需jar"可能包括了...

    struts+spring+ibatis

    Spring还支持MyBatis集成,通过Spring的JdbcTemplate或SqlSessionTemplate简化数据库操作。 **iBatis框架**: iBatis是一个持久层框架,将SQL语句和Java代码解耦,避免了传统的JDBC代码编写繁琐的过程。它允许...

    spring ioc容器部署实现

    - **org.springframework.orm-3.0.0.RELEASE**:提供对主流ORM框架的整合支持,如Hibernate、iBatis等。 - **org.springframework.oxm-3.0.0.RELEASE**:支持Java对象与XML之间的转换,适用于SOAP web服务。 - **...

    spring-framework-2.0.6-with-dependencies.zip

    4. **数据访问支持**:Spring对各种数据库访问技术提供了支持,包括JDBC、Hibernate、iBatis等ORM框架,使得数据库操作更为方便。 5. **国际化支持**:Spring提供了强大的国际化(i18n)支持,通过ResourceBundle和...

    Spring和ibatis Ext整合完整实例

    2. **Spring JDBC 模块**:Spring 提供了一套强大的 JDBC 抽象,包括 JdbcTemplate 和 NamedParameterJdbcTemplate,它们能简化 SQL 执行和异常处理,但依然需要手动编写 SQL。 3. **MyBatis(iBATIS)**:MyBatis ...

    Spring and iBATIS

    除了iBATIS之外,Spring还提供了自己的JDBC支持,包括简化数据库访问的模板类`JdbcTemplate`。这对于简单的SQL操作非常有用,无需编写复杂的映射逻辑。 ```java @Autowired private JdbcTemplate jdbcTemplate; ...

    Spring技术内幕 学习笔记

    - JdbcTemplate是Spring提供的一个数据库访问工具,它简化了JDBC的使用,减少了代码中的错误。这部分内容将介绍如何使用JdbcTemplate进行数据库操作,包括查询、插入、更新和删除,以及异常处理和事务控制。 5. **...

    struts+spring+ibatis整合框架小demo

    6. DAO接口和实现类:与数据库交互的代码,可能使用了Spring的JdbcTemplate或iBatis的SqlSessionTemplate。 通过这个小demo,开发者可以学习到如何在实际项目中配置和使用Struts、Spring和iBatis,理解它们之间的...

    ibatis+spring

    Spring提供了JdbcDaoSupport和JpaDaoSupport等抽象类,以及JdbcTemplate、SimpleJdbcInsert等工具类,可以方便地与ibatis结合,实现DAO层的操作。 ### 示例代码分析 在给定的部分内容中,首先介绍了导入所需的包,...

    struts+iBATIS+spring整合例子

    其次,iBATIS的DAO(Data Access Object)可以通过Spring的JdbcTemplate或SqlSessionTemplate进行封装,以便于事务管理和数据库访问。最后,Struts的Action可以通过Spring的依赖注入获取到需要的服务,如Service层...

    struts2+ibatis+spring整合开发

    对于数据库操作,可以选择使用Spring的JdbcTemplate或集成iBatis,通过Spring的SqlSessionTemplate进行数据访问。 4. **Struts2与Spring集成**:通过Spring插件struts2-spring-plugin,实现Struts2 Action类的依赖...

    struts2+spring+ibatis +oracle整合 列子

    `ibatis-config.xml`是iBatis的配置文件,定义了数据源和映射文件。 2. **实体类(Entity)**:表示数据库中的表模型,用于和数据交互。 3. **Mapper接口与XML映射文件**:iBatis中的Mapper接口定义了SQL操作的...

    Spring与ibatis

    当 Spring 与 iBATIS 结合使用时,通常采用 Spring 的 DataSourceTransactionManager 和 JdbcTemplate 或者 MyBatis(iBATIS 的后续项目)来实现数据访问。Spring 负责事务管理和对象的生命周期管理,而 iBATIS 则...

    Spring3.0.5所有jar包及每个jar包作用说明文档

    8. **spring-orm.jar**:提供与ORM(Object-Relational Mapping)框架的集成,如Hibernate、JPA、iBatis等,使得Spring可以更好地与这些ORM工具协同工作。 9. **spring-web.jar**:提供了基于HTTP的基础网络支持,...

    Spring 全部 jar包

    10. **spring-orm.jar**:提供了与ORM(Object-Relational Mapping,对象关系映射)框架的集成,如Hibernate、JPA(Java Persistence API)和iBatis。这使得Spring能够与这些ORM框架无缝协作,简化数据访问层的实现...

    Spring中文帮助文档

    11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5....

    org.springframework.orm.jar.zip

    3. JDBC抽象:Spring提供了JdbcTemplate和NamedParameterJdbcTemplate,它们是对JDBC的简单包装,降低了SQL操作的复杂性,提高了可读性和可维护性。 4. MyBatis集成:对于偏好XML或注解方式配置SQL的开发者,Spring...

    spring3.1.1常用jar包

    JDBC模块提供了JdbcTemplate,一个用于执行SQL语句的模板类。 6. **Spring ORM**:这个模块整合了流行的对象关系映射(ORM)框架,如Hibernate、JPA、iBatis等,提供了统一的接口进行数据访问。 7. **Spring Web**...

Global site tag (gtag.js) - Google Analytics