idea中连接mysql插入成功数据,在navicat中刷新表格没有数据?

目录

一、出现问题:

二、尝试解决:

三、发现问题:

四、解决方法:


一、出现问题:

        在写一个数据库的大作业时,在idea中连接mysql后,测试insert的dao方法,在控制台没有报错,显示题添加数据成功.但是在navicat中刷新表格却没有数据. (本程序为普通的三层架构,手搓JDBC)

 

二、尝试解决:

        1.修改jdbc.properties配置文件.

        2.修改数据库配置.

        3.检查各处代码.

        于是在掰头了一整晚后,第二天用同学的代码却发现可以正常连接,于是在进行一个一个类代码替换后,相同的jdbc.properties,相同的数据库表……终于发现是util包下的代码问题。

三、发现问题:

        1.由于是直接搬运在学习尚硅谷JavaWeb时写的代码,所以在JdbcUtils类中,采用了Filter处理事务的数据库连接方式,原因是原本用在过滤器上的事务的提交和回滚,在没有使用过滤器时就出现了问题。

        2.

connection.close();//关闭事务的自动提交.

         事务管理中提交事务的"关闭事务的自动提交"这行代码会使得获取的数据库连接不再自动提交事务.


    /**
     * 提交事务,并关闭释放连接.
     */
    public static void commitAndClose() {
        Connection connection = conns.get();
        if (connection != null) {
            try {
                connection.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    connection.close();//关闭事务的自动提交.
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        conns.remove();
    }

        JdbcUtils源代码:

package com.my.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author sihua
 * @create 2022-10-30-20:51
 */
public class JdbcUtilsFilter {

    private static DruidDataSource dataSource;
    private static ThreadLocal<Connection> conns = new ThreadLocal<>();

    static {
        try {
            Properties properties = new Properties();
            //读取jdbc.properties属性配置文件.
            InputStream inputStream = JdbcUtilsFilter.class.getClassLoader().
                    getResourceAsStream("jdbc.properties");
            //从流中加载数据
            properties.load(inputStream);
            //创建数据库连接池.
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);

//            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接池中的连接.
     * 如果返回null,说明获取连接失败.
     */
    public static Connection getConnection() {
        Connection conn = conns.get();
        if (conn == null) {
            try {
                conn = dataSource.getConnection();
                conns.set(conn);
                conn.setAutoCommit(false);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return conn;
    }

    /**
     * 提交事务,并关闭释放连接.
     */
    public static void commitAndClose() {
        Connection connection = conns.get();
        if (connection != null) {
            try {
                connection.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        conns.remove();
    }


    /**
     * 关闭连接,放回数据库连接池
     */
//    public static void close(Connection conn) {
//        if (conn != null) {
//            try {
//                conn.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//    }

    /**
     * 回滚事务,并关闭释放连接.
     */
    public static void rollBackAndClose() {
        Connection connection = conns.get();
        if (connection != null) {
            try {
                connection.rollback();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        conns.remove();
    }

}

四、解决方法:

        将过滤器获取连接方法去掉.

package com.my.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {

    private static DruidDataSource dataSource;

    static {
        try {
            Properties properties = new Properties();
            // 读取 jdbc.properties属性配置文件
            InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            // 从流中加载数据
            properties.load(inputStream);
            // 创建 数据库连接 池
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }



    /**
     * 获取数据库连接池中的连接
     * @return 如果返回null,说明获取连接失败<br/>有值就是获取连接成功
     */
    public static Connection getConnection(){

        Connection conn = null;

        try {
            conn = dataSource.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return conn;
    }

    /**
     * 关闭连接,放回数据库连接池
     * @param conn
     */
    public static void close(Connection conn){
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

(谨以此篇博客给我长长记性。)

猜你喜欢

转载自blog.csdn.net/SIHUAZERO/article/details/131013182