一、JDBC数据库连接通用数据访问层(JDBCDBManager.java)
代码如下:
package com.myhome.dao;
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.sql.Statement;
/**
* JDBC数据库连接通用数据访问层
* */
public class JDBCDBManager {
// private static final String DRIVER_CLASS = "org.gjt.mm.mysql.Driver";
//mySql驱动类的完全限定名和数据库连接字符串
String mySqlDriverString="org.gjt.mm.mysql.Driver";
String mySqlConnString="jdbc:mysql://localhost:3306/blog?user=root&password=root";
//sqlserver驱动类的完全限定名和数据库连接字符串
String sqlserverDriverString="com.microsoft.jdbc.sqlserver.SQLServerDriver";
String sqlserverConnString="jdbc:sqlserver://localhost:1433;DatabaseName=google_snack";
//oracle驱动类的完全限定名和数据库连接字符串 (localhost为本地主机或ip地址如222.23.162.221)
String oracleDriverString="oracle.jdbc.driver.OracleDriver";
String oracleConnString="jdbc:oracle:thin:@localhost:1521:orcl";
/**
* 获取JDBC数据库访问连接对象
* @throws ClassNotFoundException
* @throws SQLException
* */
public Connection getConnection() throws ClassNotFoundException, SQLException{
// /*-------------------------mySql---------------------------------------*/
// //加载mySql数据库驱动类加载到内存中
// Class.forName(mySqlDriverString);
// //获取mySql数据库连接,通过驱动程序管理器DriverManager获取连接对象mySqlConn,mySqlConn连接的服务器和数据库信息在连接字符串中
// Connection mySqlConn=DriverManager.getConnection(mySqlConnString);
// //返回mySql连接
// return mySqlConn;
// /*------------------------sqlserver----------------------------------------*/
// //加载sqlserver数据库驱动类加载到内存中
// Class.forName(sqlserverDriverString);
// //获取sqlserver数据库连接,通过驱动程序管理器DriverManager获取连接对象sqlserverConn,sqlserverConn连接的服务器和数据库信息在连接字符串中
// Connection sqlserverConn=DriverManager.getConnection(sqlserverConnString,"sa","sa");
// //返回sqlserver连接
// return sqlserverConn;
/*------------------------oracle----------------------------------------*/
//加载oracle数据库驱动类加载到内存中
Class.forName(oracleDriverString);
//获取oracle数据库连接,通过驱动程序管理器DriverManager获取连接对象oracleConn,oracleConn连接的服务器和数据库信息在连接字符串中
Connection oracleConn=DriverManager.getConnection(oracleConnString,"kekeai","kekeai123");
//返回oracle连接
return oracleConn;
}
/**
* 为sql语句占位符参数赋值
* @throws SQLException
* */
public void operateParameters(PreparedStatement pstmt,Object...args) throws SQLException{
if(args!=null&&args.length>0){
for (int i = 0; i < args.length; i++) {
//为sql语句的占位符 ? 赋值从1开始的
pstmt.setObject(i + 1, args[i]);
}
}
}
/**
* 释放数据库连接和操作占用的资源(注意关闭顺序)
* @throws SQLException
* */
public void closeResource(Connection conn,PreparedStatement pstmt,ResultSet rs) throws SQLException{
//关闭结果集
if(rs!=null){
rs.close();
rs=null;
}
//关闭sql载体和执行对象
if(pstmt!=null){
pstmt.close();
pstmt=null;
}
//关闭数据库连接对象
if(conn!=null&&!conn.isClosed()){
conn.close();
conn=null;
}
}
/**
* 数据库数据更新(添加、删除、修改)
* @throws Exception
* */
public int executeUpdate(String sql,Object...args) throws Exception{
//数据库连接对象
Connection conn=null;
//发送sql语句到数据库(载体)并执行sql语句
/* PreparedStatement可以防止sql注入,因此安全,并且性能更优越
* Statement对象将sql语句发送到数据库后,数据库要做3件事,如下
* 1分析语句
* 2编译
* 3执行
* 而PreparedStatement将sql语句发送到数据库后第一次做如上3件事,以后只做第3件事,因此效率更好
* */
PreparedStatement pstmt=null;
Statement stmt=null;
//更新影响的数据库行数
int rowCount=0;
try {
//获取数据库连接
conn=getConnection();
//分析、便宜、执行sql语句
pstmt=conn.prepareStatement(sql);
operateParameters(pstmt, args);
//将sql语句发送到数据库中,并执行,rowCount是影响的行数 >0表示成功 否则表示失败
rowCount=pstmt.executeUpdate();
} catch (Exception e) {
//向控制台打印错误信息
e.printStackTrace();
//抛出自定义的异常
throw new Exception("数据插入失败");
}finally{
//释放资源
closeResource(conn, pstmt, null);
}
//返回影响行数
return rowCount;
}
/**
* 数据数据查询,返回ResultSet
* 多条记录返回用list集合(在jndi中)
* @throws Exception
* */
public ResultSet executeQuery(String sql,Object ... args) throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
/*
rs必须在数据库连通的情况下获取数据。 rs默认情况下,指向表头
rs调用next()方法,表示向下移动一条记录,返回boolean值,true:有数据,false:没有数据
rs同一时刻只能指向一条记录 rs下去就回不来
String sql = "select id,username,age from " + tablename;
rs只表示结果集中的数据,不能表示表头,表头例如:id,username,age,如果要取表头,需要使用ResultSetMetaData接口
*/
conn = getConnection();
pstmt = conn.prepareStatement(sql);
operateParameters(pstmt, args);
rs = pstmt.executeQuery();
// 获取表的架构(即表结构信息,如列名称,列类型)信息,ResultSetMetaData专门获取表架构信息
ResultSetMetaData rsm = rs.getMetaData();
System.out.print(rsm.getColumnName(1));
System.out.print("\t");
System.out.print(rsm.getColumnName(2));
System.out.print("\t");
System.out.print(rsm.getColumnName(3));
System.out.println();
while (rs.next()) {
System.out.print(rs.getString("username") + "\t");
System.out.print(rs.getString("userpass") + "\t");
System.out.print(rs.getString(3) + "\t");
System.out.println("");
}
//返回数据库查询结果集(内存中)
return rs;
}
}
二、使用junit用例测试JDBCDBManager类
Junit测试的java类:
junit测试类结构:
junit测试类代码:
package com.myhome.test;
import static org.junit.Assert.*;
import java.sql.Connection;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.myhome.dao.JDBCDBManager;
public class JDBCDBManagerTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {}
@AfterClass
public static void tearDownAfterClass() throws Exception {}
@Before
public void setUp() throws Exception {}
@After
public void tearDown() throws Exception {}
@Test
public void testExecuteUpdate() throws Exception {
JDBCDBManager manager=new JDBCDBManager();
Connection conn=manager.getConnection();
// String sql="insert into users(username,userpass) values(?,?)";
// Object [] args=new Object[]{"窗前明月光","地上鞋两双"};
// manager.executeQuery(sql,args);
String sql="insert into users(username,userpass) values('淡淡','蛋蛋')";
manager.executeUpdate(sql);
}
@Test
public void testExecuteQuery() throws Exception {
JDBCDBManager manager=new JDBCDBManager();
Connection conn=manager.getConnection();
String sql="select * from users";
manager.executeQuery(sql, null);
}
}