`

JDBC之简单封装

阅读更多

本文是JDBC的简单封装,吸收了一些思想经行的封装,封装的很通用,每种数据库都可用,如果有什么错误请指教,,谢谢:

1.配置文件

<?xml version="1.0" encoding="UTF-8"?>
<db>
	<driver>oracle.jdbc.driver.OracleDriver</driver>
	<url>jdbc:oracle:thin:@192.168.3.27:1521:orcl</url>
	<login_name>scott</login_name>
	<login_password>tiger</login_password>
</db>

 本来想再写个借口屏蔽 实现。。。懒得写了

 2.DBUtil类 获取连接

/**
 * Copyright (C), 1995-2010, ChengDu Lovo info. Co., Ltd.
 * FileName: DBUtil  .java
 * <p> DBUtil  实现</p>
 * 
 * @author  Tjee
 * @Date  2010-5-12  
 * @version 1.00 9999/99/99 类创建者姓名
 * @see     参考类1
 * @see     参考类2
 */
public class DBUtil  implements IConnection{
	/**
	 * 字段
	 **/
	// 单例模式只允许 产生一个对象
	private static DBUtil instanse=null;
	private String driver;
	private String url;
	private String login_name;
	private String login_password;
	private Connection con;
	/**
	 * 构造方法
	 * */
	private DBUtil(){
		//读取配置
		this.readConfig();
	}
	/**
	 * 方法
	 * */
//用static  一开始就被加载 
	public static DBUtil getInstanse(){
		if(instanse==null){ //  排除不是第一次产生的对象
			synchronized(DBUtil.class){// synchronized同步  让都是第一次产生对象多线程  在此排队
				if(instanse==null){  // 那个线程先进来  就只让他产生对象
					instanse=new DBUtil();
				}
			}
		}
		return instanse;
	}
/**
 * 获取 dbxml  配置文件的 路径
 * */
	private InputStream getPath(){
		InputStream is=this.getClass().getResourceAsStream("/com/lovo/config/db.xml");
		return is;
	}
	private void readConfig(){
		//读取文件中的数据
		SAXReader saxreader= new SAXReader();
		try {
		Document doc =	saxreader.read(this.getPath());//读取 xml 文件中的数据 放到 doc里面
		List<Element> list =doc.selectNodes("/db/driver");
			this.driver=list.get(0).getTextTrim();
		
			List<Element> list1 =doc.selectNodes("/db/url");
			this.url=list1.get(0).getTextTrim();
			
			List<Element> list2 =doc.selectNodes("/db/login_name");
			this.login_name=list2.get(0).getTextTrim();
			
			List<Element> list3 =doc.selectNodes("/db/login_password");
			this.login_password=list3.get(0).getTextTrim();
			
			System.out.println("driver:"+this.driver);
			System.out.println("url:"+this.url);
			System.out.println("login_name:"+this.login_name);
			System.out.println("login_password:"+this.login_password);

		} catch (Exception e) {
			
			e.printStackTrace();
		}	
	}

	/**
	 *  获得连接 并返回 Connection
	 * @throws ClassNotFoundException 
	 * @throws SQLException 
	 */
	public Connection getConnection() throws Exception{
		
			Class.forName(driver);
			con=DriverManager.getConnection(url,login_name,login_password);
			return con;
	}
	/**
	 * 关闭 连接 和回滚事务
	 * 由于要关闭的连接是实际情况中具体的 所以需要传参数
	 * @throws SQLException 
	 * @throws SQLException */
	 public void closeConnectionRollback(Connection con,PreparedStatement pre,ResultSet rs)throws Exception {
		 /**如果rs不为空关闭连接*/
		if(rs!=null)rs.close();
		 /**如果pre不为空关闭连接*/
		if(pre!=null)pre.close();
		 /**如果con不为空关闭连接   回滚*/
		if(con!=null){
			if(!con.getAutoCommit()){
				con.rollback();
			}
			con.close();
		}
	 }
	 /**
		 * 关闭 连接 和提交事务
		 * 由于要关闭的连接是实际情况中具体的 所以需要传参数
		 * @throws SQLException 
		 * @throws SQLException */
		 public void closeConnectionCommit(Connection con,PreparedStatement pre,ResultSet rs)throws Exception {
			 /**如果rs不为空关闭连接*/
			if(rs!=null)rs.close();
			 /**如果pre不为空关闭连接*/
			if(pre!=null)pre.close();
			 /**如果con不为空关闭连接  提交事务*/
			if(con!=null){
				if(!con.getAutoCommit()){
					con.commit();
				}
				con.close();
			}
		 } 
}

 

3.DataAccessObject 用的类继承他 就可以了 通用增、删、改、查。

/**
 * Copyright (C), 1995-2010, ChengDu Lovo info. Co., Ltd.
 * FileName: DataAccessObject.java
 * <p> DataAccessObject实现</p>
 * 
 * @author  Tjee
 * @Date  2010-5-12  
 * @version 1.00 9999/99/99 类创建者姓名
 * @see     参考类1
 * @see     参考类2
 */
public class DataAccessObject {
	protected Connection con=null;
	protected PreparedStatement pre=null;
	protected ResultSet rs=null;
	
	private IConnection  connect;
	
	/**获得连接
	 * @throws Exception */
	protected void getConnection() throws Exception{
		con=	DBUtil.getInstanse().getConnection();
	}
	/**关闭连接和回滚*/
	 public void closeConnectionRollback(Connection con,PreparedStatement pre,ResultSet rs)throws Exception{
		 DBUtil.getInstanse().closeConnectionRollback(con, pre, rs);
	 }
	 /**关闭连接和提交*/
	 public void closeConnectionCommit(Connection con,PreparedStatement pre,ResultSet rs)throws Exception{
		 DBUtil.getInstanse().closeConnectionRollback(con, pre, rs);
	 }
	/**
	 * 开始事务,设置为手动提交
	 */
	public void beginTransation()throws Exception {
		this.con.setAutoCommit(false);
	}
	/**
	 *  跟新数据库 
	 *  封装非查询语句(insert,delete,update-返回影响的行数;DDL:create,drop,truncate-返回0)
	 * @param sql sql语句
	 * @param args 问号的值
	 * @return
	 * @return int 影响几行
	 * @throws Exception 
	 */
	public int executeSQL(String sql,Object[] args )throws Exception{
		int row = 0;
		/**获得数据库连接*/
		try {
			con=DBUtil.getInstanse().getConnection();
			pre=con.prepareStatement(sql);
			/**判断是否为空在进行对问号赋值*/
			if(args!=null && args.length>0){
				for(int i=0;i<args.length;i++){
					pre.setObject(i+1, args[i]);
				}
			}
			row = pre.executeUpdate();
		} catch (Exception e) {
			/**通知事务中其它sql要回滚*/
			throw e;
		}
		return row;
	}
	/**查询 所有字段
	 * @param sql
	 * @param args
	 * @param cls
	 * @return
	 * @throws Exception
	 * @return List
	 */
	public List queryForList(String sql,Object[] args,Class cls) throws Exception{
		
			List list = new ArrayList();
			try{
				System.out.println(sql);
			pre = con.prepareStatement(sql);
			if(args!=null && args.length>0){
				for(int i=0;i<args.length;i++){
					pre.setObject(i+1, args[i]);
				}
			}
			/**得到结果集*/
			rs = pre.executeQuery();
		
			/**获取类模板的所有字段*/
			Field[] fields = cls.getDeclaredFields();
			while(rs.next()){
				Object obj = cls.newInstance();
				//通过反射对各个属性进行赋值
				for(int i=0;i<fields.length;i++){
					Field field = fields[i];
					//直接访问private属性
					field.setAccessible(true);
					Class type = field.getType();
					/**用oracle才使用 判断*/
					if(type==Double.class||type==double.class){
						String str = rs.getString(i+1);
						if(str!=null){
							Double value = Double.parseDouble(str);
							field.set(obj, value);//obj.name='mike'
						}
					}else if(type==Integer.class||type==int.class){
						String str = rs.getString(i+1);
						if(str!=null){
							Integer value = Integer.parseInt(str);
							field.set(obj, value);
						}
					}else if(type==Float.class||type==float.class){
							String str = rs.getString(i+1);
								if(str!=null){
									Integer value = Integer.parseInt(str);
									field.set(obj, value);
									}
					}else if(type==java.sql.Timestamp.class){
						String str = rs.getString(i+1);
						if(str!=null){
							java.sql.Timestamp rq = strToDateTime(str);
							field.set(obj, rq);
							}
			}
					else{
						field.set(obj, rs.getObject(i+1));
					}
				}
				list.add(obj);
			}
			}catch(Exception e){
				throw e;
			}
		return list;

	}
	/** 
	 * 查询  包括单个字段,和多个字段的查询
	 * 注意(如果与数据库字段不一致 请用       别名     代替 使之与javabean保持一致)
	 * @param sql  语句
	 * @param args 问号的值
	 * @param cls bean模板
	 * @throws Exception
	 * @return List  返回这个bean结合
	 */
	public List querySQL(String sql,Object[] args,Class cls) throws Exception{
		List list = new ArrayList();
		pre = con.prepareStatement(sql);
		/**设置问号*/
		if(args!=null && args.length>0){
			for(int i=0;i<args.length;i++){
				pre.setObject(i+1, args[i]);
			}
		}		
		/**获取类模板的所有字段*/
		Field[] fields = cls.getDeclaredFields();
		/**得到结果集*/
		rs = pre.executeQuery();
		ResultSetMetaData rsmd=rs.getMetaData();
		while(rs.next()){
			   /** 得到cls实例*/
			Object obj=cls.newInstance();
			for(int i=1;i<=rs.getMetaData().getColumnCount();i++) {
				
			   /**判断结果集是否存在Javabean 里面的字段    匹配 别名或者是字段名*/
					for(int j=0;j<fields.length;j++ ){
						if( rsmd.getColumnLabel(i).equalsIgnoreCase(fields[j].getName()) ||
							rsmd.getColumnName(i).equalsIgnoreCase(fields[j].getName())){
							
							fields[j].setAccessible(true);
							Class type =  fields[j].getType();
							if(type==Double.class||type==double.class){
								String str = rs.getString(j+1);
								/**判断取出来的值是否为空 在处理*/
								if(str!=null){
									Double value = Double.parseDouble(str);
									fields[j].set(obj, value);
								}
							}else if(type==Integer.class||type==int.class){
								String str = rs.getString(j+1);
								if(str!=null){
									Integer value = Integer.parseInt(str);
									fields[j].set(obj, value);
								}
							}else if(type==Float.class||type==float.class){
								String str = rs.getString(j+1);
								if(str!=null){
									Integer value = Integer.parseInt(str);
									 fields[j].set(obj, value);
									}
							}else{
								 fields[j].set(obj, rs.getObject(j+1));
							}
						
					}  
			   }
					
		   }
			 list.add(obj);
		}
		return list;
		
	}
	
	/**
	 * 从网页上或外部输入时(一般不会输入时分秒),需要将日期转化为数据库的日期类型
	 */
	public final static java.sql.Timestamp strToDateTime(String dateStr)
	throws Exception{
		int len = dateStr.length();
		String format = "yyyy-MM-dd HH:mm:ss.SSS".substring(0, len);
		DateFormat df = new SimpleDateFormat(format);
		java.util.Date timeDate = df.parse(dateStr);
		System.out.println("dasdasdadasdass"+timeDate);
		java.sql.Timestamp dateTime = new java.sql.Timestamp(timeDate.getTime());// sql类型
		System.out.println("dasdasdadasdass"+dateTime);
		return dateTime;
	}
	

	
	
}

 

1
1
分享到:
评论

相关推荐

    JDBC操作 简单封装

    标题"JDBC操作 简单封装"指出,我们要讨论的是如何通过编写自定义的Java类或者方法来包装基础的JDBC操作,使其更易于使用。这样的封装通常会涉及以下几个关键点: 1. 数据库连接管理:封装类会包含初始化和关闭...

    游戏服务器 数据库连接池 jdbc 简单封装

    总之,游戏服务器数据库连接池JDBC简单封装是提升游戏服务器性能和稳定性的关键技术之一。通过对JDBC的封装,开发者可以更高效地管理数据库连接,同时降低了系统的资源消耗,提升了用户体验。在实际项目中,选择合适...

    JDBC简单封装类

    在这个"JDBC简单封装类"中,我们可以预期找到一种方法来简化这些常见的数据库操作。 首先,让我们详细了解一下JDBC的基本步骤: 1. **加载驱动**:通过`Class.forName()`方法加载数据库驱动,使Java应用程序能够与...

    一个对JDBC进行简单封装的开源工具类库._使用它能够简化JDBC应用程序的开发,不会影响程序的性能_wasdb.zip

    一个对JDBC进行简单封装的开源工具类库._使用它能够简化JDBC应用程序的开发,不会影响程序的性能_wasdb

    JDBC数据操作封装

    本篇文章将详细讲解如何利用JDBC进行数据操作封装,包括增删查改(CRUD)的基本操作,以及如何对多条数据进行事务处理,并将结果返回到对象集合和List中。 首先,我们需要理解JDBC的基本步骤: 1. **加载驱动**:...

    jdbc 连接数据库封装类,可返回map,或者vo(自用)

    标题中的“jdbc 连接数据库封装类,可返回map,或者vo(自用)”指的是一个自定义的Java类库,用于简化Java应用程序通过JDBC(Java Database Connectivity)与数据库的交互。这类库通常会提供方便的方法来执行SQL...

    javaBean自动生成工具,jdbc连接池封装

    JDBC(Java Database Connectivity)是Java与数据库交互的标准接口,而"jdbc连接池封装"则指的是对JDBC连接管理的优化。连接池是一种数据库资源复用机制,它可以预先创建并维护一定数量的数据库连接,当应用需要时...

    自己封装的JDBC

    标题中的“自己封装的JDBC”指的是开发人员为了简化Java数据库连接(JDBC)操作,根据实际项目需求自定义的一套API。这种封装通常是为了提高代码的可读性、可维护性和减少重复代码,使数据库操作更加便捷。下面将...

    JDBC封装类

    标题:JDBC封装类 描述:此文章将详细介绍一个用于简化Java中JDBC操作的封装类,该类通过提供一系列方法来加速数据库编程任务,包括建立数据库连接、执行查询、处理结果集以及执行更新操作。 ### 一、JDBC封装类...

    jdbc封装包

    【标题】:JDBC封装包 【描述】:JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这个封装包是我个人制作的,旨在简化...

    封装过的jdbc包

    对jdbc简单封装,实现基本增删改查,使用时请用编译器导入继承BaseDao类即可

    JDBC封装.rar

    "JDBC封装"是指将常见的数据库操作,如增删改查(CRUD:Create, Read, Update, Delete),进行模块化和抽象化的过程,以便于在代码中重复使用和简化数据库交互。下面将详细介绍JDBC封装的原理、步骤以及它带来的好处...

    通用JDBC基本操作封装源代码

    简单易用的数据库封装操作,包含数据库连接池的基本实现,数据库连接可重用,所有的操作都脱离源生JDBC操作,开发人员只需要熟悉Java集合的用法,会写Sql即可轻松的使用该封装好的JDBC API写出合理的代码。...

    类似hibernate的jdbc封装

    这个“类似hibernate的jdbc简单封装”可能包括以下特性: 1. **连接池管理**:为了提高性能和资源利用率,封装可能会集成如C3P0、HikariCP或Apache DBCP等连接池库,使得数据库连接能被有效管理和复用。 2. **SQL...

    有关于jdbc的基本封装

    本文将深入探讨关于“jdbc的基本封装”这一主题,基于提供的描述,我们将关注如何实现基础的CRUD(创建、读取、更新、删除)操作,以及使用属性配置文件提升代码的灵活性。同时,我们会讨论为何只实现了`...

    泛型封装JDBC

    下面是一个简单的泛型JDBC查询方法的示例: ```java public &lt;T&gt; List&lt;T&gt; executeQuery(String sql, Object[] params, Class&lt;T&gt; clazz) { // 连接数据库,执行SQL,获取ResultSet ResultSet resultSet = ...

    JDBC轻量级封装(包含数据库真分页查询),好用

    对JDBC的封装,适合多种数据库,使用简单方便。 包含对oracle,mysql,sqlserver等数据库的分页查询实现,之前传的没有simple,这次加上了 (欢迎下载我的最新改良版本:http://download.csdn.net/source/1644852)

    MySQL数据库在idea中的增删改查,JDBC简化,JDBC工具类封装,orm模式,数据库三层架构,JDBC事务

    本项目为一个简单的JDBC项目,包括:MySQL数据库在idea中的增删改查,JDBC简化,JDBC工具类封装,orm模式,数据库三层架构,JDBC事务 新建一个ProductManager的项目,实现利用ORM思想和三层架构以下功能: t_product...

    使用德鲁伊连接池封装JDBC

    使用德鲁伊连接池对JDBC进行简单封装的学习代码

    自己封装的小框架--JDBC封装 Action层封装 手动事务管理

    本项目中,"自己封装的小框架--JDBC封装 Action层封装 手动事务管理"是一个实用的实践案例,旨在提高开发效率,优化代码结构,并确保数据操作的完整性。下面我们将深入探讨这个框架中的主要组成部分及其相关知识点。...

Global site tag (gtag.js) - Google Analytics