您的位置:首页 > 编程语言 > Java开发

java-jdbc操作详细代码分享

2016-08-01 22:51 555 查看
使用jar包:ojdbc6.jar

coding如下:

<span style="font-size:18px;">package cn.migu.utils;

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 cn.migu.base.GlobalSettings;

/**
* <Description>数据库操作类
* @author YanLu
*
*/
public class JdbcUtil {
/**
* 声明连接数据库各个参数
* user:数据库连接的用户名
* password:数据库连接的密码
* url:要连接的数据库对象
* driverClass:数据库连接的驱动名
*/
private String user;
private String password;
private String url;
private String driverName;

private Connection conn = null;// 连接对象
private ResultSet rs = null;// 结果集对象
// private Statement sm = null;// 声明(不安全,易被sql注入)
private PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
private Log4jUtil log = new Log4jUtil(this.getClass().getName());

/**
* 构造函数,在创建对象时候执行该方法
*/
public JdbcUtil(String sql) {
this.user = GlobalSettings.getProperty("DBUser");
this.password = GlobalSettings.getProperty("DBPassword");
this.url =  GlobalSettings.getProperty("jdbc_url");
this.driverName = GlobalSettings.getProperty("driverName");
this.conn = createConnection();
try {
pre = createPreparedStatement(conn, sql);
} catch (SQLException e) {
log.info("获取预编译对象失败...");
e.printStackTrace();
}
}

/**
* 构造函数获得数据库用户名和密码
* @param user
* @param pass
*/
public JdbcUtil(String user, String password,String sql) {
this.user = user;
this.password = password;
this.url =  GlobalSettings.getProperty("jdbc_url");
this.driverName = GlobalSettings.getProperty("driverName");
this.conn = createConnection();
try {
pre = createPreparedStatement(conn, sql);
} catch (SQLException e) {
log.info("获取预编译对象失败...");
e.printStackTrace();
}
}

/**
* 连接数据库
* @return
*/
public Connection createConnection() {
try {
Class.forName(driverName).newInstance();
conn = DriverManager.getConnection(url, user, password);
log.info("数据库连接成功");
} catch (Exception e) {
log.info("数据库连接失败");
e.printStackTrace();
}
return conn;
}

/**
* 获取预编译PreparedStatement
* @param conn
* @param sql
* @return
* @throws SQLException
*/
public PreparedStatement createPreparedStatement(Connection conn, String sql) throws SQLException {
return conn.prepareStatement(sql);
}

/**
* 关闭结果集
* @param conn
*/
public void closeResultSet(ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
} catch (Exception e) {
log.info("结果集关闭失败");
e.printStackTrace();
}
}

/**
* 关闭声明
* @param conn
*/
public void closeStatement(PreparedStatement pre) {
try {
if (pre != null) {
pre.close();
}
} catch (Exception e) {
log.info("声明对象关闭失败");
e.printStackTrace();
}
}

/**
* 关闭数据库
* @param conn
*/
public void closeConnection(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (Exception e) {
log.info("数据库关闭失败");
e.printStackTrace();
}
}

/**
* 关闭资源 后打开的要先关闭,顺序不能变
* @param conn
* @param statement
* @param resultSet
*/
public void closeResources(Connection conn, PreparedStatement statement, ResultSet resultSet) {
//Statement关闭会导致ResultSet关闭; Connection关闭不一定会导致Statement关闭。
closeResultSet(resultSet);
closeStatement(statement);
closeConnection(conn);
log.info("数据库资源关闭");
}

/**
* 插入或更新数据
* 方法执行后会直接关闭所有资源
* @param sql
* @return
*/
public int update(String sql) {
//conn = createConnection();
int re = 0;
try {
conn.setAutoCommit(false);// 事物开始
// 获取预编译PreparedStatement
//pre = createPreparedStatement(conn, sql);
// 执行插入操作
re = pre.executeUpdate(sql);// re返回执行受到影响的行数。
if (re < 0) { // 插入失败,执行失败
conn.rollback(); // 回滚
closeStatement(pre);
closeConnection(conn);
return re;
}
conn.commit(); // 插入正常
closeStatement(pre);
closeConnection(conn);
//若事物成功,返回影响的行数
return re;
} catch (Exception e) {
e.printStackTrace();
}
//closeConnection(conn);
return 0;
}

