像Java中的select一样实现SQL

时间:2011-11-23 16:33:29

标签: java database design-patterns database-design

一般来说,我想知道如何在较低级别实现SQL select,它看起来像

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

来实现

hashmaps,我徘徊他们是如何做到的

实施例

如果我有一组学生和一组班级,为了选择任何一个学生属于哪个班级

或任何班级拥有哪一组学生,我会设计一个关系数据库,其中有3个表:

学生表,班级表,关系表

应代表良好的多对多关系

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

我如何在纯java

中实现它

我想要像

这样的东西
List<Student> getStudentsByClass(String className) 

 List<Class> getClassesByStudent(String StudentName)

理想情况下,我将使用唯一studentID作为键,并将实际studentObject作为值使用hashMap 另一个使用map作为键的classID和作为值的

的classObject

然后关系ArrayList保存所有关系对象,在关系对象内有2个文件,classID和studentID

问题是我每次进行搜索时都不想遍历关系ArrayList

我知道对象上有一个比较方法,我可以覆盖它只能帮助你对obejcts进行排序 它对选择不是很有帮助吗?

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

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

5 个答案:

答案 0 :(得分:2)

您可以遍历“表格”并检查每个项目是否符合指定条件。这将与O(n)复杂性一起使用。如果要使程序更快,请使用Map(例如HashMap或TreeMap)(O(1))或/和排序数据创建索引类型并使用二进制搜索(log(n))。

答案 1 :(得分: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();
}

我真的可以推荐它。

答案 2 :(得分:0)

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

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

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

将这些维护在一个充当数据访问层的类中,并提供您建议的查找方法。 CRUD操作通过该课程。

如果您以后想要切换到数据库实现,那么数据访问类的实现会发生变化。但如果你做了一个合理的工作,那么它的界面就不会。

答案 3 :(得分:0)

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

我喜欢他在番石榴上做过的教程,链接到网址是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") ) );

答案 4 :(得分:0)

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