java连接数据库——JDBC连接数据库
DBUtil.java // 数据库操作文件
package com.bjpowernode.jdbc.util; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class DBUtil { private static String driver ; private static String url ; private static String uname ; private static String pwd ; static{ try { //创建集合类对象 Properties properties = new Properties(); //把文件封装成字节输入流 InputStream inStream = new FileInputStream(new File("./src/DBConfig.properties"));
/*
等同于 ResourceBundle isStream = ResourceBundle.getBundle("com.bjpowernode.jdbc.util.DBConfig"); //注意:DBConfig 不要添加后缀
*/ //把字节流加载到集合类中,在内存中以key和value的格式形成 properties.load(inStream); //通过key获得value driver = properties.getProperty("driver"); url = properties.getProperty("url"); uname = properties.getProperty("uname"); pwd = properties.getProperty("pwd"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("读取配置文件失败!",e); } } //获得连接 public static Connection getConnection (){ Connection conn = null; try { //1:注册驱动 Class.forName(driver); conn = DriverManager.getConnection(url,uname,pwd); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("连接数据库失败!",e); } return conn; } //释放资源 public static void close(ResultSet rs ,Statement pstm ,Connection conn){ try{ if (rs != null){ rs.close(); } }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("rs关闭失败!",e); } try{ if (pstm != null){ pstm.close(); } }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("pstm关闭失败!",e); } try{ if (conn != null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("conn关闭失败!",e); } } //开启事务 public static void beginTransaction(Connection conn){ try { if(conn != null){ conn.setAutoCommit(false); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("开启事务失败!",e); } } //提交事务 public static void commit(Connection conn){ try { if(conn != null){ conn.commit(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("提交事务失败!",e); } } //回滚事务 public static void rollback(Connection conn){ try { if(conn != null){ conn.rollback(); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("回滚事务失败!",e); } } }
Transfer_transaction.java // 调用数据库文件
package com.bjpowernode.jdbc.transfer; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.bjpowernode.jdbc.util.DBUtil; public class Transfer_transaction { public static void main(String[] args) { transfer("zs","ls",100); } /** * * @param from_act : 转出账户 * @param to_act :转入账户 * @param money : 转账金额 */ private static void transfer(String from_act, String to_act, double money) { /*if(转出账户的金额 >= 转账金额){ 转出账户 - 转账金额 转入账户 + 转账金额 }else{ 提示余额不足 }*/ Connection conn = null; //转出账户的金额 try { //事务是针对连接开启的 conn = DBUtil.getConnection(); //开启事务 DBUtil.beginTransaction(conn); double from_money = getMoneyByAct(conn,from_act); if(from_money >= money){//转出账户的金额 >= 转账金额 //转账 //转出账户 - 转账金额 updateMoneyByAct(conn,from_money-money,from_act); //转入账户的金额 double to_money = getMoneyByAct(conn,to_act); //模拟异常 // Integer.parseInt("abc"); //转入账户+ 转账金额 updateMoneyByAct(conn,to_money+money,to_act); //提交事务 DBUtil.commit(conn); System.out.println("转账成功!"); }else{//提示余额不足 System.out.println("余额不足!"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("转账失败!"); //回滚事务 DBUtil.rollback(conn); }finally{ DBUtil.close(null, null, conn); } } /** * 通过账户修改账户金额 * * @param money : 需要修改的金额 * @param act : 账户名称 */ private static void updateMoneyByAct(Connection conn ,double money, String act) { // TODO Auto-generated method stub // Connection conn = null; PreparedStatement pstm = null; try { // conn = DBUtil.getConnection(); String sql = "update t_account set money = ? where act_no = ?"; pstm = conn.prepareStatement(sql); pstm.setDouble(1, money); pstm.setString(2, act); pstm.executeUpdate(); } catch (Exception e) { // TODO: handle exception throw new RuntimeException("修改金额失败",e); }finally{ DBUtil.close(null, pstm, null); } } /** * 通过账户查询账户金额 * @param act * @return */ private static double getMoneyByAct(Connection conn ,String act) { // Connection conn = null; PreparedStatement pstm = null; ResultSet rs = null; double from_money = 0; try { //获得连接 // conn = DBUtil.getConnection(); String sql = "select money from t_account where act_no = ?"; //创建数据库操作对象 pstm = conn.prepareStatement(sql); //为占位符号赋值 pstm.setString(1, act); //执行sql rs = pstm.executeQuery(); /*while(rs.next()){ from_money = rs.getDouble("money"); } if(rs.next()){ from_money = rs.getDouble("money"); } */ from_money = rs.next()?rs.getDouble("money"):0; } catch (Exception e) { throw new RuntimeException("查询账户余额失败!",e); }finally{ DBUtil.close(rs, pstm, null); } return from_money; } }
DBConfig.properties //数据库配置文件
driver=com.mysql.jdbc.Driver url=jdbc\:mysql\://127.0.0.1\:3366/bjpowernode uname=root pwd=root