Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要更简单的Java/SQL数据传输_Java_Sql_Jdbc - Fatal编程技术网

需要更简单的Java/SQL数据传输

需要更简单的Java/SQL数据传输,java,sql,jdbc,Java,Sql,Jdbc,因此,我使用jdbc与MySQL数据库进行通信。对于许多表和许多查询/视图,我创建了一个类来封装表的一行或查询/表结果。对DB的访问返回此类对象的一个对象(当我确切知道只有一个匹配行时)或此类对象的向量 每个类都有一个工厂方法,该方法从ResultSet的一行构建一个对象。需要很多ResultSet.getXXX()方法,特别是在更改表/查询/视图布局之后,还需要对哪些值位于哪个列进行严格的簿记 创建和维护这些对象是一项枯燥、工作密集、令人麻木的任务。换句话说,这类任务是由工具完成的。它应该读取

因此,我使用jdbc与MySQL数据库进行通信。对于许多表和许多查询/视图,我创建了一个类来封装表的一行或查询/表结果。对DB的访问返回此类对象的一个对象(当我确切知道只有一个匹配行时)或此类对象的向量

每个类都有一个工厂方法,该方法从ResultSet的一行构建一个对象。需要很多ResultSet.getXXX()方法,特别是在更改表/查询/视图布局之后,还需要对哪些值位于哪个列进行严格的簿记

创建和维护这些对象是一项枯燥、工作密集、令人麻木的任务。换句话说,这类任务是由工具完成的。它应该读取SQL(MySQL变体,alas)并生成Java代码。或者,至少给我一个表/查询/视图的表示(XML?DOM?),让我自己生成java代码


你能说出这个工具的名字吗?

我对你的问题有点困惑。为什么不使用像Hibernate这样的对象关系映射框架呢


我曾经有过同样的问题,必须直接读写大量SQL。最终,我开始用Hibernate编写新的项目,并且没有回头看。该系统负责构建实际的表并在后台运行SQL,我主要可以处理java对象

我在几年前创建了一个类似的迷你框架,但它是用于原型设计,而不是用于生产

这个想法很简单。折衷是使用反射的成本。尽管Hibernate和其他ORM工具也为此付出了代价

这个想法很简单

  • 您有一个执行查询的Dao类

  • 阅读ResultSet元数据,在那里您可以获取表名、字段、类型等

  • 在类路径中查找与表名匹配和/或具有相同数量/类型字段的类

  • 使用反射设置值

  • 返回此对象并将其投射到另一侧,就完成了

在运行时找到该类似乎很荒谬。而且可能看起来风险太大,因为查询可能会更改或表结构可能会更改。但是想想看。发生这种情况时,无论如何都必须更新映射以匹配新结构。因此,您只需更新匹配的类,并以此为乐

我不知道ORM工具是如何降低反射调用成本的(因为映射它唯一能做的就是帮助您找到匹配的类)。在我的版本中,在大约30000个类中查找(我添加了来自其他地方的JAR来测试它)只花了.30毫秒或类似的时间。我将该类保存在缓存中,第二次不必进行查找

如果你感兴趣(并且还在阅读),我会试着在我的旧电脑里找到图书馆

最后,我的代码是这样的:

 Employee e = ( Employee ) MagicDataSource.find( "select * from employee where id = 1 ");

里面是这样的:

Object[] findAll( String query ) {
     ResultSet rs = getConnection().prepareStatemet( query ).executeQuery();
     ResultSetMetaData md = rs.getMetadata();
     String tableName = md.getTableName();

     String clazz = findClass( toCamelCase( tableName ) ); // search in a list where all the class names where loaded.
     Class.forName( clazz );

     while( rs.next() ) {

         for each attribute etc. etc. 
             setter...
         end

         result.append( object );
     }

    return result.toArray();
 }
如果有人知道ORM工具如何处理反射成本,请告诉我。我从开源项目中读到的代码没有试图对此做任何事情


最后,它让我为系统监控或诸如此类的事情创建快速的小程序。我不再做那个工作了,lib现在被遗忘了

如果您正在寻找一个简单的框架来帮助编写sql的繁琐工作,我建议您这样做。这个框架基本上就是您想要的

Hibernate也是一个不错的选择,但对于像您这样的简单问题来说,它似乎有点太大了

你也可以看看这个。这旨在为编写java应用程序创建一个简单的环境,并具有非常有用的sql抽象。但是要小心使用spring,您可能会开始喜欢该框架,并花太多的时间使用它(8)

至于你对反思的关注。Java在反射的性能开销方面不再存在重大问题(至少从1.4版和O/R映射工具开始)

根据我的经验,最好关注编写良好且易于理解的代码,而不是关注一些性能开销,这可能会带来成本,这只是理论上的

在大多数情况下,性能问题不会出现在您期望的地方,并且只能在编写代码后使用度量工具来识别。性能方面最常见的问题是与I/O相关的,或者是基于您自己代码中的某些错误(例如,大量创建新的类或循环实例,运行次数达数百万次,这是不必要的…),而不是jdk本身。

除了ORMs之外

如果您使用的是rs.getString和rs.getInt例程,那么如果您依赖命名列而不是编号列,那么肯定可以减轻维护负担

例如,特别是rs.getInt(“id”)而不是rs.getInt(1)

我很少有实际的列更改数据类型,因此未来的SQL维护只不过是将新的列添加到表中,这些列可以简单地添加到每个小DAO对象的monster bind列表的末尾

接下来,采用使用列名的习惯用法,并将其扩展为使用一致名称的计划,同时使用“唯一”名称。这样做的目的是,数据库中的每一列都有一个与之关联的唯一名称。理论上,它可以像tablename\u columnname一样简单(尽管冗长),因此如果您有一个“member”表,那么id列的列名就是“member\u id”

这给你买了什么

它使您能够在任何“有效”结果集上使用通用DAO

“有效”结果集是具有使用唯一命名规范命名的列的结果集

所以,您可以从member where id获得“select id member\u id,name member\u name”=
Object[] findAll( String query ) {
     ResultSet rs = getConnection().prepareStatemet( query ).executeQuery();
     ResultSetMetaData md = rs.getMetadata();
     String tableName = md.getTableName();

     String clazz = findClass( toCamelCase( tableName ) ); // search in a list where all the class names where loaded.
     Class.forName( clazz );

     while( rs.next() ) {

         for each attribute etc. etc. 
             setter...
         end

         result.append( object );
     }

    return result.toArray();
 }
PreparedStatement = con.prepareStatement("select m.id member_id, m.name member_name, p.id post_id, p.date post_date, p.subject post_subject from member m, post p where m.id = p.member_id and m.id = 123");
ResultSet rs = ps.executeQuery();
Member m = null;
Post p = null;
while(rs.next()) {
    if (m == null) {
        m = MemberDAO.createFromResultSet(rs);
    }
    p = PostDAO.createFromResultSet(rs);
    m.addPost(p);
}
PreparedStatement = con.prepareStatement("select m.id member_id from member m where m.id = 123");
ResultSet rs = ps.executeQuery();
Member m = null;
if (rs.next()) {
    m = MemberDAO.createFromResultSet(rs);
}
PreparedStatement = con.prepareStatement("select m.name member_name, max(p.date) post_date from member m, post p where post.member_id = m.id and m.id = 123");
ResultSet rs = ps.executeQuery();
Member m = null;
Post p = null;
if (rs.next()) {
    m = MemberDAO.createFromResultSet(rs);
    p = MemberDAO.craateFromResultSet(rs);
}
System.out.println(m.getName() + " latest post was on " + p.getDate());