`
wjm901215
  • 浏览: 147681 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDBC数据库通用DAO

阅读更多

数据库连接池

package org.dave.common.database;  

    

 import java.sql.Connection;  

 import java.sql.SQLException;  

 import java.util.ResourceBundle;  

    

 import org.slf4j.Logger;  

 import org.slf4j.LoggerFactory;  

    

 import com.jolbox.bonecp.BoneCP;  

 import com.jolbox.bonecp.BoneCPConfig;  

    

 /**  

  * 数据库连接池  

  * @author David Day  

  */ 

 public final class DatabaseConnectionPool {  

    

     private static final Logger LOG = LoggerFactory.getLogger(DatabaseConnectionPool.class);  

     private static final ResourceBundle BUNDLE = ResourceBundle.getBundle("connection");  

     private static final String DRIVER = "driver";  

     private static final String URL = "url";  

     private static final String USERNAME = "username";  

     private static final String PASSWORD = "password";  

     private static final String MAX_CONNECTION = "max_connection";  

     private static BoneCP pool;  

        

     /**  

      * 开启连接池  

      */ 

     public static void startup() {  

         try {  

             Class.forName(BUNDLE.getString(DRIVER));  

             BoneCPConfig config = new BoneCPConfig();  

             config.setJdbcUrl(BUNDLE.getString(URL));  

             config.setUsername(BUNDLE.getString(USERNAME));  

             config.setPassword(BUNDLE.getString(PASSWORD));  

             config.setMaxConnectionsPerPartition(Integer.parseInt(BUNDLE.getString(MAX_CONNECTION)));  

             pool = new BoneCP(config);  

         } catch (Exception e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

        

     /**  

      * 关闭连接池  

      */ 

     public static void shutdown() {  

         pool.shutdown();  

     }  

        

     /**  

      * @return 数据库连接  

      */ 

     public static Connection getConnection() {  

         try {  

             return pool.getConnection();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

    

 } 

 数据库异常

 package org.dave.common.database;  

    

 /**  

  * 数据库异常  

  * @author David Day  

  */ 

 @SuppressWarnings("serial")  

 public class DatabaseException extends RuntimeException {  

        

     public DatabaseException(Throwable cause) {  

         super(cause);  

     }  

    

 } 

 事务控制

package org.dave.common.database;  

    

 import java.sql.Connection;  

 import java.sql.SQLException;  

    

 import org.slf4j.Logger;  

 import org.slf4j.LoggerFactory;  

    

 /**  

  * 数据库事务  

  * @author David Day  

  */ 

 public class DatabaseTransaction {  

        

     /**  

      * 日志工具  

      */ 

     private static final Logger LOG = LoggerFactory.getLogger(DatabaseTransaction.class);  

        

     /**  

      * 数据库连接  

      */ 

     private Connection conn;  

    

     /**  

      * 实例化一个默认连接的事务  

      */ 

     private DatabaseTransaction() {  

         this(DatabaseConnectionPool.getConnection());  

     }  

    

     /**  

      * 实例化一个默认连接的事务  

      */ 

     private DatabaseTransaction(boolean openTransaction) throws DatabaseException {  

         this(DatabaseConnectionPool.getConnection(), openTransaction);  

     }  

    

     /**  

      * @param conn 数据库连接  

      */ 

     private DatabaseTransaction(Connection conn) {  

         this.conn = conn;  

     }  

    

     /**  

      * @param conn 数据库连接  

      */ 

     private DatabaseTransaction(Connection conn, boolean openTransaction) throws DatabaseException {  

         this.conn = conn;  

         setAutoCommit(!openTransaction);  

     }  

    

     /**  

      * @return 数据库连接  

      */ 

     public Connection getConnection() {  

         return conn;  

     }  

        

     /**  

      * 设置是否自动提交  

      * @param autoCommit 自动提交  

      * @throws DatabaseException  

      */ 

     private void setAutoCommit(boolean autoCommit) throws DatabaseException {  

         try {  

             conn.setAutoCommit(autoCommit);  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

        

     /**  

      * 开始事务  

      * @throws DatabaseException  

      */ 

     public void begin() throws DatabaseException {  

         setAutoCommit(false);  

     }  

        

     /**  

      * @return 是否打开事务  

      * @throws DatabaseException  

      */ 

     public boolean isBegin() throws DatabaseException {  

         try {  

             return !conn.getAutoCommit();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

        

     /**  

      * 提交  

      * @throws DatabaseException  

      */ 

     public void commit() throws DatabaseException {  

         try {  

             conn.commit();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

        

     /**  

      * 回滚  

      * @throws DatabaseException  

      */ 

     public void rollback() throws DatabaseException {  

         try {  

             conn.rollback();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

        

     /**  

      * 关闭连接  

      * @throws DatabaseException  

      */ 

     public void close() throws DatabaseException {  

         try {  

             conn.close();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

        

     /**  

      * @return 连接是否关闭  

      * @throws DatabaseException  

      */ 

     public boolean isClose() throws DatabaseException {  

         try {  

             return conn.isClosed();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DatabaseException(e);  

         }  

     }  

    

 } 

 

通用数据模型

package org.dave.common.database;  

    

 import java.io.Serializable;  

    

 @SuppressWarnings("serial")  

 public abstract class DataModel implements Serializable { } 

 

结果转换器

package org.dave.common.database.convert;  

    

 import java.sql.ResultSet;  

 import java.sql.SQLException;  

    

 /**  

  * 结果映射器  

  * @author David Day  

  */ 

 public interface ResultConverter<T> {  

        

     /**  

      * 映射  

      * @param rs 结果集  

      * @return 映射结果  

      * @throws SQLException  

      */ 

     public T convert(ResultSet rs) throws SQLException ;  

    

 } 

 

把结果转换为整型

package org.dave.common.database.convert;  

    

 import java.sql.ResultSet;  

 import java.sql.SQLException;  

    

 /**  

  * 整型映射工具  

  * @author David Day  

  */ 

 public class IntegerConverter implements ResultConverter<Integer> {  

    

     @Override 

     public Integer convert(ResultSet rs) throws SQLException {  

         return rs.getInt(1);  

     }  

    

 } 

 

通用dao

package org.dave.common.database.access;  

    

 import java.sql.Connection;  

 import java.sql.PreparedStatement;  

 import java.sql.ResultSet;  

 import java.sql.SQLException;  

 import java.sql.Statement;  

 import java.util.ArrayList;  

 import java.util.List;  

    

 import org.dave.common.database.convert.ResultConverter;  

 import org.slf4j.Logger;  

 import org.slf4j.LoggerFactory;  

    

 /**  

  * 数据存取类  

  * @author David Day  

  */ 

 public abstract class DataAccess {  

        

     /**  

      * 日志工具  

      */ 

     private static final Logger LOG = LoggerFactory.getLogger(DataAccess.class);  

     /**  

      * 数据库连接  

      */ 

     private Connection conn;  

     /**  

      * @param conn 数据库连接  

      */ 

     private DataAccess(Connection conn) {  

         this.conn = conn;  

     }  

        

     /**  

      * 插入数据  

      * @param sql  

      * @param generatedKeysConverter 主键映射  

      * @param params  

      * @return 主键  

      * @throws DataAccessException  

      */ 

     protected <T> T insert(String sql, ResultConverter<T> generatedKeysConverter, Object... params) throws DataAccessException {  

         try {  

             PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);  

             setParameters(pstmt, params);  

             executeUpdate(pstmt);  

             ResultSet rs = pstmt.getGeneratedKeys();  

             nextResult(rs);  

             return convertResult(rs, generatedKeysConverter);  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DataAccessException(e);  

         }  

     }  

        

     /**  

      * 更新数据  

      * @param sql  

      * @param params  

      * @return 影响行数  

      * @throws DataAccessException  

      */ 

     protected int update(String sql, Object... params) throws DataAccessException {  

         return executeUpdate(getPreparedStatement(sql, params));  

     }  

        

     /**  

      * 查询单个结果  

      * @param <T>  

      * @param sql  

      * @param converter  

      * @param params  

      * @return  

      */ 

     protected <T> T queryForObject(String sql, ResultConverter<T> converter, Object... params) {  

         ResultSet rs = executeQuery(sql, params);  

         if (nextResult(rs)) {  

             return convertResult(rs, converter);  

         } else {  

             return null;  

         }  

     }  

        

     /**  

      * 查询结果列表  

      * @param <T>  

      * @param sql  

      * @param converter  

      * @param params  

      * @return  

      */ 

     protected <T> List<T> queryForList(String sql, ResultConverter<T> converter, Object... params) {  

         ResultSet rs = executeQuery(sql, params);  

         List<T> list = new ArrayList<T>();  

         while (nextResult(rs)) {  

             list.add(convertResult(rs, converter));  

         }  

         return list;  

     }  

        

     /**  

      * @param sql SQL语句  

      * @return 预编译声明  

      */ 

     private PreparedStatement getPreparedStatement(String sql, Object... params) throws DataAccessException {  

         PreparedStatement pstmt = getPreparedStatement(sql);  

         setParameters(pstmt, params);  

         return pstmt;  

     }  

        

     /**  

      * @param sql SQL语句  

      * @return 预编译声明  

      */ 

     private PreparedStatement getPreparedStatement(String sql) throws DataAccessException {  

         try {  

             return conn.prepareStatement(sql);  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DataAccessException(e);  

         }  

     }  

        

     /**  

      * 为预编译声明传入参数  

      * @param pstmt 预编译声明  

      * @param params 参数  

      * @throws DataAccessException  

      */ 

     private void setParameters(PreparedStatement pstmt, Object... params) throws DataAccessException {  

         try {  

             for (int i = 0; i < params.length; i++) {  

                 pstmt.setObject(i + 1, params[i]);  

             }  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DataAccessException(e);  

         }  

     }  

        

     /**  

      * 执行更新操作  

      * @param pstmt  

      * @return 影响行数  

      * @throws DataAccessException  

      */ 

     private int executeUpdate(PreparedStatement pstmt) throws DataAccessException {  

         try {  

             return pstmt.executeUpdate();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DataAccessException(e);  

         }  

     }  

        

     /**  

      * 执行查询操作  

      * @param pstmt 预编译声明  

      * @return 结果集  

      * @throws DataAccessException  

      */ 

     private ResultSet executeQuery(PreparedStatement pstmt) throws DataAccessException {  

         try {  

             return pstmt.executeQuery();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DataAccessException(e);  

         }  

     }  

        

     /**  

      * 执行查询操作  

      * @param sql SQL语句  

      * @param params 参数  

      * @return 结果集  

      * @throws DataAccessException  

      */ 

     private ResultSet executeQuery(String sql, Object... params) throws DataAccessException {  

         return executeQuery(getPreparedStatement(sql, params));  

     }  

        

     /**  

      * 移动到下一行记录  

      * @param rs 结果集  

      * @return 是否有下一行记录  

      * @throws DataAccessException  

      */ 

     private boolean nextResult(ResultSet rs) throws DataAccessException {  

         try {  

             return rs.next();  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DataAccessException(e);  

         }  

     }  

        

     /**  

      * 映射  

      * @param rs 结果集  

      * @return 映射结果  

      * @throws DataAccessException  

      */ 

     private <T> T convertResult(ResultSet rs, ResultConverter<T> converter) throws DataAccessException {  

         try {  

             return converter.convert(rs);  

         } catch (SQLException e) {  

             e.printStackTrace();  

             LOG.error(e.getMessage(), e);  

             throw new DataAccessException(e);  

         }  

     }  

    

 } 

 数据库存取异常

package org.dave.common.database.access;  

    

 /**  

  * 数据库存取异常  

  * @author David Day  

  */ 

 @SuppressWarnings("serial")  

 public class DataAccessException extends RuntimeException {  

        

     public DataAccessException(Throwable cause) {  

         super(cause);  

     }  

    

 } 

 

分享到:
评论
1 楼 liveandevil 2012-07-20  
我的一直出现驱动找不到的错误 你那个驱动jar文件时放在哪里 怎么配置的? 求详解 谢谢!

相关推荐

    JDBC通用DAO CRUD(不是Hibernate)

    自己写的一个JDBC通用DAO 有几点需要注意: 1.数据库命明目前只支持没下血杠命名(_) 2.表ID字段名取名有2种方式 (1)ID (2)TableName + ID 例如:user表 则取名为 id 或者 userid 因为没有用xml来映射表结构确定哪一个...

    JDBC相关单元测试及通用的Dao

    jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。

    编写通用Dao

    很多程序员喜欢利用JDBC对数据库进行操作,而此处的通用Dao对JDBC操作数据库一些通用的操作进行了封装,使其直接调用,方便而实用。

    论文研究-可重用Java数据库操作组件的设计和实现.pdf

    基于Data Access Object(DAO)设计模式,利用抽象、接口、类反射技术设计和实现了可重用Java数据库操作组件。它封装了注册和载入JDBC驱动程序、建立数据库连接、运行Structured Query Language(SQL)语句及处理查询...

    java-entitymanager-generic-dao:使用 Hibernate EntityManager (Spring Boot) 的通用 Dao

    java-entitymanager-generic-dao 这是一个使用通用 daos 访问数据的小项目。 在这个实现中,我们使用 Spring Framework ORM EntityManager 使用预配置的数据源来实现基本操作,例如从数据库中插入、更新、删除和检索...

    jdialects一个通用数据库方言工具

    jDialects支持多达80多种数据库方言的DDL创建、实体源码生成、分页、函数变换、类型变换及主要的JPA注解解析功能。它通常与JDBC工具组合使用,也可以作为其它Dao工具(如jSqlBox)的一个组成部分。

    通用的CUDR及通用分页

    内有Pager 和 Dao类。Pager类用于分页。Dao类用于数据库数据查询,调用setConn根据自己的DBHelper获得数据库连接,适用于大部分数据库链接查询。

    尚硅谷_佟刚_JDBC.pptx

    除了常规的 JDBC 技术外,更涵盖 &lt;利用反射及 JDBC 元数据编写通用的查询方法&gt;、&lt;使用 DBUtils 工具类&gt;、&lt;DAO设计模式&gt;、&lt;编写通用的 DAO 接口实现类&gt; 等企业级开发内容。源码级讲授 DBUtils 工具类的实现思想,...

    支持多数据库的ORM框架ef-orm.zip

    但是这些SQL语句并不是直接传送给JDBC驱动的,而是 有着一个数据库方言层,经过方言层处理的SQL语句,就具备了在当前数据库上正确操作的能力。这相当于提供了一种能跨数据库操作的SQL语言。(E-SQL) E-SQL不但解决了...

    MINA/JAVA游戏服务端源码

    说明:该服务器框架试用于需要频繁修改数据库内容的游戏,没有使用数据库缓存,jdbc直接修改数据库内容。 申明: 我是个新手,有出错的地方莫怪哈,把源码发布出来更多的是想大伙帮忙改进下框架,改进的代码和新...

    Java数据库快速开发框架(数据库快速开发框架)。- fast-sql / FastSQL

    轻量级数据库访问框架FastSQL目录1 简介FastSQL一个基于spring-jdbc的简单ORM框架,它支持sql构建、sql执行、命名参数绑定、查询结果自动映射和通用DAO。结合了Hibernate/JPA快速开发和Mybatis高效执行的优点。Fast...

    dbcrud:只需连接到JDBC数据源并开始CRUDing,而无需预定义任何ORM或DAO

    dbcrud目标只需连接到JDBC数据源并开始CRUDing,而无需预定义任何ORM或DAO用例: 在某些情况下,我只需要一个稍微笨拙的数据存储后端,在数据之上没有太多业务逻辑,因此目标是拥有一个快速且通用的DAO,而无需使用...

    一个简单实用的数据库操作框架

    所以我在文章提供的源码基础上加了一些功能这些功能包括支持多种数据类型,处理了空值,利用反射方便的在Row对象和值对象之间进行转换,还有加了一个我自认为通用的DAO类来方便用户的操作。我把源码提供出来有两个...

    spring4.3.2参考文档(英文)

    Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接...

    DBJ.jar:一个开放源代码库,用于替换本机JDBC协议,DBJ.jar可以轻松地通过某种方法连接到数据库,因此用户必须在功能中提供凭据和参数,DBJ才能处理其余部分(连接,驱动程序管理器,准备的声明,结果集等)

    DBJ.jar 一个用于替换本机JDBC协议的JAR文件,可以通过调用某些方法来连接到数据库,因此用户只需在功能中提供凭据和参数,DBJ即可处理其余部分(连接,驱动程序管理器,准备好的语句) ,结果集等)要求为了构建和...

    easyjpa:一个超级简单的jpa,分分钟解放你的配置文件,一键搞定通用的增删改查功能

    EasyJpa是什么 EasyJpa是一个轻量的,全自的动对象关系...通用DAO EasyJpa在dao层提供的增删改查API,均对任意实体类通用。并封装了一些SQL关键字的API,您可以通过面向对象的思维方式,来进行jdbc操作。 支持动态SQ

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    我们掌握了数据库及其应用技术、数据库原理、计算机网络技术等课程,对数据库的设计、应用、维护及局域网的组成有了深刻的认识与一定的动手实践能力,考取了信息处理、程序设计、数据库技术等国家IT认证。...

    ItCast-HeiMa-Travel

    ItCast-HeiMa-Travel Java Web 实践项目:黑马旅游网 项目课程链接: ...Spring Jdbc Template:数据库连接工具 数据库设计 -- 船建数据库 CREATE DATABASE travel; -- 使用数据库 USE travel; 其它建表 sql

    jDialects:jDialects是一种数据库方言工具(注意

    它通常与JDBC工具组合使用,也可以作为其它Dao工具(如jSqlBox)的一个组成部分。优点 | Advantages无侵入:jDialects工作原理基于对SQL文本进行变换,不会对您现有的持久层工具产生任何影响。依赖少:仅依赖单个jar...

Global site tag (gtag.js) - Google Analytics