JDBC第三篇【事务、元数据、改造JDBC工具类】(修订版)

生产级多维聚合:从业务语义到pandas工程实践 多维聚合是数据分析的核心技术,本质是将业务维度、指标口径与时间逻辑映射为可计算的结构化操作。其原理不仅涉及groupby、rolling、unstack等pandas方法的协同机制,更关键在于维度建模的业务约束——如地区编码标准、交易时间口径、空值语义区分等。技术价值体现在规避统计失真(如均值受长尾干扰)、保障跨系统结果一致性(对齐SQL逻辑)、支撑实时风控等高敏场景。典型应用场景包括银行商户风险分层、零售滚动健康度评估、反欺诈窗口检测等。本文聚焦pandas在金融生产环境中的真实落地难点,深入解析业务驱动 阅读详情

 

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

1.事务

一个SESSION所进行的所有更新操作要么一起成功,要么一起失败

举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。

事例说明:

/** 我们来模拟A向B账号转账的场景*   A和B账户都有1000块,现在我让A账户向B账号转500块钱** */    //JDBC默认的情况下是关闭事务的,下面我们看看关闭事务去操作转账操作有什么问题    //A账户减去500块    String sql = "UPDATE a SET money=money-500 ";    preparedStatement = connection.prepareStatement(sql);    preparedStatement.executeUpdate();    //B账户多了500块    String sql2 = "UPDATE b SET money=money+500";    preparedStatement = connection.prepareStatement(sql2);    preparedStatement.executeUpdate();
    //JDBC默认的情况下是关闭事务的,下面我们看看关闭事务去操作转账操作有什么问题

    //A账户减去500块
    String sql = "UPDATE a SET money=money-500 ";
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.executeUpdate();

    //B账户多了500块
    String sql2 = "UPDATE b SET money=money+500";
    preparedStatement = connection.prepareStatement(sql2);
    preparedStatement.executeUpdate();

从上面看,我们的确可以发现A向B转账,成功了。可是如果A向B转账的过程中出现了问题呢?下面模拟一下

//A账户减去500块String sql = "UPDATE a SET money=money-500 ";preparedStatement = connection.prepareStatement(sql);preparedStatement.executeUpdate();//这里模拟出现问题int a = 3 / 0;String sql2 = "UPDATE b SET money=money+500";preparedStatement = connection.prepareStatement(sql2);preparedStatement.executeUpdate();
String sql = "UPDATE a SET money=money-500 ";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeUpdate();

//这里模拟出现问题
int a = 3 / 0;


String sql2 = "UPDATE b SET money=money+500";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();

显然,上面代码是会抛出异常的,我们再来查询一下数据。A账户少了500块钱,B账户的钱没有增加。这明显是不合理的。


我们可以通过事务来解决上面出现的问题

try{    //开启事务,对数据的操作就不会立即生效。    connection.setAutoCommit(false);    //A账户减去500块    String sql = "UPDATE a SET money=money-500 ";    preparedStatement = connection.prepareStatement(sql);    preparedStatement.executeUpdate();    //在转账过程中出现问题    int a = 3 / 0;    //B账户多500块    String sql2 = "UPDATE b SET money=money+500";    preparedStatement = connection.prepareStatement(sql2);    preparedStatement.executeUpdate();    //如果程序能执行到这里,没有抛出异常,我们就提交数据    connection.commit();    //关闭事务【自动提交】    connection.setAutoCommit(true);} catch (SQLException e) {    try {        //如果出现了异常,就会进到这里来,我们就把事务回滚【将数据变成原来那样】        connection.rollback();        //关闭事务【自动提交】        connection.setAutoCommit(true);    } catch (SQLException e1) {        e1.printStackTrace();    }
    //开启事务,对数据的操作就不会立即生效。
    connection.setAutoCommit(false);

    //A账户减去500块
    String sql = "UPDATE a SET money=money-500 ";
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.executeUpdate();

    //在转账过程中出现问题
    int a = 3 / 0;

    //B账户多500块
    String sql2 = "UPDATE b SET money=money+500";
    preparedStatement = connection.prepareStatement(sql2);
    preparedStatement.executeUpdate();

    //如果程序能执行到这里,没有抛出异常,我们就提交数据
    connection.commit();

    //关闭事务【自动提交】
    connection.setAutoCommit(true);


} catch (SQLException e) {
    try {
        //如果出现了异常,就会进到这里来,我们就把事务回滚【将数据变成原来那样】
        connection.rollback();

        //关闭事务【自动提交】
        connection.setAutoCommit(true);
    } catch (SQLException e1) {
        e1.printStackTrace();
    }

上面的程序也一样抛出了异常,A账户钱没有减少,B账户的钱也没有增加。

注意:当Connection遇到一个未处理的SQLException时,系统会非正常退出,事务也会自动回滚,但如果程序捕获到了异常,是需要在catch中显式回滚事务的。


savapoint

我们还可以使用savepoint设置中间点。如果在某地方出错了,我们设置中间点,回滚到出错之前即可。

应用场景:现在我们要算一道数学题,算到后面发现算错数了。前面的运算都是正确的,我们不可能重头再算【直接rollback】,最好的做法就是在保证前面算对的情况下,设置一个保存点。从保存点开始重新算。

注意:savepoint不会结束当前事务,普通提交和回滚都会结束当前事务的


事务的隔离级别

数据库定义了4个隔离级别:

  1. Serializable【可避免脏读,不可重复读,虚读】

  2. Repeatable read【可避免脏读,不可重复读】

  3. Read committed【可避免脏读】

  4. Read uncommitted【级别最低,什么都避免不了】

分别对应Connection类中的4个常量

  1. TRANSACTION_READ_UNCOMMITTED

  2. TRANSACTION_READ_COMMITTED

  3. TRANSACTION_REPEATABLE_READ

  4. TRANSACTION_SERIALIZABLE


脏读:一个事务读取到另外一个事务未提交的数据

例子:A向B转账,A执行了转账语句,但A还没有提交事务,B读取数据,发现自己账户钱变多了!B跟A说,我已经收到钱了。A回滚事务【rollback】,等B再查看账户的钱时,发现钱并没有多。


不可重复读:一个事务读取到另外一个事务已经提交的数据,也就是说一个事务可以看到其他事务所做的修改

注:A查询数据库得到数据,B去修改数据库的数据,导致A多次查询数据库的结果都不一样【危害:A每次查询的结果都是受B的影响的,那么A查询出来的信息就没有意思了】


虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

注:和不可重复读类似,但虚读(幻读)会读到其他事务的插入的数据,导致前后读取不一致


简单总结:脏读是不可容忍的,不可重复读和虚读在一定的情况下是可以的【做统计的肯定就不行】。


2.元数据

什么是元数据

元数据其实就是数据库,表,列的定义信息

为什么我们要用元数据

即使我们写了一个简单工具类,我们的代码还是非常冗余。对于增删改而言,只有SQL和参数是不同的,我们为何不把这些相同的代码抽取成一个方法?对于查询而言,不同的实体查询出来的结果集是不一样的。我们要使用元数据获取结果集的信息,才能对结果集进行操作。


3.改造JDBC工具类

问题:我们对数据库的增删改查都要连接数据库,关闭资源,获取PreparedSteatment对象,获取Connection对象此类的操作,这样的代码重复率是极高的,所以我们要对工具类进行增强

增删改

//我们发现,增删改只有SQL语句和传入的参数是不知道的而已,所以让调用该方法的人传递进来//由于传递进来的参数是各种类型的,而且数目是不确定的,所以使用Object[]public static void update(String sql, Object[] objects) {    Connection connection = null;    PreparedStatement preparedStatement = null;    ResultSet resultSet = null;    try {        connection = getConnection();        preparedStatement = connection.prepareStatement(sql);        //根据传递进来的参数,设置SQL占位符的值        for (int i = 0; i < objects.length; i++) {            preparedStatement.setObject(i + 1, objects[i]);        }        //执行SQL语句        preparedStatement.executeUpdate();    } catch (Exception e) {        e.printStackTrace();}

//由于传递进来的参数是各种类型的,而且数目是不确定的,所以使用Object[]

public static void update(String sql, Object[] objects) {

    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;

    try {
        connection = getConnection();
        preparedStatement = connection.prepareStatement(sql);

        //根据传递进来的参数,设置SQL占位符的值
        for (int i = 0; i < objects.length; i++) {
            preparedStatement.setObject(i + 1, objects[i]);
        }

        //执行SQL语句
        preparedStatement.executeUpdate();


    } catch (Exception e) {
        e.printStackTrace();
}

查询

/*    1:对于查询语句来说,我们不知道对结果集进行什么操作【常用的就是把数据封装成一个Bean对象,封装成一个List集合】    2:我们可以定义一个接口,让调用者把接口的实现类传递进来    3:这样接口调用的方法就是调用者传递进来实现类的方法。【策略模式】*///这个方法的返回值是任意类型的,所以定义为Object。public static Object query(String sql, Object[] objects, ResultSetHandler rsh) {    Connection connection = null;    PreparedStatement preparedStatement = null;    ResultSet resultSet = null;    try {        connection = getConnection();        preparedStatement = connection.prepareStatement(sql);        //根据传递进来的参数,设置SQL占位符的值        if (objects != null) {            for (int i = 0; i < objects.length; i++) {                preparedStatement.setObject(i + 1, objects[i]);            }        }        resultSet = preparedStatement.executeQuery();        //调用调用者传递进来实现类的方法,对结果集进行操作        return rsh.hanlder(resultSet);}
//这个方法的返回值是任意类型的,所以定义为Object。
public static Object query(String sql, Object[] objects, ResultSetHandler rsh) {

    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;

    try {
        connection = getConnection();
        preparedStatement = connection.prepareStatement(sql);

        //根据传递进来的参数,设置SQL占位符的值
        if (objects != null) {
            for (int i = 0; i < objects.length; i++) {
                preparedStatement.setObject(i + 1, objects[i]);
            }
        }


        resultSet = preparedStatement.executeQuery();

        //调用调用者传递进来实现类的方法,对结果集进行操作
        return rsh.hanlder(resultSet);
}

接口:

/** 定义对结果集操作的接口,调用者想要对结果集进行什么操作,只要实现这个接口即可* */public interface ResultSetHandler {     Object hanlder(ResultSet resultSet);}
public interface ResultSetHandler {
     Object hanlder(ResultSet resultSet);

}

实现类:

//接口实现类,对结果集封装成一个Bean对象public class BeanHandler implements ResultSetHandler {    //要封装成一个Bean对象,首先要知道Bean是什么,这个也是调用者传递进来的。    private Class clazz;    public BeanHandler(Class clazz) {        this.clazz = clazz;    }    @Override    public Object hanlder(ResultSet resultSet) {        try {            //创建传进对象的实例化            Object bean = clazz.newInstance();            if (resultSet.next()) {                //拿到结果集元数据                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();                for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {                    //获取到每列的列名                    String columnName = resultSetMetaData.getColumnName(i+1);                    //获取到每列的数据                    String columnData = resultSet.getString(i+1);                    //设置Bean属性                    Field field = clazz.getDeclaredField(columnName);                    field.setAccessible(true);                    field.set(bean,columnData);                }                //返回Bean对象                return bean;            }
public class BeanHandler implements ResultSetHandler {


    //要封装成一个Bean对象,首先要知道Bean是什么,这个也是调用者传递进来的。
    private Class clazz;

    public BeanHandler(Class clazz) {
        this.clazz = clazz;
    }

    @Override
    public Object hanlder(ResultSet resultSet) {

        try {

            //创建传进对象的实例化
            Object bean = clazz.newInstance();

            if (resultSet.next()) {

                //拿到结果集元数据
                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

                for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {

                    //获取到每列的列名
                    String columnName = resultSetMetaData.getColumnName(i+1);

                    //获取到每列的数据
                    String columnData = resultSet.getString(i+1);

                    //设置Bean属性
                    Field field = clazz.getDeclaredField(columnName);
                    field.setAccessible(true);
                    field.set(bean,columnData);
                }

                //返回Bean对象
                return bean;
            }

何为策略模式?可以看这篇:策略模式原来就这么简单!

最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg

有帮助?好看!转发! 640



JDBC事务 是并发控制的单元,是用户定义的一个操作序列。这些操作要么都成功,要么都失败,是一个不可分割的工作单位。通过事务,SqlServer能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。事务通常是以begin transaction开始,以commit或rollback结束。Commit表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写到磁盘上的物理数据库中去,事务正常结束。 阅读详情

相关推荐

JDBC读取数据库元数据,生成JAVA实体类,SQL语句,Mybatis动态sql语句

JDBC读取数据库元数据,生成JAVA实体类,SQL语句,Mybatis动态sql语句,详细内容见博客地址https://blog.youkuaiyun.com/zi971553/article/details/82862039

JDBC第三篇--【事务、元数据、改造JDBC工具类】

这是我JDBC的第一篇 http://blog.youkuaiyun.com/hon_3y/article/details/53535798 这是我JDBC的第二篇 http://blog.youkuaiyun.com/hon_3y/article/details/53725446 1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出...

3y 441

hive元数据导入sql生成工具

hive元数据生成工具-基于CDH4.7.0版本

grails 配置mysql

grails 配置mysql数据库 修改DataSource.groovy dataSource { pooled = true jmxExport = true driverClassName = "com.mysql.jdbc.Driver" username = "root" password = "123456" } hibernate { c

sermo的博客 685

使用C3P0改造JDBC对数据库的连接

主要为大家详细介绍了使用C3P0改造JDBC对数据库的连接,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

智能化运维(AIOps)

• 调查显示,54.79%的企业当前着重关注智能运维的质量领域(包括异常检测、告警收敛、根因分析、 故障处置等)能力建设,其次45.77%的企业关注效率领域,45.49%的企业关注成本领域,30.82%的 企业关注安全领域。从目前的发展情况来看,现阶段AIOps能力大多集中在L2级别, 主要以系统辅助分析,帮助人工进行决策和操作为主,较为领先的 能力实践可以达到L3级别,而L4和L5级别随着AIOps的技术发展 和能力的逐步增强,将是未来智能运维能力建设的发展方向和目标。

追求更专业的设计 3101

连接池改造JDBC工具类

省略实例。。。

wh1132633619的博客 370

《数学建模与数学实验》第5版 线性规划 习题3.4

1. 某鸡场有1000只鸡,用动物饲料和谷物混合喂养. 2. 某工厂用A1,A2两台机床加工B1,B2,B3三种不同零件. 3. 某工厂利用两种原料甲、乙生产$A_1、A_2、A_3$三种产品. 4. 每班的护士在值班开始时向病房报到,连续工作8个小时. 5. 某工厂生产 A1 、A2 两种型号的产品 6. 有两个煤厂A,B 7. 某工厂制造三种产品,生产这三种产品需要三种资源 8. 已知某工厂计划生产1,2,3三种产品,各产品需要在ABC设备加工。...

hexiaosi_的博客 2万+

jdbc封装工具类代码_JDBC第三篇「事务、元数据、改造JDBC工具类」(修订版)

1.事务一个SESSION所进行的所有更新操作要么一起成功,要么一起失败举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。事例说明:/** 我们来模拟A向B账号转账的场景* A和B账户都有1000块,现在我让A账户向B账号转500块钱** */ //JDBC默认的情况下是关闭事务的,下面我们看看关闭事务去操作转账操作有什么问题 //...

weixin_39941792的博客 213

Prometheus+Grafana部署及企业微信邮件/群消息告警通知配置

本文详细介绍了在Ubuntu 22.04系统上部署普罗米修斯监控系统的完整流程。首先说明了系统配置要求(2核CPU、4G内存、100G硬盘),然后分步骤指导下载、解压和安装普罗米修斯服务。文章包含配置prometheus.yml文件、启动服务、设置系统服务等关键操作,并提供了访问9090端口验证服务的方法。接着介绍了通过node_exporter监控Linux主机的配置过程,包括安装、启动服务和修改普罗米修斯配置文件添加监控项。最后还涉及了mysqld_exporter的部署流程,用于监控MySQL数据库服

m0_58761900的博客 1638

FPGA数字下变频实战:用Vivado DDS IP核实现IQ采样与频率校正(附MATLAB仿真对比)

本文提供了一份基于Vivado DDS IP核实现FPGA数字下变频(DDC)的完整工程指南。详细阐述了IQ采样的原理、DDC链路构建、DDS频率校正的工程实现,并重点介绍了如何利用MATLAB搭建黄金参考模型进行全链路仿真与对比验证,分享了关键的调试技巧与性能优化建议。

t1u2v的博客 810

unable to acquire jdbc connection总结_JDBC第三篇【事务、元数据、改造JDBC工具类】(修订版)...

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y1.事务一个SESSION所进行的所有更新操作要么一起成功,要么一起失败举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。事例说明:/**我们来模拟A向B账号转账的场景*A和...

weixin_39709674的博客 1161

stm32驱动NRF24L01_原理+代码解析

NRF24L01是NORDIC公司生产的一款无线通信通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。①2.4G全球开放的ISM频段,免许可证使用。②最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。③126个可选的频道,满足多点通信和调频通信的需要。④内置CRC检错和点对多点的通信地址控制。⑤可设置自动应答,确保数据可靠传输。//NRF24L01寄存器操作命令。

zyc18700766982的博客 2万+

jdbc中rs.next()的返回值总为false_JDBC第三篇「事务、元数据、改造JDBC工具类」(修订版)...

1.事务一个SESSION所进行的所有更新操作要么一起成功,要么一起失败举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。事例说明:/** 我们来模拟A向B账号转账的场景* A和B账户都有1000块,现在我让A账户向B账号转500块钱** */ //JDBC默认的情况下是关闭事务的,下面我们看看关闭事务去操作转账操作有什么问题 //...

weixin_30789921的博客 379

借助AI高效写出结构严谨、内容专业的课题申报书:10大核心模块拆解(附实用提示词)

在很多老师和科研人员眼中,写一份高质量的课题申报,确实是一件非常困难的事。难就难在不只是要说清楚写了什么研究内容,还要体现申报书的可行性和创新性。七哥除了自己写课题,也经常指导会员同仁使用高级学术版搞定课题的申报工作,摸索出了一套行之有效的借助AI申报课题的技巧,在这篇文章中,我将给大家点明课题申报书的10大核心模块的写作技巧,还会给大家一些提示词模板供大家参考,如果你也正准备申报课题,那么这篇文章一定不要错过!特别说明的是,提示词的使用并不是一蹴而就的,是专业思考的延伸和AI化专业表达,过程中需要多次的调

智能AI让学术科研更容易 445

R语言层次聚类(hierarchical clustering):数据缩放、PCA聚类结果可视化、fpc包的clusterboot函数通过bootstrap重采样的方法评估hclust层次聚类的稳定性

R语言层次聚类(hierarchical clustering):数据缩放、PCA聚类结果可视化、fpc包的clusterboot函数通过bootstrap重采样的方法评估hclust层次聚类的稳定性

data+scenario+science+insight 835

JDBC【事务、元数据、改造JDBC工具类】

1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。 事例说明: /* * 我们来模拟A向B账号转账的场景 * A和B账户都有1000块,现在我让A账户向B账号转500块钱 ...

awxj68104的博客 66

YOLOv11改进 | Conv篇 | DWRSeg扩张式残差助力小目标检测 (附创新修改后的C3k2DWRSeg)

本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv11中的C2f和Bottleneck模块,主要针对的是小目标检测,主要创新点可以总结如下:多尺度特征提取机制的深入研究和创新的DWR模块和SIR模块的提出这种方法使得网络能够更灵活地适应不同尺度的特征,从而更准确地识别和分割图像中的物体。DWRSeg的基本原理和框架,并且能够在你自己的网络结构中进行添加DWRSeg需要增加一定的计算量一个DWR模块大概增加0.4GFLOPsYOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备。

Snu77的博客 4186

JDBC工具类——JdbcUtils

我的web一、最终工具类的组成1、类加载时加载驱动2、dbcp连接池:dbcp.properties3、ThreadLocal控制事务4、连接池提高资源利用率5、rowmapper封装减少代码冗余6、template封装减少dao层代码冗余二、JDBC工具类的演变1.第一代JdbcUtils工具类①.工具类②.测试类2.第二代JdbcUtils工具类①.dbcp.properties②.工具类③.测试类 一、最终工具类的组成 1、类加载时加载驱动 将Class.forName(“com.mysql.jdb

是草莓味的啊 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

类元数据++java,JDBC【事务、元数据、改造JDBC工具类】

1.事务一个SESSION所进行的所有更新操作要么一起成功,要么一起失败举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。事例说明:/** 我们来模拟A向B账号转账的场景* A和B账户都有1000块,现在我让A账户向B账号转500块钱** *///JDBC默认的情况下是关闭事务的,下面我们看看关闭事务去操作转账操作有什么问题//...

weixin_39622123的博客 154

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JDBC相关工具类的封装

一、JDBC连接工具类(MySQL为例) 1、在项目根目录创建一个properties的配置文件db.properties,里面定义了四行数据,分别对应着JDBC连接所需要的几个参数(注:Properties底层为一个Hashtable,配置文件中“=”之前的代表Map中的键,之后的代表相应键所对应的值) driverClassName=com.mysql.jdbc.Driver url=jdbc...

老头儿ii的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JDBC 在Java中对数据进行操作 JDBC事务处理 JDBC封装工具类 及实用案例

JDBC 在Java中对数据进行操作 JDBC事务处理 JDBC封装工具类 操作所有数据库的方式 使用第三方图形化工具来访问MySQL:SQLyog、Navicat、SQLWave等 使用DOS命令行方式 核心:通过Java来访问MySQL数据库 案例: 使用jdbc的工具类完成登录案例 使用jdbc的工具类完成转账案例 JDBC 概述 JDBC: Java DataBase Connecti...

xc965746550的博客 959

Jdbc工具类例子

Jdbc工具类的简单例子 封装方法 创建连接,共用调用 静态代码块,只需调用一次,账号密码等配置文件获取,不需更改代码 关闭资源方法 配置文件: driver=com.mysql.cj.jdbc.Driver url = jdbc:mysql://localhost:3306/study?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8 user=root password=password ...

林高禄 9256

JDBC事务工具类

JDBC事务工具类 工具类(使用c3p0默认配置) import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class JDBCUtils { private...

weixin_42370899的博客 314

JDBC总结——JDBC工具类

文章目录JDBC工具类一、JDBC工具类概述1、定义JDBC工具类的目的2、封装的操作二、JDBC工具类的封装1、dbcp.properties2、JdbcUtil3.java3、JdbcTemplate.java JDBC工具类 一、JDBC工具类概述 1、定义JDBC工具类的目的 每次使用JDBC的时候都要书写冗长的代码段,不符合复用的理念,于是要单独写一个类,将通用的JDBC操作写到一个类...

weixin_44157233的博客 1931
上一篇: JDBC第一篇【介绍JDBC、使用JDBC连接数据库、简单的工具类】(修订版)
下一篇: 漫话:如何给女朋友解释什么是HTTP
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值