2011-11-23 6 views
4

En général, je veux savoir comment SQL Select est mis en œuvre dans le niveau inférieur, il ressemble àmettre en œuvre SQL comme sélectionnez Java

l'algorithme qu'ils l'aide est proche de O (1) ..... en Java vous ne pouvez y parvenir en utilisant

hashmaps, je divague comment ils l'ont fait

Exemple:

Si j'ai un groupe d'étudiants, et le groupe de classes, afin de sélectionner l'un des étudiants appartient à quelles classes

ou toute catégorie tient à quel groupe d'étudiants, je concevoir une base de données relationnelle, dont 3 tables:

table étudiant, table de classe, table de relation

qui devrait représenter un bon nombre à plusieurs rapports

si je ne veux pas utiliser SQL, JDBC, créer et concevoir les tables

comment puis-je mettre en œuvre ce en java pur

Je voudrais som ething comme

List<Student> getStudentsByClass(String className) 

ou

List<Class> getClassesByStudent(String StudentName) 

Idéalement je un hashmap en utilisant idEtudiant unique clé et la studentObject réelle valeur et un autre hasMap uing classID comme la clé et classObject en tant que valeur

alors une relation ArrayList contient tous les objets relationnels, à l'intérieur de l'objet relation vous avez 2 fichiers, le classID et l'ID élève

le problème est que je ne veux pas boucler à travers la relation ArrayList chaque fois que je fais une recherche

Je sais qu'il existe une méthode de comparaison sur l'objet que je peux remplacer par qui vous aide seulement à trier les obejcts il doesn pas beaucoup aider avec select n'est pas?

il y a un lien, je comprends tout, mais pas le bit de sélection, aucun des conseils s'il vous plaît!

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

Répondre

0

sérialisation peut travailler pour vous ici ...

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(); 
    } 
} 

Bien sûr, la lecture sera très similaire. Malheureusement, obtenir des requêtes "select" sur ce n'est pas trivial. Je suggère de regarder la base de données H2. C'est trivialement facile et fonctionne très bien. Voici un petit exemple qui crée la base de données, une table, insère des choses et les lit à nouveau.

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(); 
} 

Je peux vraiment le recommander.

+0

désolé man, pas de 3ème bibliothèque, même pas de sérialisation, mais oui c'est une bonne idée, mais ça ne m'aide pas à comprendre comment sql fonctionne et comment fonctionne la base de données relationnelle –

+0

Excuses alors, mais vérifiez H2 pour référence future. Ça vaut le coup de savoir. –

2

Vous pouvez parcourir votre "table" et vérifier chaque élément pour les critères spécifiés. Cela fonctionnera avec la complexité O (n).Si vous voulez accélérer votre programme, créez un type d'index en utilisant Map (par exemple HashMap ou TreeMap) (O (1)) et/ou triez les données et utilisez la recherche binaire (log (n)).

+0

pouvez-vous être plus précis s'il vous plaît? O (n) fonctionnera mais c'est ce que j'essaie d'éviter, la clé est de savoir comment construire la collection de relations, devrait-elle être une carte? un ensemble ou ..... une carte est belle mais vous avez besoin d'une clé unique ...... plus important encore, quelle devrait être la clé? –

0

Vous pouvez simplement créer plusieurs vues indexées pour satisfaire les requêtes que vous souhaitez résoudre. Maintenez-les dans une seule classe qui agit comme votre couche d'accès aux données et fournit des méthodes de recherche comme vous le suggérez. Les opérations CRUD passent par cette classe.

Si vous vouliez ensuite passer à une implémentation de base de données, l'implémentation de votre classe d'accès aux données change. Mais si vous avez fait un travail raisonnable, son interface ne le sera pas.

+0

Je suis d'accord! C'est un O (1) et Cela fonctionne, mais en donnant ce que je n'ai pas eu le travail, je me promène ce qui est soi-disant meilleure solution ..... ils ont dit SQL Jibb hiberniate n'est pas la réponse ..... ..ahhhhhh –

0

Je voudrais suggérer Guava. Je n'ai pas tous les détails pour vous donner un exemple complet mais en goyave, vous pouvez créer des prédicats qui agiront comme des filtres. J'adore ce tutoriel qu'il a fait sur goyave, le lien vers l'url est here.

Pour vous donner un exemple d'utilisation possible, vous pouvez spécifier une méthode pour renvoyer un prédicat pour vous comme

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; 
     } 
    }; 
} 

puis appeler la méthode en tant que telle

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

merci, mais encore une fois, pas de bibliothèque 3ème partie, juste Java pur s'il vous plaît –

0

Avez-vous considéré en utilisant Hibernate? Il vous permet d'utiliser des requêtes de type SQL (HQL) directement sur des objets Java. Il est généralement destiné à être soutenu par une "vraie" base de données, mais vous n'avez pas à le faire. En fait, dans l'une de mes précédentes expériences professionnelles, nous l'avons utilisé avec une base de données en mémoire (HSQLDB) très bien pour cette raison unique: pouvoir faire des requêtes complexes (y compris l'agrégation, la jonction, etc.) sur de très grandes collections de objets Java.

+0

la réaction normale d'un peuple normal est hiberner, oui! Je suis d'accord c'est le meilleur choix, MAIS je veux juste savoir est-il possible de le faire en utilisant pure Java –

+0

Si vous n'utilisez pas une base de données pour sauvegarder votre modèle, vous pourriez soutenir Hibernate * est * pure Java ... – Guillaume

+0

désolé pure Java signifie que vous implémentez l'algorithme de sélection par vous-même –

Questions connexes