/**
* 插入或更新数据
* 方法执行后会直接关闭所有资源
* @param sql
* @param param 当param有多个值时,使用数组接收
* @return
*/
public int update(String sql, String... param) {
//conn = createConnection();
int re = 0;
try {
conn.setAutoCommit(false);// 事物开始
//pre = createPreparedStatement(conn, sql);
if (null != param && param.length > 0) {
for (int i = 0; i < param.length; i++) {
//给占位符传值
pre.setString(i + 1, param[i]);//索引值从1开始
}
}
re = pre.executeUpdate();
if (re < 0) { // 更新失败
conn.rollback(); // 回滚
closeStatement(pre);
closeConnection(conn);
return re;
}
conn.commit(); // 更新正常
closeStatement(pre);
closeConnection(conn);
return re;
} catch (Exception e) {
e.printStackTrace();
}
closeConnection(conn);
return 0;
}

/**
* 查询语句 返回结果集
* 方法执行后不关闭数据库资源
* 注意,执行查询操作返回ResultSet对象,方法中未关闭PreparedStatement对象(关闭会导致ResultSet关闭)
* @param sql
* @return
*/
public ResultSet selectSql(String sql) {
conn = createConnection();
try {
pre = createPreparedStatement(conn, sql);
rs = pre.executeQuery(sql);
return rs;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/**
* 查询语句 返回结果集
* 方法执行后不关闭数据库资源
* 注意,执行查询操作返回ResultSet对象,方法中未关闭PreparedStatement对象(关闭会导致ResultSet关闭)
* @param sql
* @param param
* @return
*/
public ResultSet selectSql(String sql, String... param) {
//conn = createConnection();
try {
//pre = createPreparedStatement(conn, sql);
if (null != param && param.length > 0) {
for (int i = 0; i < param.length; i++) {
pre.setString(i + 1, param[i]);
}
}
rs = pre.executeQuery();
return rs;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/**
* 根据Result结果集对应的字段返回对应的值
* 方法执行后关闭所有资源
* @param rs
* @param param(参数的值为列名)
* @return
* @throws SQLException
*/
public String getStringByResultSet(ResultSet rs,String param){
String target=null;
if(rs!=null){
try {
while (rs.next()) {
target = rs.getString(param);
//如rs.getString("id")或rs.getString(1),若使用列的索引值参数类型需为int
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭所有数据库资源对象
closeResources(conn, pre, rs);
return target;
}

/**
* 根据结果集输出
* 方法执行后关闭所有资源
* @param rs
*/
public void printRs(ResultSet rs) {
int columnsCount = 0;
boolean f = false;
try {
if (!rs.next()) {
return;
}
ResultSetMetaData rsmd = rs.getMetaData();//ResultSetMetaData对象为:有关 ResultSet 中列的名称和类型的信息。
columnsCount = rsmd.getColumnCount();// 数据集的列数
for (int i = 0; i < columnsCount; i++) {
System.out.print(rsmd.getColumnLabel(i + 1) + "|"); // 输出列名
}
System.out.println();

while (!f) {
for (int i = 1; i <= columnsCount; i++) {
System.out.print(rs.getString(i) + "|");
}
System.out.println();
if (!rs.next()) {
f = true;
}
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
closeStatement(pre);
closeConnection(conn);
}

}
</span>


测试代码如下:

<span style="font-size:18px;">package cn.migu.test;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.testng.annotations.Test;

import cn.migu.utils.JdbcUtil;
import cn.migu.utils.Log4jUtil;

/**
* <Description> 测试JdbcUtil类
* @author YanLu
*
*/
public class TestOracle {
private Log4jUtil log = new Log4jUtil(this.getClass().getName());

/**
* 测试select操作
* @throws SQLException
*/
@Test(enabled = false)
public void testSelect() throws SQLException{
String sql = "select * from kfmh_user_info where password = ?";
JdbcUtil jdbc = new JdbcUtil(sql);
ResultSet rs=jdbc.selectSql(sql, "migu123");
if(rs!=null){
while(rs.next()){
//rs.getString(3);
log.info("查询结果正确");
}
}
log.info("密码是:"+jdbc.getStringByResultSet(rs, "user_name"));
//jdbc.printRs(jdbc.selectSql(sql, "migu123"));
}

/**
* 测试update操作
* @throws SQLException
*/
@Test
public void testUpdate() throws SQLException{
//String sql = "insert into kfmh_user_info values('test03','pass03')";
//String sql = "insert into kfmh_user_info values(?,?)";
//String sql = "delete from kfmh_user_info where user_name=? and password=?";
String sql ="update kfmh_user_info set user_name=? where password=?";
JdbcUtil jdbc = new JdbcUtil(sql);
String[] param = {"test02","pass02"};
int num = jdbc.update(sql,param);
//修改操作
log.info(num);
}

}
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: