jdbc连接

这篇博客介绍了JDBC连接数据库的方法,包括通过`jdbc.properties`配置文件读取数据库连接信息。同时,文章详细讲解了数据库事务的概念,强调了事务的原子性和一致性,并展示了如何在Java中设置手动提交事务以及在出现异常时进行回滚操作的例子。内容涵盖了通用的增删改操作和事务处理,确保数据操作的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC推荐连接

package study.util;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    /*
    * 操作数据库的工具类
    * 获取数据库的连接*/
    public static Connection getConnection() throws Exception {
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
        Properties pros = new Properties();
        pros.load(is);

        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");

        Class.forName(driverClass);

        Connection con = DriverManager.getConnection(url,user,password);
        return con;
    }
    /*
    * 关闭连接Statement操作*/
    public static void closeReduce(Connection con, Statement ps){
        //关闭资源
        try {
            if(ps!=null)
                ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(con!=null)
                con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /*
     * 关闭连接Statement操作*/
    public static void closeReduce(Connection con, Statement ps,ResultSet rs){
        //关闭资源
        try {
            if(ps!=null)
                ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(con!=null)
                con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(rs!=null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

JDBC连接方式汇总

package study.transaction;

import org.junit.Test;
import study.util.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ConnectionTest {
/*
* 1、什么是数据库事务
*   1>一组逻辑操作单元,使数据从一种状态转变为另一种状态
* 2、事务处理原则:
*保证所有事务都作为一个工作单元来执行,
* 即使出现了故障,都不能改变这种执行方 式。
* 当在一个事务中执行多个操作时,
* 要么所有的事务都被提交(commit),
* 那么这些修改就永久地保存下来;
 * 要么数据库管理系统将放弃所作的所有修改,
* 整个事务回滚(rollback)到初状态。
*
* 3、数据一旦提交,就不可以回滚
*
* 4、哪些操作会导致数据自动提交
*       》DDL一旦操作,都会自动提交
*       》DML默认情况下,一旦执行,就会自动提交
*       set autocommit=false
*       》默认关闭时,会自动提交数据
 * */

    @Test
    public void testUpdate(){
        /*
        * 未考虑数据事务后的转账操作
        * 针对于数据表
        * update books set price=price+50 where id=27;
        * */
        String sql="update books set price=price+50 where id=?";
        update(sql,27);
        System.out.println("添加成功");

       /* //模拟网络异常(抛异常)
        System.out.println(10/0);*/
    }
    //通用的增删改操作
    public int update(String sql,Object ...args) {
        Connection con = null;
        PreparedStatement ps = null;
        try {
            //1、获取数据库的连接
            con = JDBCUtils.getConnection();
            //2、预编译sql语句,返回PreparedStatement的实例
            ps = con.prepareStatement(sql);
            //3、填充占位符
            for(int i=0;i<args.length;i++){
                ps.setObject(i+1,args[i]);
            }
            //4、执行
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //5、关闭资源
            JDBCUtils.closeReduce(con,ps);
        }
        return 0;
    }


    @Test
    public void testUpadateWitTx() {
        Connection con = null;
        try {
            con = JDBCUtils.getConnection();
            /*
             * 未考虑数据事务后的转账操作
             * 针对于数据表
             * update books set price=price+50 where id=27;
             * */

            //取消数据的自动提交
            con.setAutoCommit(false);
            String sql="update books set price=price-50 where id=?";
            update1(con,sql,27);
            System.out.println("添加成功");
            //提交数据
            con.commit();
        } catch (Exception e) {
            e.printStackTrace();
            //回滚数据
            try {
                con.rollback();//回滚数据
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }finally {
            JDBCUtils.closeReduce(con,null);
        }
    }

    //考虑数据事务后的转账操作
    //通用的增删改操作
    public int update1(Connection con,String sql,Object ...args) {
        PreparedStatement ps = null;
        try {
            //1、预编译sql语句,返回PreparedStatement的实例
            ps = con.prepareStatement(sql);
            //2、填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            //3、执行
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            try {
                //修改其为自动提交数据
                //主要针对于使用数据库连接池时
                con.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            //5、关闭资源
            JDBCUtils.closeReduce(null, ps);
        }
        return 0;
    }
    @Test
    public void testGetConnectionTest() throws Exception {
        Connection con =null;

            con = JDBCUtils.getConnection();
            System.out.println(con);

            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值