I tried every method I could find and ended up just making a function that manually updates each row.
Wrong approach.
I've tried everything I can to get it to display the data.
Its not difficult. The easiest approach is to just replace the model in the table.
table.setModel( ... );
Or, in your case it looks your you model class has a setResultSet(...) method, which you don't invoke when you try to refresh the model.
You executeSQL() method has the line:
model.setResultSet(statement.executeQuery(query));
But in your tableChanged() method you use:
statement.executeQuery("SELECT * from shoppingList");
Why are you attempting to duplicate code? Just invoke the executeSQL() method.
Also, another comment is that you should not be using model.fireTableDataChanged(...). The fireXXX methods should only be invoked from within the TableModel.
So, instead of firing those events it looks like you should just be invoking the executeSQL() method after you do your table inserts.