idea で mysql に接続し、データを正常に挿入しましたが、navicat でテーブルを更新してもデータがありません。

目次

1.問題があります:

次に、以下を解決してみます。

3.問題が見つかりました:

4 番目の解決策:


1. 問題があります:

        大規模なデータベース ジョブを作成する場合、アイデアで mysql に接続した後、挿入の dao メソッドをテストすると、コンソールにエラーは発生せず、表示質問でデータが正常に追加されますが、navicat でテーブルを更新するとデータがありません(このプログラムは普通のプログラムです。3 層アーキテクチャ、手作業による JDBC)

 

次に、以下を解決してみます。

        1. jdbc.properties 構成ファイルを変更します。

        2. データベース構成を変更します。

        3. あらゆる場所のコードをチェックします。

        それで、一晩中頭を壊した後、翌日クラスメイトのコードを使用したところ、正常に接続できることがわかったので、コードを1つずつ置き換えた後、同じjdbc.properties、同じデータベーステーブル...ついに判明しましたそれが util パッケージであること 以下のコードの問題。

3. 問題が見つかりました:

        1. JdbcUtilsクラスでは、Shang Silicon Valley JavaWebを学習した際に書いたコードをそのまま渡すため、フィルタで本来使用していたトランザクションのコミットやロールバックが利用できないため、フィルタ処理トランザクションのデータベース接続方式を採用しています。フィルターを使用すると問題が発生します。

        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();
    }

}

4 番目の解決策:

        フィルター取得接続メソッドを削除します。

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