2011-11-23 37 views
4

总的来说,我想知道如何SQL选择在较低的水平来实现,它看起来像执行SQL喜欢选择在Java中

他们使用的算法是接近O(1)......在Java中你只能通过使用

包含HashMap实现这一点,我信步他们是如何做

例:

如果我有一组学生,和类组,以便选择任何学生属于分类

或任何类别的持有哪一组的学生,我会设计一个关系型数据库,这3个表:

学生表,班级表,关系表

这应该代表了相当多的一对多关系

但是如果我不希望使用SQL,JDBC,创建和设计表

我怎么能在纯Java实现这个

我想索姆ething像

List<Student> getStudentsByClass(String className) 

List<Class> getClassesByStudent(String StudentName) 

理想我会用独特的studentID关键和实际studentObject作为价值 和另一hasMap uing的classID关键和classObject为值的HashMap

那么一个关系ArrayList包含所有的关系对象,在关系对象里面你有2个文件,classID和studentID

问题是我不想通过关系ArrayList循环每次当我做搜索

我知道有一个对象的比较方法,我可以重写,只有帮助你排序对象 它doesn对select的帮助不大?

有一个链接,我明白一切,但不是选择位,任何一个提示请!

http://www.javaworld.com/javaworld/jw-11-2004/jw-1122-select.html?page=3

回答

0

对象序列化可以为你工作在这里...

public static void testSerialization() { 
    String filename = "person.txt"; 
    StudentDetails s1 = new PersonDetails("hemanth", 10, "Male"); 
    StudentDetails s2 = new PersonDetails("bob", 12, "Male"); 
    StudentDetails s3 = new PersonDetails("Richa", 10, "Female"); 
    List list = new ArrayList(); 
    list.addAll(Arrays.asList(s1, s2, s3)); 
    FileOutputStream fos = null; 
    ObjectOutputStream out = null; 
    try { 
    fos = new FileOutputStream(filename); 
    out = new ObjectOutputStream(fos); 
    out.writeObject(list); 
    out.close(); 
    System.out.println("Object Persisted"); 
    } catch (IOException ex) { 
    ex.printStackTrace(); 
    } 
} 

当然,阅读将是非常相似的。可悲的是,获得“选择”查询并不是微不足道的。我会建议看看H2数据库。它非常简单,工作得很好。这里有一个小例子,它创建数据库,一个表格,插入一些东西并且再次读取它。

public static void h2test() throws SQLException { 
    JdbcDataSource ds = new JdbcDataSource(); 
    ds.setURL("jdbc:h2:testdb/somedb"); 

    Connection connection = ds.getConnection(); 
    PreparedStatement statement = connection.prepareStatement("CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))"); 
    System.out.println(statement.execute()); 

    statement = connection.prepareStatement("INSERT INTO TEST VALUES(10, 'ten')"); 
    System.out.println(statement.executeUpdate()); 
    connection.commit(); 

    statement = connection.prepareStatement("SELECT * FROM TEST"); 
    ResultSet resultSet = statement.executeQuery(); 

    while (resultSet.next()) { 
     System.out.println(resultSet.getInt(resultSet.findColumn("ID")) + ", " + resultSet.getString(resultSet.findColumn("NAME"))); 
    } 
} 

public static void main(String[] args) throws SQLException { 
    System.out.println("Hello world"); 
    h2test(); 
} 

我真的可以推荐它。

+0

抱歉,没有第三方库,甚至没有序列化,但是它的好主意,但它并没有帮助我理解sql如何工作以及关系数据库如何工作 –

+0

然后道歉,但请查看H2以备将来参考。值得了解。 –

2

您可以迭代您的“表”并检查每个项目的指定条件。这将与O(n)复杂性一起工作。如果您希望更快地创建程序,请使用Map(例如HashMap或TreeMap)(O(1))或/和对数据进行排序并使用二进制搜索(log(n))来创建各种索引。

+0

你能更具体吗? O(n)会工作,但那就是我想要避免的,关键是如何构建关系集合,它应该是一张地图吗?一套或一个地图是不错的,但你需要一个独特的关键......更重要的是什么应该是关键? –

0

您可以简单地构建多个索引视图来满足要解析的查询。

HashMap<String, List<Student>> studentsByClassId; 
HashMap<String, List<SchoolClass>> classesByStudentId; 

HashMap<String, Student> studentByStudentId; 
HashMap<String, SchoolClass> classByClassId; 

将这些维护在一个类中,它充当您的数据访问层并提供查找方法,如您所建议的。 CRUD操作遍历该类。

如果您以后想切换到数据库实现,那么您的数据访问类的实现更改。但是,如果你做了合理的工作,那么它的界面不会。

+0

我同意!它的一个O(1)和这个工程,但通过给这个我没有得到的工作,我徘徊什么所谓的更好的解决方案.....他们说,SQL JDBC休眠不是答案..... ..ahhhhhh –

0

我想推荐Guava。我没有完整的细节给你一个完整的例子,但在番石榴,你可以创建Predicates作为过滤器。

我喜欢这个教程,他在番石榴上做的,链接到url是here

只给你一个可以使用的例子,你可以指定一个方法,你喜欢

public static Predicate<String> isStartsWith(final String input){ 
    return new Predicate<String>() 
    { 
     @Override 
     public boolean apply(String str) 
     { 
      if(str.startsWith(input)) 
       return true; 
      return false; 
     } 
    }; 
} 

返回一个谓词,然后调用方法,这样

filteredList.addAll(Collections2.filter(youList, isStartsWith("thing you want to filter"))); 
+0

谢谢,但再次,没有第三方库,只需纯Java请 –

0

有你考虑使用Hibernate?它允许您直接在Java对象上使用类似SQL的查询(HQL)。它通常意味着由一个“真实”的数据库支持,但你不必这样做。事实上,在我之前的一次专业经历中,我们非常成功地将它与内存数据库(HSQLDB)一起使用,原因很简单:能够在非常大的集合上进行复杂的查询(包括聚合,连接等) java对象。

+0

一个正常人的正常反应是冬眠,是的!我同意它的最佳选择,但我只想知道是否有可能使用纯java做到这一点 –

+0

如果你不使用数据库来支持你的模型,你可以争论Hibernate *是*纯java ...... – Guillaume

+0

对不起纯java意味着你自己实现选择算法 –