java-jdbc操作详细代码分享

使用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>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值