JDBC-JdbcTemplate-spring、Ibatis
来源:互联网 发布:java方法继承 编辑:程序博客网 时间:2024/06/06 17:54
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已经非常简单易用乐呵呵。
- JDBC-JdbcTemplate-spring、Ibatis
- Spring JDBC、Spring JdbcTemplate 、
- Spring JdbcTemplate 简化 JDBC
- Spring-jdbc:JdbcTemplate使用简介
- Spring对JDBC提供支持----JdbcTemplate
- spring中的jdbc访问类JdbcTemplate使用
- 用Spring对JDBC的操作:JdbcTemplate
- Spring框架学习【JdbcTemplate封装Jdbc】
- 使用 Spring jdbcTemplate 进一步简化 JDBC 操作
- spring技术内幕11-JdbcTemplate封装Jdbc
- JDBC:Spring框架中JDBCTemplate的使用
- 使用Spring的jdbcTemplate简化JDBC操作
- 使用Spring的JdbcTemplate简化jdbc操作
- 使用Spring JDBCTemplate简化JDBC操作
- 使用Spring JDBCTemplate简化JDBC的操作
- 使用Spring JDBCTemplate简化JDBC的操作
- 使用Spring JDBCTemplate简化JDBC的操作
- Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate
- 认知盈余-笔记
- 系统梳理Java注解
- Oracle expdp impdp dump参数介绍
- java回调
- TCP状态-问题排查
- JDBC-JdbcTemplate-spring、Ibatis
- hive UDF编写
- smarty不缓存内容怎么设置
- java log exception
- [转载]浅谈CSRF攻击方式
- java序列化简述
- [转载]日常工作与新技术
- android 手势流程解析
- HashMap原理机制自问自答