`
jiangduxi
  • 浏览: 457084 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JDBC的一个基本的封装

阅读更多
  最近在学习JDBC的时候,编写了一个封装程序,此外用于记录。
  import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import java.sql.Connection;

/**
 * JDBC辅助类
 * 
 * @author jiangduxi
 * 
 */
public final class JdbcUtils {
	private static String url = "jdbc:mysql://localhost:3306/jdbc"; //连接数据库连接
	private static String use = "root"; // 登陆数据库用户名
	private static String password = "123456"; //登陆数据库密码

	private JdbcUtils() {

	}

	/**
	 * 使用静态模块来进行注册驱动
	 */
	static {
		// 1. 注册驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	/**
	 * 建立数据库连接
	 * 
	 * @return 返回数据库连接
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, use, password);
	}

	/**
	 * 释放数据资源
	 * 
	 * @param rs
	 * @param st
	 * @param conn
	 */
	public static void free(ResultSet rs, Statement st, Connection conn) {
		try {
			if (rs != null)
				rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (st != null)
					st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if (conn != null)
					try {
						conn.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
			}
		}
	}

}

下面看看怎么在Add操作中使用该上面的封装类吧!
该AddData方法是用于对user表进行简单的添加操作
 public static void AddData() throws SQLException{
   Connection conn = null
   Statement st = null;
   ResultSet rs = null;
   try{
        //建立连接
        conn = JdbcUtils.getConnection();
        //创建sql语句
        st = conn.createStatement();
        String sql = "INSERT INTO user(name,birthday,money)VALUES('XXXXX','1985-05-19','500.99')";
        //执行SQL语句
       int i = st.executeUpdate(sql);

    }finally {
      JdbcUtils.free(rs, st, conn);
   }
 }

其他的Update、Delete、Search方法都类似。就不给出方法了。
一般的JDBC的步骤是
引用

1. Class.forName()进行注册驱动
2. getConnection() 获取连接
3. 创建SQL语句
4. 执行SQL语句
5. 释放资源

在上述的步骤中尤其要注意释放资源。而且在释放资源的时候尤其要注意,当参数传过来的含有未释放的参数。这个释放资源一般属于慢性病。如果你忘记了,那么系统会慢慢的死掉。
分享到:
评论
4 楼 dandan_5956 2010-03-11  
package com.chm.webservice.dao.impl;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import com.chm.webservice.dao.BaseDAO;

/**
 * @version 1.0 Mar 1, 2010
 * @author danjiang
 */
@SuppressWarnings("unchecked")
public class BaseDAOImpl extends SimpleJdbcDaoSupport implements BaseDAO {

	/**
	 * 查询列表(POJO的属性名一定要与sql中列名一致)
	 * 
	 * @param clazz
	 *            POJO类模板,支持基本类型int.class,long.class和String
	 * @param sql
	 *            查询SQL
	 * @param args
	 *            SQL参数
	 * @return 指定类型的列表
	 * @throws Exception
	 */
	public List queryList(final Class clazz, final String sql,
			final Object[] args) {

		return (List) getJdbcTemplate().execute(new PreparedStatementCreator() {

			public PreparedStatement createPreparedStatement(Connection con)
					throws SQLException {

				PreparedStatement pstmt = con.prepareStatement(sql);
				if (args != null) {
					for (int i = 0; i < args.length; i++)
						pstmt.setObject(i + 1, args[i]);
				}
				return pstmt;

			}

		}, new PreparedStatementCallback() {

			public Object doInPreparedStatement(PreparedStatement pstmt)
					throws SQLException, DataAccessException {

				ResultSet rs = pstmt.executeQuery();
				ResultSetMetaData meta = rs.getMetaData();
				List results = null;
				boolean hasNext = rs.next();
				if (hasNext)
					results = new ArrayList();
				try {
					while (hasNext) {
						Object obj = null;
						if (!"String".equals(clazz.getSimpleName())
								&& !clazz.isPrimitive()) {
							obj = clazz.newInstance();
							for (int i = 1; i <= meta.getColumnCount(); i++) {
								Field field = clazz.getDeclaredField(meta
										.getColumnName(i).toLowerCase());
								field.setAccessible(true);
								field.set(obj, convert(rs, i, field.getType()));
							}
						} else {
							obj = convert(rs, 1, clazz);
						}
						results.add(obj);
						hasNext = rs.next();
					}
				} catch (Exception e) {
					throw new DataRetrievalFailureException("BaseDAO装载数据出错", e);
				}
				return results;

			}

		});
	}

	/**
	 * 查询实体(POJO的属性名一定要与sql中列名一致)
	 * 
	 * @param clazz
	 *            POJO类模板,支持基本类型int.class,long.class和String
	 * @param sql
	 *            查询SQL
	 * @param args
	 *            SQL参数
	 * @return 指定类型的实体
	 * @throws Exception
	 */
	public Object queryObject(Class clazz, String sql, Object[] args) {
		
		List results = queryList(clazz, sql, args);
		if (results != null && !results.isEmpty())
			return results.get(0);
		else
			return null;
		
	}

	/**
	 * 将结果集中值转换为所需类型
	 * 
	 * @param rs
	 *            结果集
	 * @param i
	 *            第几个值
	 * @param clazz
	 *            类型
	 * @return
	 * @throws SQLException
	 */
	private Object convert(ResultSet rs, int i, Class clazz)
			throws SQLException {
		
		Object obj = null;
		if ("String".equals(clazz.getSimpleName()))
			obj = rs.getString(i);
		else if ("int".equals(clazz.getSimpleName()))
			obj = rs.getInt(i);
		else if ("long".equals(clazz.getSimpleName()))
			obj = rs.getLong(i);
		else
			obj = rs.getObject(i);
		return obj;
		
	}
}
3 楼 gundumw100 2010-03-11  
每次都getConnection,不觉得浪费?
2 楼 zzzlyr 2010-03-11  
这好像是在练习
1 楼 dandan_5956 2010-03-11  
这也是封装

相关推荐

    java JDBC 连接sql server封装

    以上就是一个基本的Java JDBC连接SQL Server的封装示例。通过这种方式,你可以轻松地在多个地方重用相同的连接逻辑,同时保持代码的整洁。记住,对于生产环境,最好使用连接池(如HikariCP、C3P0等)来管理和复用...

    java增删改查JDBC封装类(泛型封装)

    - `SqlServerConn`可能是一个针对SQL Server数据库的连接类,封装了JDBC连接和操作的方法。 - 可能包含如`getConnection()`获取数据库连接,`executeQuery(String sql, ResultSetHandler&lt;T&gt; handler)`执行查询并...

    自己封装的JDBC

    封装JDBC主要是对以上步骤进行抽象和封装,例如创建一个`DBUtil`类,提供以下功能: - 静态方法用于加载驱动和建立连接,如`getConnection(String url, String username, String password)`。 - 创建一个`...

    有关于jdbc的基本封装

    JDBC是Java平台上的一个API,允许Java开发者与各种类型的数据库进行交互。它提供了一组接口和类,使得程序员可以编写数据库独立的代码,从而不必关心底层数据库的具体实现。 2. 基本CRUD操作: - 创建(Create)...

    JDBC数据操作封装

    针对"JDBC数据操作封装",我们可以设计一个通用的DAO(Data Access Object)层,提供增删查改的接口。例如,一个简单的CRUD接口如下: ```java public interface Dao&lt;T&gt; { void insert(T entity); void update(T ...

    对jdbc的封装的总结

    在封装的JDBC代码中,可以设计一个方法读取这个文件,逐条执行其中的SQL,方便数据库的初始化和测试。 总结起来,对JDBC的封装是提高Java应用数据库操作效率和质量的关键步骤。通过引入连接池、使用...

    原创的JDBC封装可支持各种数据库

    封装一个方法接收SQL语句数组,一次性执行多个SQL。 10. **连接关闭**: 使用连接池时,不需要手动关闭连接,但在不使用连接池的情况下,需要确保在操作完成后关闭连接、Statement和ResultSet。 通过以上步骤,...

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

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

    自己封装的jdbc工具类

    给学生讲课课上写的jdbc封装类,对基本的增删改查和事务做了封装。例子中用的是oracle 11g数据库,如果换其他数据库直接改连库字符串就行,其他的不用动,适合初学者学习。查询的时候会省掉很多工作量,不需要一个一...

    mysql JDBC C3P0 封装类

    4. 封装JDBC操作:创建一个数据库操作类,如`DBUtil`,提供获取连接、释放连接、执行SQL等方法。在获取连接时,从数据源中借用连接;执行完SQL后,将连接归还到数据源。 ```java public class DBUtil { private ...

    jdbc封装(实现对实体的增删改查[分页]).zip

    code-access实现 是用access实现的,本意是access方便,就一个文件,方便部署。但access有好多不支持,就写成这样.主要是可参考Dao这一层的代码 JdbcUtils是jdbc封装的工具, JdbcCRUDUtils借助JdbcUtils实现对实体...

    JDBC封装.rar

    "JDBC封装方式"可能是包含上述封装策略的源代码文件,如`DBUtil.java`,`UserDAO.java`,`UserDAOImpl.java`等,这些文件共同构成了一个完整的JDBC封装体系。 通过以上介绍,我们可以理解JDBC封装是Java开发中提升...

    JDBC通用封装类

    本资源是对JDBC的封装,方便在项目中使用,其中BaseDao.java是对JDBC操作的封装,使用时让自己的Dao类继承即可,然后调用其中的executeQuery和executeOthe分别执行DQL和DML操作。dbinfo.properties属性文件存储基本...

    JDBC轻量型封装实例

    本资源属于基本的JDBC操纵数据库增删改查代码的轻量型封装的实现,具体的使用过程大家可以参照以下博文的讲解: http://blog.csdn.net/songdeitao/article/details/17484635

    封装过的jdbc包

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

    封装jdbc,采用Map方式快速增删改数据库例子

    在Java的数据库编程中,JDBC(Java Database Connectivity)是一个重要的接口,用于连接Java应用程序与各种类型的数据库。本文将深入探讨如何通过封装JDBC来提高数据库操作的效率,特别是使用Map数据结构实现快速的...

    jdbc-增删改查和封装增删改查.docx

    Statement接口是一个基本的接口,使用它可以执行不带参数的SQL语句。PreparedStatement接口是Statement接口的子接口,使用它可以执行带参数的SQL语句。CallableStatement接口是Statement接口的子接口,使用它可以...

    jdbc连接oracle11g初次封装.docx

    本文档提供了一个使用 JDBC 连接 Oracle 11g 数据库的基本框架,并进行了初步的封装。虽然在实际应用中还需要进一步完善性能优化等方面的工作,但对于初学者来说,这已经是一个很好的起点。通过深入理解并扩展这个...

    DB.rar_jdbc封装

    本压缩包“DB.rar_jdbc封装”显然是一个关于如何使用Java JDBC进行数据库连接封装的示例或教程。下面我们将详细探讨JDBC以及如何进行封装。 首先,JDBC是Java平台上的一个接口,它允许Java应用程序与各种数据库进行...

    JDBC CRUD操作的粗略封装DEMO

    本示例“JDBC CRUD操作的粗略封装DEMO”提供了一个基础的JDBC操作数据库的代码实例,旨在简化常见的数据库操作流程。我们可以通过分析这个DEMO来学习如何利用JDBC进行数据处理。 首先,我们需要理解JDBC的基本步骤...

Global site tag (gtag.js) - Google Analytics