`

封装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封装工具包,包括规范model格式接口,封装SpringJdbcTemplate,实现分页,自适应多种数据库

    Spring JDBC,JdbcTemplate,Aspect的整合

    创建日志表,保存“操作人”、"操作方法"、"操作中必要的参数"(若有多个,可以封装在Bean中,如何获取,请参考上次实验中的参考资料), 2. 创建Person的pojo、Dao接口及实现类,Dao中有增删查改方法。创建切面类...

    JdbcTemplate教程

    JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。 除了大量...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...

    Common JDBC DAO组件系统库及帮助手册

    CommonJDBCDAO组件则是由国人自主开发实现的基于JDBC API的数据访问组件,保留有O/R Mapping工具的简便性,也具有JDBCTemplate的灵活性,对JDBC API进行彻底的封装和简化,而且使用简单,目前的版本完全兼容于Oracle...

    JdbcTemplate完全学习

    SpringJDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做...

    day01_eesy_01mybatis.zip

    它和Spring的JdbcTemplate很想,也是对Jdbc的简单封装 以上这些都不是框架 JDBC是规范 Spring的JdbcTemplate和Apache的DBUtils都只是工具类 4.mybatis的概述 mybatis是一个持久层框架,用java编写的。 ...

    Spring5源码之JDBC

    这篇文章主要介绍了Spring5源码之JDBC,基于上一篇Spring5之JDBC使用案例来一步步剖析jdbcTemplate操作数据库的源码。需要的朋友可以参考一下。 1、save/update功能实现 在UserServiceImpl中jdbcTemplate的初始化是...

    mybatis01_入门案例

    一、什么是框架? 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。...Apache的DBUtils:和spring的jdbcTemplate很像,也是对jdbc的简单封装 以上这些都不是框架,jdbc是规范,jd

    Common JDBC DAO组件系统库-开源

    CommonJDBCDAO组件则是由国人自主开发实现的基于JDBC API的数据访问组件,保留有O/R Mapping工具的简便性,也具有JDBCTemplate的灵活性,对JDBC API进行彻底的封装和简化,而且使用简单,目前的版本完全兼容于Oracle...

    【JavaWeb】用户登录案例

    3. 使用JdbcTemplate技术封装JDBC 4. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您 5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误 需求分析 使用三个部分完成上述需求,第一部分是...

    Spring高级之注解驱动开发视频教程

    合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。 SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合...

    开源框架 Spring Gossip

    简单邮件 HTML 邮件 内嵌图片或附档 排程 Spring则对 java.util.Timer提供了抽象封装,让您可以善用Spring的容器管理功能,而Spring对Quartz进行了封装,让它在使用上更加方便。 使用 ...

Global site tag (gtag.js) - Google Analytics