用于JDBC操作数据库的公共类
/*
* @(#)CommonSql.java 2011-9-5
*
* Copyright 2011 Bianjing,All rights reserved.
*/ import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List; import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource; /**
* 用于JDBC操作数据库的共通类
*
* @author Bianjing
* @version 1.0.0 2011-9-5
*/
public class CommonSql {
/** 数据源 */
private DataSource dataSource; /** 数据库连接对象 */
private Connection connection; /** 数据库操作对象 */
private PreparedStatement ps; /** 数据库操作对象 */
private Statement statement; /** 返回的数据结果集对象 */
private ResultSet rs; /** 是否自动提交事务,默认为true,如果该值为false则需要手动提交事务 */
private boolean autoCommit = true; /** 数据库连接是否已经打开 */
private boolean openConnection; /** JNDI名称 */
private String jndiName; /** 数据库驱动 */
private String driver; /** 数据库访问地址 */
private String url; /** 用户名 */
private String user; /** 密码 */
private String pwd; public CommonSql() { } public CommonSql(DataSource dataSource) {
this.dataSource = dataSource;
} public CommonSql(String jndiName) {
this.jndiName = jndiName;
} public CommonSql(String driver, String url, String user, String pwd) {
this.driver = driver;
this.url = url;
this.user = user;
this.pwd = pwd;
} /**
* 打开数据库连接并创建数据库连接对象<br/>
* 支持通过ICO注入数据源、数据库驱动、数据库驱动、JNDI名称、数据库访问地址和用户名、密码
*
* @return boolean true:连接成功,false:连接失败
*/
public boolean openConnection() {
/**
* 通过数据源来获取数据库连接对象
*/
if (dataSource != null) {
try {
connection = dataSource.getConnection();
// 数据库连接已经打开
openConnection = true;
} catch (SQLException e) {
closeAll();
// 所有的"System.out.println"都可以替换为"logger.error"
System.out.println("从数据源获取数据库连接失败!");
throw new RuntimeException(e);
} return openConnection;
}
/**
* 通过JNDI来获取数据库连接对象
*/
if (jndiName != null) {
try {
Context initContext = new InitialContext();
dataSource = (DataSource) initContext.lookup(jndiName);
connection = dataSource.getConnection();
// 数据库连接已经打开
openConnection = true;
} catch (Exception e) {
closeAll();
System.out.println("从JNDI获取数据库连接失败!");
throw new RuntimeException(e);
} return openConnection;
}
/**
* 通过数据库驱动、数据库访问地址、用户名、密码来获取数据库连接对象
*/
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, pwd);
// 数据库连接已经打开
openConnection = true;
} catch (Exception e) {
closeAll();
System.out.println("数据库连接失败!");
throw new RuntimeException(e);
} return openConnection;
} /**
* 执行数据库的更新操作
*
* @param sql
* 要执行的SQL语句
* @return boolean true:执行成功,false:执行失败
*/
public boolean execUpdate(String sql, Object... args) {
boolean isPassed = false;
// 判断连接数据库是否成功
if (openConnection) {
try {
ps = connection.prepareStatement(sql);
// 设置参数
if (args != null && args.length > 0) {
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
}
ps.executeUpdate(); isPassed = true;
} catch (SQLException e) {
try {
if (autoCommit) {
connection.rollback();
}
} catch (SQLException e1) {
throw new RuntimeException(e1);
}
System.out.println("SQL:" + sql);
throw new RuntimeException(e);
} finally {
if (autoCommit) {
closeAll();
}
}
} else {
System.out.println("数据库连接对象没有打开!");
} return isPassed;
} /**
* 执行数据库的更新操作
*
* @param sql
* 要执行的SQL语句
* @return boolean true:执行成功,false:执行失败
*/
public boolean execUpdate(String sql, List<?> args) {
return execUpdate(sql, args.toArray());
} /**
* 执行批量更新数据库操作
*
* @param sql
* 要执行的SQL语句的字符串数组
* @return boolean true:执行成功,false:执行失败
*/
public boolean execUpdate(Object[] sql) {
boolean flag = false;
// 判断连接数据库是否成功
if (openConnection) {
try {
statement = connection.createStatement();
for (int i = 0; i < sql.length; i++) {
statement.addBatch((String) sql[i]);
}
statement.executeBatch(); flag = true;
} catch (SQLException e) {
try {
if (autoCommit) {
connection.rollback();
}
} catch (SQLException e1) {
throw new RuntimeException(e1);
}
for (int i = 0; i < sql.length; i++) {
System.out.println("SQL " + (i + 1) + ":" + sql[i]);
}
throw new RuntimeException(e);
} finally {
if (autoCommit) {
closeAll();
}
}
} else {
System.out.println("数据库连接对象没有打开!");
} return flag;
} /**
* 执行批量更新数据库操作
*
* @param sql
* 要执行的SQL语句的集合
* @return boolean true:执行成功,false:执行失败
*/
public boolean execUpdate(List<?> sql) {
return execUpdate(sql.toArray());
} /**
* 执行数据库查询操作
*
* @param sql
* 要执行的SQL语句
* @param args
* 查询参数列表
* @return ResultSet 返回查询的结果集对象
*/
public ResultSet execQuery(String sql, Object... args) {
rs = null;
// 判断连接数据库是否成功
if (openConnection) {
try {
ps = connection.prepareStatement(sql);
// 设置参数
if (args != null && args.length > 0) {
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
} rs = ps.executeQuery();
} catch (SQLException e) {
if (autoCommit) {
closeAll();
}
System.out.println("SQL:" + sql);
throw new RuntimeException(e);
}
} else {
System.out.println("数据库连接对象没有打开!");
} return rs;
} /**
* 执行数据库查询操作
*
* @param sql
* 要执行的SQL语句
* @param args
* 查询参数列表
* @return ResultSet 返回查询的结果集对象
*/
public ResultSet execQuery(String sql, List<?> args) {
return execQuery(sql, args.toArray());
} /**
* 根据标准SQL查询数据库,返回一个int值
*
* @param sql
* 要执行的SQL语句
* @param args
* 查询参数列表
* @return int值,如果出错则返回-1
*/
public int findForInt(String sql, Object... args) {
ResultSet rs = execQuery(sql, args);
int count = -1;
try {
if (rs != null && rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
if (autoCommit) {
closeAll();
}
} return count;
} /**
* 根据标准SQL查询数据库,返回一个int值
*
* @param sql
* 要执行的SQL语句
* @param args
* 查询参数列表
* @return int值,如果出错则返回-1
*/
public int findForInt(String sql, List<?> args) {
return findForInt(sql, args.toArray());
} /**
* 关闭所有数据库连接对象
*/
public void closeAll() {
if (rs != null || ps != null || statement != null || connection != null) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
rs = null;
if (ps != null || statement != null || connection != null) {
try {
if (ps != null && !ps.isClosed()) {
ps.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
ps = null;
if (statement != null || connection != null) {
try {
if (statement != null && !statement.isClosed()) {
statement.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
statement = null;
try {
if (connection != null
&& !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
connection = null;
}
}
}
}
}
}
}
} /**
* 提交事务并关闭数据库连接
*/
public void commit() {
try {
if (!autoCommit) {
connection.commit();
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
autoCommit = true;
closeAll();
}
} /**
* 回滚事务并关闭数据库连接
*/
public void rollback() {
try {
if (!autoCommit) {
connection.rollback();
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
autoCommit = true;
closeAll();
}
} public DataSource getDataSource() {
return dataSource;
} public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
} public String getDriver() {
return driver;
} public void setDriver(String driver) {
this.driver = driver;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public boolean getAutoCommit() {
return autoCommit;
} public void setAutoCommit(boolean autoCommit) {
try {
connection.setAutoCommit(autoCommit);
} catch (SQLException e) {
closeAll();
throw new RuntimeException(e);
}
this.autoCommit = autoCommit;
} public boolean getOpenConnection() {
return openConnection;
} public String getJndiName() {
return jndiName;
} public void setJndiName(String jndiName) {
this.jndiName = jndiName;
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public Connection getConnection() {
return connection;
} /**
* 测试数据库连接是否成功
*
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=demo";
String user = "sa";
String pwd = "sa"; CommonSql commonSql = new CommonSql(driver, url, user, pwd);
if (commonSql.openConnection()) {
System.out.println("数据库连接成功!");
DatabaseMetaData dbMetaData = commonSql.getConnection()
.getMetaData();
System.out
.print("当前连接的数据库是:" + dbMetaData.getDatabaseProductName());
System.out.println(" " + dbMetaData.getDatabaseProductVersion());
} else {
System.out.println("数据库连接失败!");
} commonSql.closeAll();
}
}
用于JDBC操作数据库的公共类的更多相关文章
- JDBC操作数据库的学习(1)
单单对数据库的操作,比如说MySQL,我们可以在命令行窗口中执行,但是一般是应用程序要操作数据库,因此我们应该在程序中的代码上体现对数据库的操作,那么使用程序应用如何操作数据库呢?那就要使用到数据库的 ...
- JDBC操作数据库的三种方式比较
JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...
- Java笔记(第七篇 JDBC操作数据库)
JDBC是连接数据库和java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作.学习java语言,必须学习JDBC技术,因为JDBC技术实在java语言中被广泛使用的一种操作数据库 ...
- JDBC操作数据库的学习(2)
在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...
- Spring入门(十五):使用Spring JDBC操作数据库
在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...
- JDBC操作数据库的基本操作
JDBC操作数据库的基本步骤: 1)加载(注册)数据库驱动(到JVM). 2)建立(获取)数据库连接. 3)创建(获取)数据库操作对象. 4)定义操作的SQL语句. 5)执行数据库操作. 6)获取并操 ...
- JDBC操作数据库实例
jdbc操作数据库实例 1.jdbc创建数据库 1.1 前提条件 1.拥有创建和删除表的权限 2.数据库已经启动,且可用 1.2 jdbc创建数据库表的步骤: 导包:导入需要进行数据库编程的 JDBC ...
- Java基础之原生JDBC操作数据库
前言 日常开发中,我们都习惯了使用ORM框架来帮我们操作数据库,本文复习.记录Java如何使用原生JDBC操作数据库 代码编写 封装几个简单方法 find查询方法 findOne查询方法 update ...
- Spark Streaming通过JDBC操作数据库
本文记录了学习使用Spark Streaming通过JDBC操作数据库的过程,源数据从Kafka中读取. Kafka从0.10版本提供了一种新的消费者API,和0.8不同,因此Spark Stream ...
随机推荐
- 使用streaming window函数统计用户不同时间段平均消费金额等指标
场景 现在餐厅老板已经不满足仅仅统计历史用户消费金额总数了,他想知道每个用户半年,每个月,每天,或者一小时消费的总额,来店消费的次数以及平均金额. 给出的例子计算的是每5秒,每30秒,每1分钟的用户消 ...
- MVC权限管理系统dwpro项目权限按钮无故自动消失问题
关于那个权限按钮丢失的问题修改方法如下: 把源文件中的XmlConfig文件夹里的Config.xml文件剪切到根目录下,并修改文件名为:app.config(关键是后缀不是xml了是config) ...
- PAT乙级 1014. 福尔摩斯的约会 (20)
1014. 福尔摩斯的约会 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大侦探福尔摩斯接到一张奇怪的 ...
- UBoot讲解和实践-----------讲解(一)
Boot Loader之ARM Uboot移植 阶段一 理论篇 1.boot loader需要完成的任务: 1>设计程序的入口地址 2&g ...
- 使用UEFI BIOS Updater(UBU)来更新CPU微代码
原文地址:http://www.win-raid.com/t154f16-Tool-Guide-News-quot-UEFI-BIOS-Updater-quot-UBU.html 链接: http:/ ...
- 第一轮复习Servlet day04
* 数据的传送接收:后台通过request发送:req.setAttribute("emps", list); req.getRequestDispatcher("emp ...
- V4L2应用程序框架--一【转】
本文转载自:http://blog.csdn.net/tommy_wxie/article/details/11369667 V4L2是V4L的升级版本,linux下视频设备程序提供了一套接口规范. ...
- How To Set Up vsftpd on CentOS 6
About vsftpd 警告:FTP是天生不安全.如果你必须使用FTP,考虑securing your FTP connection with SSL/TLS.否则,最好use SFTP, a se ...
- declare和typeset DEMO
declare=typeset,用法完成相同. declare不指定变量:显示所有变量的值. -r选项,把指定变量定义为只读变量: [xiluhua@vm-xiluhua][~]$ declare - ...
- JavaEE基础(十九)/异常和File
1.异常(异常的概述和分类) A:异常的概述 异常就是Java程序在运行过程中出现的错误. B:异常的分类 通过API查看Throwable Error 服务器宕机,数据库崩溃等 Exception ...