JDBC - 松耦合
JDBC - loosen coupling
我们目前有一个学校项目,我们的应用程序从具有特定格式的文件中获取输入,在 MySQL 中创建一个 table 并用数据填充它。在编写代码时,我注意到我使用了很多依赖项,我之前读过这是一个不好养成的习惯。减少耦合还不是一个真正的大话题。四处搜索,我发现大多数答案都是关于接口的。我不认为他们对我来说是足够明确的答案,如果不重复方法似乎也没有好处。
如何松开代码中的耦合?有什么好的通用提示和技巧吗?
PS: void showTable 和 stringBuilderShowTable 没有实现,也没有工作。
public class DBService {
DBConnection dbc;
Connection con;
//Statement stmt;
public DBService()
{
dbc = new DBConnection();
con = dbc.getConnection();
}
public void copyFile(String fileName, String tableName) throws SQLException {
DataManager dm = new DataManager();
dm.sortData(fileName);
createTable(fileName, tableName, con);
insertData(fileName, tableName, con);
}
public void showTable (String tableName)
{
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery
("SELECT * FROM " + tableName);
System.out.println("id name job");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String job = rs.getString("job");
System.out.println(id+" "+name+" "+job);
}
}
catch(SQLException e){
System.out.println("SQL exception occured" + e);
}
}
public void createTable(String fileName, String tableName, Connection con) throws SQLException {
try (Statement stmt2 = (Statement) con.createStatement())
{
String query1 = stringBuilderMeta(fileName, tableName);
stmt2.execute(query1);
if (stmt2.getWarnings() == null)
{
System.out.println("\n### Table " + tableName + " is created");
} else
{
System.out.println("### " + stmt2.getWarnings());
}
stmt2.close();
}
}
public void insertData(String fileName, String tableName, Connection con) throws SQLException
{
try (Statement stmt = (Statement) con.createStatement())
{
String query1 = stringBuilderData(fileName, tableName);
stmt.execute(query1);
if (stmt.getWarnings() == null)
{
System.out.println("\n### Table " + tableName + " has been successfully filled");
} else
{
System.out.println("### " + stmt.getWarnings());
}
stmt.close();
}
}
public String stringBuilderMeta(String fileName, String tableName)
{
DataManager dm = new DataManager();
dm.sortData(fileName);
StringBuilder builder = new StringBuilder();
builder.append("" + "Create table ").append(tableName).append(" (\n");
for (int i = 0; i < dm.fileMetaData.size();i++) {
DataFromFile d = (DataFromFile)dm.fileMetaData.get(i);
String test = d.getName();
String test2 = d.getDatatype();
String test3 = d.getLimit();
if(i < (dm.fileMetaData.size()-1))
{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append("),\n");
}
else{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append(")\n");
}
}
builder.append(");");
String string = builder.toString();
return string;
}
public String stringBuilderShowTable(String fileName, String tableName)
{
DataManager dm = new DataManager();
dm.sortData(fileName);
StringBuilder builder = new StringBuilder();
//builder.append("" + "SELECT * FROM " + tableName + ""
for (int i = 0; i < dm.fileMetaData.size();i++) {
DataFromFile d = (DataFromFile)dm.fileMetaData.get(i);
String test = d.getName();
String test2 = d.getDatatype();
String test3 = d.getLimit();
if(i < (dm.fileMetaData.size()-1))
{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append("),\n");
}
else{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append(")\n");
}
}
builder.append(");");
String string = builder.toString();
System.out.print(string);
return string;
}
public String stringBuilderData(String fileName, String tableName)
{
DataManager dm = new DataManager();
dm.sortData(fileName);
int counter = 0;
int counter2 = dm.reader.wordsPerLine;
StringBuilder builder = new StringBuilder();
for(int j = 0; j < dm.boo; j++)
{
builder.append("" + "INSERT INTO ").append(tableName).append (" (");
for (int i = 0; i < dm.fileMetaData.size(); i++) {
DataFromFile d = (DataFromFile) dm.fileMetaData.get(i);
if (i < (dm.fileMetaData.size() - 1)) {
builder.append(d.getName()).append(", ");
} else {
builder.append(d.getName());
}
}
builder.append(")\n").append("VALUES (");
for (int i = counter; i < counter2; i++) {
if (i < (counter2 - 1)) {
builder.append("'" + dm.fileData.get(i) + "'" + ",");
} else {
builder.append("'" + dm.fileData.get(i) + "'");
}
counter++;
}
counter2 = counter2+dm.reader.wordsPerLine;
builder.append(");\n");
}
String string = builder.toString();
System.out.print(string);
return string;
}
}
这是个大问题。标准应用程序架构中的很多内容都与解耦(以及相关的关注点分离)有关。
您可能会从传统的 OO 设计模式中得到一些想法:https://en.wikipedia.org/wiki/Design_Patterns
让具有定义角色的对象协作(可能分为架构层,通常通过界面进行交互)是一种技术。应用程序可能有一个表示层(进一步分为 MVC 结构)用于向用户展示事物,一个数据访问层用于与数据库对话,以及介于两者之间的服务层......而不是一个对象做所有这些事情。整个课程都可以专门用于编写不会跨越这些类型的体系结构层的对象的学科。
您可能还想查看 "inversion of control" 或 "dependency injection"。这有几个框架,但基本思想只有一个:A class 需要使用一个实现 SomeDependencyINeed 接口的对象,而不是直接说 myVariable = new ImplementationOfSomeDependencyINeed();
它提供了一种方法,它可以给定一个 SomeDependencyINeed
引用(一个构造函数参数,或一个 setter 方法)。像 Spring 这样的框架提供了一个通常提供 ("injects") 依赖实例的 "inversion of control container" (或 IoC 容器);或者在没有框架的情况下,您可能拥有某种负责该职责的构建器或配置器对象。
问题是,学校项目通常不够大——更重要的是,通常维护的时间不够长——无法展示这些技术的好处。所以作为一名学生,如果你这样做,你会看到所有的成本——起床需要更长的时间,而且 运行,有时你以一种特定的方式做事,这似乎是不必要的——但你通常不会看到上涨。
我们目前有一个学校项目,我们的应用程序从具有特定格式的文件中获取输入,在 MySQL 中创建一个 table 并用数据填充它。在编写代码时,我注意到我使用了很多依赖项,我之前读过这是一个不好养成的习惯。减少耦合还不是一个真正的大话题。四处搜索,我发现大多数答案都是关于接口的。我不认为他们对我来说是足够明确的答案,如果不重复方法似乎也没有好处。
如何松开代码中的耦合?有什么好的通用提示和技巧吗?
PS: void showTable 和 stringBuilderShowTable 没有实现,也没有工作。
public class DBService {
DBConnection dbc;
Connection con;
//Statement stmt;
public DBService()
{
dbc = new DBConnection();
con = dbc.getConnection();
}
public void copyFile(String fileName, String tableName) throws SQLException {
DataManager dm = new DataManager();
dm.sortData(fileName);
createTable(fileName, tableName, con);
insertData(fileName, tableName, con);
}
public void showTable (String tableName)
{
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery
("SELECT * FROM " + tableName);
System.out.println("id name job");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String job = rs.getString("job");
System.out.println(id+" "+name+" "+job);
}
}
catch(SQLException e){
System.out.println("SQL exception occured" + e);
}
}
public void createTable(String fileName, String tableName, Connection con) throws SQLException {
try (Statement stmt2 = (Statement) con.createStatement())
{
String query1 = stringBuilderMeta(fileName, tableName);
stmt2.execute(query1);
if (stmt2.getWarnings() == null)
{
System.out.println("\n### Table " + tableName + " is created");
} else
{
System.out.println("### " + stmt2.getWarnings());
}
stmt2.close();
}
}
public void insertData(String fileName, String tableName, Connection con) throws SQLException
{
try (Statement stmt = (Statement) con.createStatement())
{
String query1 = stringBuilderData(fileName, tableName);
stmt.execute(query1);
if (stmt.getWarnings() == null)
{
System.out.println("\n### Table " + tableName + " has been successfully filled");
} else
{
System.out.println("### " + stmt.getWarnings());
}
stmt.close();
}
}
public String stringBuilderMeta(String fileName, String tableName)
{
DataManager dm = new DataManager();
dm.sortData(fileName);
StringBuilder builder = new StringBuilder();
builder.append("" + "Create table ").append(tableName).append(" (\n");
for (int i = 0; i < dm.fileMetaData.size();i++) {
DataFromFile d = (DataFromFile)dm.fileMetaData.get(i);
String test = d.getName();
String test2 = d.getDatatype();
String test3 = d.getLimit();
if(i < (dm.fileMetaData.size()-1))
{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append("),\n");
}
else{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append(")\n");
}
}
builder.append(");");
String string = builder.toString();
return string;
}
public String stringBuilderShowTable(String fileName, String tableName)
{
DataManager dm = new DataManager();
dm.sortData(fileName);
StringBuilder builder = new StringBuilder();
//builder.append("" + "SELECT * FROM " + tableName + ""
for (int i = 0; i < dm.fileMetaData.size();i++) {
DataFromFile d = (DataFromFile)dm.fileMetaData.get(i);
String test = d.getName();
String test2 = d.getDatatype();
String test3 = d.getLimit();
if(i < (dm.fileMetaData.size()-1))
{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append("),\n");
}
else{
builder.append(test).append(" ").append(test2).append(" (").append(test3).append(")\n");
}
}
builder.append(");");
String string = builder.toString();
System.out.print(string);
return string;
}
public String stringBuilderData(String fileName, String tableName)
{
DataManager dm = new DataManager();
dm.sortData(fileName);
int counter = 0;
int counter2 = dm.reader.wordsPerLine;
StringBuilder builder = new StringBuilder();
for(int j = 0; j < dm.boo; j++)
{
builder.append("" + "INSERT INTO ").append(tableName).append (" (");
for (int i = 0; i < dm.fileMetaData.size(); i++) {
DataFromFile d = (DataFromFile) dm.fileMetaData.get(i);
if (i < (dm.fileMetaData.size() - 1)) {
builder.append(d.getName()).append(", ");
} else {
builder.append(d.getName());
}
}
builder.append(")\n").append("VALUES (");
for (int i = counter; i < counter2; i++) {
if (i < (counter2 - 1)) {
builder.append("'" + dm.fileData.get(i) + "'" + ",");
} else {
builder.append("'" + dm.fileData.get(i) + "'");
}
counter++;
}
counter2 = counter2+dm.reader.wordsPerLine;
builder.append(");\n");
}
String string = builder.toString();
System.out.print(string);
return string;
}
}
这是个大问题。标准应用程序架构中的很多内容都与解耦(以及相关的关注点分离)有关。
您可能会从传统的 OO 设计模式中得到一些想法:https://en.wikipedia.org/wiki/Design_Patterns
让具有定义角色的对象协作(可能分为架构层,通常通过界面进行交互)是一种技术。应用程序可能有一个表示层(进一步分为 MVC 结构)用于向用户展示事物,一个数据访问层用于与数据库对话,以及介于两者之间的服务层......而不是一个对象做所有这些事情。整个课程都可以专门用于编写不会跨越这些类型的体系结构层的对象的学科。
您可能还想查看 "inversion of control" 或 "dependency injection"。这有几个框架,但基本思想只有一个:A class 需要使用一个实现 SomeDependencyINeed 接口的对象,而不是直接说 myVariable = new ImplementationOfSomeDependencyINeed();
它提供了一种方法,它可以给定一个 SomeDependencyINeed
引用(一个构造函数参数,或一个 setter 方法)。像 Spring 这样的框架提供了一个通常提供 ("injects") 依赖实例的 "inversion of control container" (或 IoC 容器);或者在没有框架的情况下,您可能拥有某种负责该职责的构建器或配置器对象。
问题是,学校项目通常不够大——更重要的是,通常维护的时间不够长——无法展示这些技术的好处。所以作为一名学生,如果你这样做,你会看到所有的成本——起床需要更长的时间,而且 运行,有时你以一种特定的方式做事,这似乎是不必要的——但你通常不会看到上涨。