`
xiaomaha
  • 浏览: 20570 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

封装jdbc 实现简单的JdbcTemplate

    博客分类:
  • java
阅读更多
测试结果:
/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		
		/**
		 * 使用ThreadLocal实现~确保每一个线程都访问自己的connection
		 * 实际上用main函数测试并不好,使用Thread测试更好~
		 */
		JdbcTemplateImp jt = new JdbcTemplateImp();
		
		//开启事物
		jt.openTransaction();
		
		
		//查询
		List<Map> list = jt.query("select * from emp");
		for(Map map : list){
			System.out.println(map.get("ENAME"));
			System.out.println(map.get("SAL"));
		}
		
		//添加方法1
		jt.execute("insert into myemp values(8888,'xiaomaha','CLERK',7782,'20-5月-1984',9999,666,20)");
		
		//添加方法2
		jt.execute("insert into myemp values(?,?,?,?,?,?,?,?)", new Object[]{
				9999,"xiaomaha2","CLERK",7788,"20-5月-1984",9988,66,20});

		//删除
		jt.execute("delete from myemp where ename=?",new Object[]{"xiaomaha"});
		
		//删除 故意写错,看回滚是否成功! 注释后程序正常~~~~~~~~
		jt.execute("delete from myemp where err_ename=?",new Object[]{"xiaomaha"});
		
		
		//关闭事物
		jt.closeTransaction();
		
	}

接口:
package org.jdbc;

import java.util.List;
import java.util.Map;

public interface JdbcTemplate {
	/**
	 * 查询接口
	 * @param sql
	 * @return
	 */
	public List<Map> query(String sql);
	/**
	 * 查询接口
	 * @param sql
	 * @param parameters 参数
	 * @return
	 */
	public List<Map> query(String sql ,Object[] parameters);
	
	public void openTransaction();
	
	public void closeTransaction();
	/**
	 * 执行接口
	 * @param sql
	 */
	public void execute(String sql);
	/**
	 * 执行接口
	 * @param sql
	 * @param parameters 参数
	 */
	public void execute(String sql ,Object[] parameters);
}


实现:
package org.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * jdbc实现连接池实际更好,但这个例子主要是想实现jdbcTemplate功能
 * 所以map来装connection,都没写,使用连接池不需要每次关闭connection,只需要回收给map对象
 * 简单的pool其实很简单,但考虑到安全及性能需要花费大量时间,和精力
 * 这个一个简单的jdbcTemplate实现如下
 * @author Administrator
 *
 */
public class JdbcTemplateImp implements JdbcTemplate{
	
	public JdbcTemplateImp(){
		init();
	};
	static{
		try {
			//一个application只需要加载一次,写成xml读取更好,通过xml或properties文件读取就可以通用了!~略
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	private ThreadLocal<Connection> conn = new ThreadLocal<Connection>(); //ThreadLocal

	private void init(){
		
		try{
			//写成xml读取更好,通过xml或properties文件读取就可以通用了!~略
			String url="jdbc:oracle:thin:@localhost:1521:ora",uname= "scott",passw="tiger";
			Connection con = DriverManager.getConnection(url,uname,passw);
			conn.set(con);
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	
	public List<Map> query(String sql , Object[] parameters){
		PreparedStatement ps = null;
		try {
			ps = conn.get().prepareStatement(sql);
			for(int i=0 ;i<parameters.length ;i++){
				ps.setObject(i+1, parameters[i]);
			}
			ResultSet rs = ps.executeQuery();
			return resultToMap(rs);
		} catch (SQLException e) {
			
			e.printStackTrace();
			
			return null;
		}finally{
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		
	}
	
	public List<Map> query(String sql){
		
		PreparedStatement ps = null;
		try {
			ps = conn.get().prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			return resultToMap(rs);
		} catch (SQLException e) {
			
			e.printStackTrace();
			
			return null;
		}finally{
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		
	}
	
	/**
	 * 转换为map类型
	 * @param rs
	 * @return
	 */
	private List<Map> resultToMap(ResultSet rs){
		List<Map> list = new ArrayList<Map>();
		try {
			ResultSetMetaData rsmd = rs.getMetaData();
			int colCount = rsmd.getColumnCount();
			
			while(rs.next()){
				Map<String,Object> map = new HashMap<String,Object>();
				for(int i=1 ;i<=colCount ;i++){
					String colName = rsmd.getColumnName(i);
					Object value = rs.getObject(colName);
					map.put(colName, value);
				}
				list.add(map);
			}
		} catch (SQLException e) {
			
			e.printStackTrace();
		}finally{
			try {
				rs.close();
			} catch (SQLException e) {
				
				e.printStackTrace();
			}
		}
		return list;
	}
	
	public void execute(String sql) {
		PreparedStatement ps = null;
		try {
			ps = conn.get().prepareStatement(sql);
			ps.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				conn.get().rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally{
			try {
				ps.close();
			} catch (SQLException e) {
				
				e.printStackTrace();
			}
		}
	}

	public void execute(String sql, Object[] parameters) {
		PreparedStatement ps = null;
		try {
			ps = conn.get().prepareStatement(sql);
			for(int i=0 ;i<parameters.length ;i++){
				ps.setObject(i+1,parameters[i]);
			}
			ps.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				conn.get().rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally{
			try {
				ps.close();
			} catch (SQLException e) {
				
				e.printStackTrace();
			}
		}
		
	}
	
	public void openTransaction() {
		Connection con = null;
		try {
			con = conn.get();con.setAutoCommit(false);
		} catch (SQLException e) {

			e.printStackTrace();
		}
	}
	
	public void closeTransaction() {
		Connection con = null;
		try {
			con = conn.get();con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally{
			try {
				con.close();
			} catch (SQLException e) {
				
				e.printStackTrace();
			}
		}
	}


	
	public Connection getConn() {
		return conn.get();
	}
	
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		
		/**
		 * 使用ThreadLocal实现~确保每一个线程都访问自己的connection
		 * 实际上用main函数测试并不好,使用Thread测试更好~
		 */
		JdbcTemplateImp jt = new JdbcTemplateImp();
		
		//开启事物
		jt.openTransaction();
		
		
		//查询
		List<Map> list = jt.query("select * from emp");
		for(Map map : list){
			System.out.println(map.get("ENAME"));
			System.out.println(map.get("SAL"));
		}
		
		//添加方法1
		jt.execute("insert into myemp values(8888,'xiaomaha','CLERK',7782,'20-5月-1984',9999,666,20)");
		
		//添加方法2
		jt.execute("insert into myemp values(?,?,?,?,?,?,?,?)", new Object[]{
				9999,"xiaomaha2","CLERK",7788,"20-5月-1984",9988,66,20});

		//删除
		jt.execute("delete from myemp where ename=?",new Object[]{"xiaomaha"});
		
		//删除 故意写错,看回滚是否成功! 注释后程序正常~~~~~~~~
		jt.execute("delete from myemp where err_ename=?",new Object[]{"xiaomaha"});
		
		
		//关闭事物
		jt.closeTransaction();
		
	}







}


使用时需要添加对应数据库jar包
dbank下载:http://dl.dbank.com/c0g1bg6ayl
分享到:
评论

相关推荐

    基于spring jdbc的上层封装,底层jdbc操作基于JdbcTemplate

    基于spring jdbc的RowMapper自动实现对象映射,大部分功能已经由spring jdbc实现了。2、数据类型的设计:集成了JFinal和SBORM的优点,对字段的大小写不敏感,对强类型实体、弱类型实体和非实体的支持。3、统一的接口...

    SpringJdbcTemplate封装工具类

    通过上述分析,我们可以看到SpringJdbcTemplate是一个强大且灵活的工具,它通过封装JDBC操作,使得数据库访问变得更加简单和安全。在实际开发中,合理利用其特性,可以有效提升开发效率和代码质量。

    JdbcTemplate,自己封装的jdbc小框架

    综上所述,自封装的JdbcTemplate是一个简化JDBC操作的实用工具,它通过设计模式和面向对象编程,将复杂的数据库交互转化为简单的API调用,降低了开发难度,提高了代码质量。对于初学者而言,这是一个很好的学习和...

    pring中的jdbc访问类JdbcTemplate使用共

    JdbcTemplate是Spring提供的一个抽象层,它封装了JDBC API,通过模板方法设计模式,将常见的数据库操作进行了标准化,比如执行SQL查询、更新、存储过程等。使用JdbcTemplate可以使得代码更加简洁,更易于测试和维护...

    spring封装jdbc查询

    "spring封装jdbc查询"是Spring框架中的一个核心功能,旨在简化传统的JDBC(Java Database Connectivity)操作,提高代码的可读性和可维护性,同时减少数据库操作中的潜在错误。以下是对这个主题的详细阐述: 首先,...

    打印JdbcTemplate执行sql

    `JdbcTemplate`是Spring对JDBC的轻量级封装,它消除了手动管理连接、事务和结果集的繁琐过程,提高了代码的可读性和可维护性。通过使用模板方法设计模式,`JdbcTemplate`提供了一系列静态和非静态的方法来执行各种...

    JDBC连接池&JDBCTemplate

    JDBCTemplate对JDBC进行了封装,使得数据库操作更加面向对象化。 使用JDBCTemplate,开发者不再需要编写大量的try-catch语句来处理SQLException,也不必关心连接的关闭,因为JDBCTemplate会自动处理这些细节。它...

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    使用 Spring JdbcTemplate 调用 Oracle 存储过程实现 CRUD 在本文中,我们将讨论如何使用 Spring JdbcTemplate 调用 Oracle 存储过程来实现 CRUD(Create、Read、Update、Delete)操作。我们将首先编写 Oracle 存储...

    JDBCTemplate相关jar包4.3.7

    总的来说,JDBCTemplate是Spring框架中处理数据库操作的强大工具,它通过抽象和封装,使得数据库访问变得更加简洁、安全和高效。对于Java开发者来说,熟练掌握JDBCTemplate的使用能够提高开发效率,降低维护成本。在...

    spring-jdbcTemplate实例工程

    Spring JDBC Template是Spring框架中用于简化JDBC操作的一个核心组件,它是Spring对JDBC API的封装,旨在提供一个更加简洁、健壮且可测试的数据库访问层。在这个实例工程中,我们将深入探讨Spring JdbcTemplate的...

    springmvc JdbcTemplate demo

    JdbcTemplate是Spring提供的一个数据库操作工具类,它封装了JDBC的基本操作,如打开和关闭连接、执行SQL语句、处理结果集等。使用JdbcTemplate,你可以避免大量的样板代码,例如手动处理异常和关闭资源。...

    day06_JDBC连接池&JDBCTemplate_docx1

    Spring框架中的JDBCTemplate是JDBC的一个高级封装,简化了数据库操作,提供了事务管理、异常转换等功能。使用JDBCTemplate,开发者无需直接与Statement或PreparedStatement对象打交道,而是通过方法调用来执行SQL,...

    day06_JDBC连接池&JDBCTemplate2

    JDBCTemplate是Spring框架中的一个组件,它封装了JDBC的常用操作,简化了数据库访问,并且提供了事务管理的支持。使用JDBCTemplate,开发者可以避免手动处理SQL字符串和结果集,而是使用模板方法来执行SQL,降低了...

    Spring整合JDBC实现转账业务demo源代码

    以上就是Spring整合JDBC实现转账业务的基本流程。实际应用中,可能还需要考虑更多的细节,比如异常处理、日志记录、性能优化等。这个demo源代码提供了学习和理解Spring JDBC集成以及事务管理的起点,有助于开发者更...

    jdbcTemplate-spring对jdbc的支持

    标签"源码"表明可能会涉及JdbcTemplate的内部实现,包括其如何封装JDBC API,以及如何处理异常和事务。源码分析有助于理解其工作原理,以便于进行更高效的定制或扩展。 标签"工具"可能指的是JdbcTemplate作为一个...

    java基于jdbctemplate数据持久层操作封装

    Java中的JdbcTemplate...通过以上内容,我们可以了解到JdbcTemplate如何简化了Java与MySQL数据库的交互,并在实际项目中实现高效的数据持久层操作封装。正确理解和使用JdbcTemplate能显著提高开发效率,降低出错概率。

    Sping封装的JDBC应用小例子

    Spring框架是Java开发中广泛使用的轻量级框架,它提供了对数据库操作的强大支持,通过封装JDBC(Java Database Connectivity)来简化数据访问。在本例中,我们将深入探讨Spring如何通过JdbcTemplate实现对数据库的...

    lucene+jdbcTemplate封装API+缓存实现索引精确刷新

    在这个项目中,我们看到开发者利用Lucene结合jdbcTemplate来封装API,并引入缓存机制,以实现索引的精确刷新。这是一项高级的技术实践,旨在提高系统的响应速度和数据一致性。 首先,让我们详细了解一下Lucene。...

    jdbcTemplate

    项目经理编写的这个`JDBCTemplate`框架,可能是基于Spring的`JdbcTemplate`进行了二次开发或者封装,以适应项目的特定需求。 `JdbcTemplate`的主要功能包括: 1. **参数绑定**:`JdbcTemplate`支持预编译的SQL语句...

    ifunsu封装基于springjdbc的dao层api

    "标签"中的"spring jdbc dao"强调了这个项目的核心特性:使用Spring JDBC进行数据访问,并且关注DAO层的实现。DAO层的封装是常见的做法,它可以减少重复代码,提高代码的复用性,并且使代码结构更加清晰。 在文件名...

Global site tag (gtag.js) - Google Analytics