`

Spring之JDBC模板(手写)

阅读更多
一 模板父类: SpringBaseDAO.java
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.lob.OracleLobHandler;
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
import org.springframework.jdbc.support.nativejdbc.WebLogicNativeJdbcExtractor;


public class SpringBaseDAO extends JdbcDaoSupport{		
	
	private NativeJdbcExtractor nativeJdbcExtractor;	
	protected OracleLobHandler lobHandler;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	private SimpleJdbcTemplate simpleJdbcTemplate;
	

	public SpringBaseDAO() {
		setDataSource(ConnectionUtils.getDataSource());
		namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(ConnectionUtils.getDataSource());
		simpleJdbcTemplate = new SimpleJdbcTemplate(ConnectionUtils.getDataSource());
		nativeJdbcExtractor = new WebLogicNativeJdbcExtractor();
		lobHandler = new OracleLobHandler();
		lobHandler.setNativeJdbcExtractor(nativeJdbcExtractor);
		getJdbcTemplate().setNativeJdbcExtractor(nativeJdbcExtractor);		
	}	

	public void close(Connection childConnection) throws SQLException {
		releaseConnection(childConnection);
	}

	public void close(Statement childStatement) throws SQLException {
		if (null != childStatement) {
			childStatement.close();
			childStatement = null;
		}
	}

	public void close(CallableStatement childCallStatement) throws SQLException {
		if (null != childCallStatement) {
			childCallStatement.close();
			childCallStatement = null;
		}
	}

	public void close(PreparedStatement childPsmt) throws SQLException {
		if (null != childPsmt) {
			childPsmt.close();
			childPsmt = null;
		}
	}

	public void close(ResultSet childRs) throws SQLException {
		if (null != childRs) {
			childRs.close();
			childRs = null;
		}
	}

	public void close(Connection childConnection, Statement childStatement)
			throws SQLException {
		close(childConnection);
		close(childStatement);
	}

	public void close(Connection childConnection, PreparedStatement childPsmt)
			throws SQLException {
		close(childConnection);
		close(childPsmt);
	}

	public void close(Connection childConnection, ResultSet childRs)
			throws SQLException {
		close(childConnection);
		close(childRs);
	}

	public void closeChild(Connection childConnection,
			Statement childStatement, ResultSet childRs) throws SQLException {
		close(childConnection, childStatement);
		close(childRs);
	}

	public void close(Connection childConnection, PreparedStatement childPsmt,
			ResultSet childRs) throws SQLException {
		close(childConnection, childPsmt);
		close(childRs);
	}

	public void close(PreparedStatement childPsmt, ResultSet childRs)
			throws SQLException {
		close(childPsmt);
		close(childRs);
	}

	public NativeJdbcExtractor getNativeJdbcExtractor() {
		return nativeJdbcExtractor;
	}

	public void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor) {
		this.nativeJdbcExtractor = nativeJdbcExtractor;
	}

	public OracleLobHandler getLobHandler() {
		return lobHandler;
	}

	public void setLobHandler(OracleLobHandler lobHandler) {
		this.lobHandler = lobHandler;
	}

	public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
		return namedParameterJdbcTemplate;
	}

	public void setNamedParameterJdbcTemplate(
			NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
		this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
	}

	public SimpleJdbcTemplate getSimpleJdbcTemplate() {
		return simpleJdbcTemplate;
	}

	public void setSimpleJdbcTemplate(SimpleJdbcTemplate simpleJdbcTemplate) {
		this.simpleJdbcTemplate = simpleJdbcTemplate;
	}
}

二 应用类CGDAOImpl.java
public interface CGDAO {
	
	public boolean save(CG cg);
	public boolean update(CG cg);
	public boolean del(CG cg);
	public CG get(CG cg);
	public List<CG> getCgData(String querySql);	

}

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback;
import org.springframework.jdbc.support.lob.LobCreator;
import org.springframework.stereotype.Component;

@Component("cgDao")
public class CGDAOImpl extends SpringBaseDAO implements CGDAO {

	private static final String INSERT = "insert into COMMUNICATIONGROUPINGS(CGID,CGNAME,CGCOMMENT,USERID,USERNAME,CGTIME,CGIMAGE,CGTXT,IMGPATH,TXTPATH)VALUES(?,?,?,?,?,?,?,?,?,?)";
	private static final String UPDATE = "update COMMUNICATIONGROUPINGS set CGNAME=?,CGCOMMENT=?,CGTIME=?,CGIMAGE=?,CGTXT=?,IMGPATH=?,TXTPATH=? where CGID=?";
	private static final String GET = "select t.*,'' totalItems ,'' num from COMMUNICATIONGROUPINGS t where t.CGID=?";
	private static final String DEL = "delete COMMUNICATIONGROUPINGS t where t.cgid=?";
	
	public boolean del(CG cg) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("cgid", cg.getCgId());
		return getJdbcTemplate().update(DEL, cg.getClass(), params) > 0;
	}

	@SuppressWarnings("unchecked")
	public CG get(CG cg) {
		CG dbCg = (CG) getJdbcTemplate().queryForObject(GET, new CGRowMapper(lobHandler),
				cg.getCgId());
		return dbCg;
	}

	@SuppressWarnings("unchecked")
	public List<CG> getCgData(String querySql) {
		List<CG> cgList = getJdbcTemplate().query(querySql, new CGRowMapper(lobHandler));
		return cgList;
	}

	public boolean save(final CG cg) {
		//abstractLobCreatingPreparedStatementCallback
		// return 0 < getJdbcTemplate().update(INSERT,
		// cg.getCgId(),cg.getCgName(),cg.getCgComment(),cg.getCgUserId(),cg.getCgUserName(),cg.getCgDateTime());		
		return getJdbcTemplate().execute(INSERT,new CGLobCreatingPreparedStatementCallback(lobHandler,cg)) > 0;
	}

	public boolean update(final CG cg) {
		/*return getJdbcTemplate().update(UPDATE, cg.getCgName(),
				cg.getCgComment(), cg.getCgDateTime(), cg.getCgId()) > 0;*/
		return getJdbcTemplate().execute(UPDATE,
				new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
					// ②
					protected void setValues(PreparedStatement ps, LobCreator lobCreator)
							throws SQLException {
						int i=0;
						ps.setString(++i, cg.getCgName());
						ps.setString(++i, cg.getCgComment());
						ps.setString(++i, cg.getCgUserId());
						ps.setString(++i, cg.getCgUserName());
						ps.setString(++i, cg.getCgDateTime());
						// ③ 设置 BLOB 字段
						lobCreator.setBlobAsBytes(ps, ++i, cg.getCgImg());
						// ④ 设置 CLOB 字段
						lobCreator.setClobAsString(ps, ++i, cg.getCgTxt());
						ps.setString(++i, cg.getImgPath());
						ps.setString(++i, cg.getTxtPath());
						ps.setString(++i, cg.getCgId());

					}
				}) > 0;
	}
}

三 CGRowMapper.java
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.lob.AbstractLobHandler;

@SuppressWarnings("unchecked")
public class CGRowMapper implements RowMapper {	
	
	private AbstractLobHandler lobHandler;
	
	public CGRowMapper(){}
	
	public CGRowMapper(AbstractLobHandler lobHandler){
		this.lobHandler = lobHandler;
	}
	
	// 默认已经执行rs.next(),可以直接取数据
	public Object mapRow(ResultSet rs, int index) throws SQLException {		
		CG cg = new CG(
				rs.getString("CGID"),
				rs.getString("CGNAME"),
				rs.getString("CGCOMMENT"),
				rs.getString("CGTIME"),
				rs.getString("USERID"),
				rs.getString("USERNAME"),	
				rs.getString("IMGPATH"),
				rs.getString("TXTPATH"),	
				lobHandler.getBlobAsBytes(rs, "CGIMAGE"),				
				lobHandler.getClobAsString(rs, "CGTXT"),	
				rs.getString("totalItems"),
				rs.getString("num")
		);		
		return cg;
	}
}

四 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">


	<context:annotation-config />
	<context:component-scan base-package="com.xxx" />

	<context:property-placeholder location="classpath:db.properties" />


	<bean id="dataSource"
		class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>${DbJNDI}</value>
		</property>
		<property name="resourceRef">
			<value>${RESOURCEREF}</value>
		</property>
		<property name="jndiEnvironment">
			<props>
				<prop key="java.naming.provider.url">
					${Context.PROVIDER_URL}
				</prop>
				<prop key="java.naming.factory.initial">
					${Context.INITIAL_CONTEXT_FACTORY}
				</prop>
			</props>
		</property>
	</bean>

	<!-- 
		<bean id="dataSource"	
		class="org.apache.commons.dbcp.BasicDataSource"	destroy-method="close">				
		property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
		<property name="url" value="jdbc:mysql://localhost/spring_datasource" />		
		<property name="driverClassName" value="${dbdriver}" />
		<property name="url" value="${constr}" />
		<property name="username" value="${username}" />
		<property name="password" value="${password}" />
		</bean>
	-->



	<bean id="nativeJdbcExtractor"
		class="org.springframework.jdbc.support.nativejdbc.WebLogicNativeJdbcExtractor"
		lazy-init="true" />
	<bean id="lobHandler"
		class="org.springframework.jdbc.support.lob.OracleLobHandler"
		lazy-init="true">
		<property name="nativeJdbcExtractor" ref="nativeJdbcExtractor" />
	</bean>
	<bean id="defaultLobHandler"
		class="org.springframework.jdbc.support.lob.DefaultLobHandler"
		lazy-init="true" />

	<bean id="jdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>


	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<aop:config>
		<aop:pointcut id="bussinessService"
			expression="execution(public * com.xxx.*.service.*.*(..))" />
		<aop:advisor pointcut-ref="bussinessService"
			advice-ref="txAdvice" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="*" />
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="edit*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>
</beans>

sql文件如下:
-- Create table
create table COMMUNICATIONGROUPINGS
(
  cgid      VARCHAR2(32),
  cgname    VARCHAR2(60),
  cgcomment VARCHAR2(4000),
  userid    VARCHAR2(32),
  username  VARCHAR2(60),
  cgtime    VARCHAR2(40)
)
-- Add comments to the table 
comment on table COMMUNICATIONGROUPINGS
  is '通讯录分组';
-- Add comments to the columns 
comment on column COMMUNICATIONGROUPINGS.cgid
  is '主键ID';
comment on column COMMUNICATIONGROUPINGS.cgname
  is '通讯录组名';
comment on column COMMUNICATIONGROUPINGS.cgcomment
  is '备注';
comment on column COMMUNICATIONGROUPINGS.userid
  is '创建人ID';
comment on column COMMUNICATIONGROUPINGS.username
  is '创建人姓名';
comment on column COMMUNICATIONGROUPINGS.cgtime
  is '		创建时间<YYYY-MM-DD hh:mm:ss>';
分享到:
评论

相关推荐

    Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate

    Spring JDBC模板类——`org.springframework.jdbc.core.JdbcTemplate`是Spring框架中的核心组件,它为Java开发者提供了一种方便、安全的方式来执行SQL语句,而无需直接管理数据库连接。`JdbcTemplate`通过抽象出低...

    Spring mvc + Spring + Spring jdbc 整合 demo.rar

    4. 数据访问对象(DAO):负责与数据库的交互,使用Spring JDBC模板执行SQL查询和更新操作。 5. 模型(Model):数据对象,用于在服务层和视图层之间传递数据。 6. 视图:可能包含JSP页面或其他模板技术,用于展示...

    手写SpringIOC注解实现版本

    6. **测试**:使用SpringJDBC进行依赖注入测试,我们可以确保在测试环境中正确配置了数据源,并能有效验证依赖注入是否正常工作,以及业务逻辑是否正确执行。 这个"手写Spring IOC注解实现版本"项目会涵盖以上所有...

    小码农的代码(一)----------SpringJDBC的使用

    首先,SpringJDBC提供了一个抽象层,它将传统的JDBC API封装起来,减少了手写模板代码的需求,使得数据库操作更加简洁、易读。通过使用Spring的JdbcTemplate和NamedParameterJdbcTemplate,开发者可以避免处理连接...

    用300行代码手写Spring V1.0版本

    再者,Spring提供了多种数据访问集成,包括JDBC模板、ORM(Object-Relational Mapping)框架如Hibernate和MyBatis的集成。在我们的简化版本中,可能会看到一个简单的JdbcTemplate的实现,它降低了直接操作数据库的...

    手写高仿真提炼Spring.zip

    此外,Spring还提供了对数据访问的强大支持,如JDBC模板、Hibernate、MyBatis等ORM框架的集成。通过Spring Data JPA或Spring Data MongoDB,我们可以轻松地进行数据库操作,实现CRUD功能。 最后,模拟Spring的实现...

    手写spring1.0

    - 集成数据访问层,例如JDBC模板,理解如何处理数据库操作。 - 虽然Spring1.0没有Spring MVC,但可以尝试模拟实现简单的请求调度和视图渲染,以便更好地理解MVC的工作流程。 此外,对于初学者来说,阅读Spring1.0的...

    spring3.1.1所有jar包

    3. **Spring JDBC**:简化了JDBC操作,提供了模板类和数据源抽象,减少了手写SQL和处理结果集的繁琐工作。 4. **Spring ORM**:集成各种ORM框架,如Hibernate、JPA,使得数据库操作更加方便。在SSH框架中,Spring与...

    Spring的所有架包

    5. **Spring JDBC**: 提供了一层抽象,简化了与数据库的交互,包括数据源管理、JDBC模板以及事务处理。它避免了手动管理连接、结果集映射等繁琐工作。 6. **Spring ORM**: 集成了多种ORM(对象关系映射)框架,如...

    Spring基础:数据访问(1)

    1. **JDBC模板**:Spring的JdbcTemplate是处理JDBC操作的一种抽象,它可以自动处理资源的关闭、异常处理等繁琐工作,避免了手写大量重复的JDBC代码。 2. **ORM框架集成**:Spring支持多种Object-Relational Mapping...

    单独使用Spring 3.1时要加的所有包

    8. **spring-jdbc**: 提供了对JDBC的抽象层,简化了数据库访问,减少了手写SQL和处理结果集的工作。它支持事务管理、数据源配置和模板方法模式,以提高可读性和可维护性。 9. **spring-orm**: 提供了对流行ORM...

    SpringingJDBC:MySQL 上的一个简单的 Java Spring JDBC

    `JdbcTemplate`是Spring JDBC提供的核心接口,它简化了与数据库的交互,避免了手写大量的JDBC模板代码。通过使用`JdbcTemplate`,我们可以轻松地执行SQL查询、更新、插入和删除操作。 在MySQL环境中配置Spring JDBC...

    spring2.0源码

    Spring JDBC模块提供了一组模板类(如JdbcTemplate和SimpleJdbcInsert),简化了数据库操作。ORM(对象关系映射)支持让开发者能轻松地在Java对象和数据库表之间建立映射,减少了手写SQL的需求。 四、事务管理 ...

    spring内置jdbctemplate使用demo

    在数据访问层,Spring 提供了多种方式来操作数据库,其中 `JdbcTemplate` 是一个简单且强大的工具,它封装了 JDBC API,使得数据库操作变得更加简洁和安全。`JdbcTemplate` 减少了手写 SQL 和处理结果集的繁琐工作,...

    spring整合mybatis简单项目

    Spring还提供了对数据库操作的支持,如JDBC模板,以及与各种持久层框架(如Hibernate和MyBatis)的集成。 **Mybatis框架** Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。相比于传统的...

    Spring+SpringMVC+JDBCTemplate简单用户管理功能

    它抽象了数据库连接的创建、关闭以及SQL语句的执行,避免了手写大量重复的JDBC代码。在用户管理功能中,JDBCTemplate用于执行CRUD(创建、读取、更新、删除)操作,例如添加新用户、查询用户信息、修改用户信息和...

    Spring Boot Mybatis 自动生成Entity,controller、serviceImpl ,Dao,方便开发,无需手写

    Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 3. **...

    跟我学spring3(8-13).pdf

    它通过模板类如JdbcTemplate和SimpleJdbcInsert等,减少了手写JDBC代码的工作量。 4. **Spring对ORM框架的支持**: - **Hibernate集成**:Spring提供了一套完整的Hibernate支持,包括SessionFactory的配置、事务...

    Java利用Freemarker模板自动生成dto、dao、rowmapper、bo、service代码

    在Spring JDBC中,RowMapper接口用于将数据库查询结果的一行映射为一个Java对象。生成RowMapper代码时,通常会为每个DTO创建一个对应的RowMapper实现,这样可以在处理数据库查询结果时,方便地将结果集转换为DTO...

    spring教程ppt

    Spring还支持数据访问抽象,包括JDBC模板和ORM(对象关系映射)集成,如Hibernate和MyBatis。这使得数据库操作变得更加简单,避免了手写SQL和处理结果集的麻烦。PPT可能包含如何配置和使用这些数据访问技术的内容。 ...

Global site tag (gtag.js) - Google Analytics