реализовать SQL как выбрать в Java - PullRequest
4 голосов
/ 23 ноября 2011

В общем, я хочу знать, как SQL select реализован на нижнем уровне, это выглядит как

алгоритм, который они используют, близок к O (1) ..... в Java вы можете достичь этого только с помощью

hashmaps, я бродить, как они это сделали

Пример:

Если у меня есть группа учеников и группа классов, для того, чтобы выбрать какого-либо ученика, к какому классу относится

или какой класс содержит какую группу студентов, я бы разработал реляционную базу данных, которая состоит из 3 таблиц:

ученический стол, классный стол, таблица отношений

которая должна представлять собой хорошие отношения «многие ко многим»

однако, если я не хочу использовать SQL, JDBC, создавать и проектировать таблицы

как я могу реализовать это в чистом Java

Я бы хотел что-то вроде

List<Student> getStudentsByClass(String className) 

или

 List<Class> getClassesByStudent(String StudentName)

В идеале у меня должна быть hashMap, использующий уникальный идентификатор студента в качестве ключа и фактический студент в качестве значения а другой hasMap использует classID в качестве ключа и classObject в качестве значения

тогда ArrayList отношения содержит все объекты отношений, внутри объекта отношений у вас есть 2 файла, classID и studentID

проблема в том, что я не хочу перебирать отношение ArrayList каждый раз, когда я выполняю поиск

Я знаю, что есть метод сравнения для объекта, который я могу переопределить, который только помогает вам сортировать объекты это не очень помогает с выбором не так ли?

есть ссылка, я все понимаю, но не бит выбора, любые советы, пожалуйста!

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

Ответы [ 5 ]

2 голосов
/ 23 ноября 2011

Вы можете перебирать свою «таблицу» и проверять каждый элемент по заданным критериям.Это будет работать с O (n) сложностью.Если вы хотите ускорить выполнение вашей программы, создайте вид индексов, используя Map (например, HashMap или TreeMap) (O (1)) или / и сортируйте данные и используйте бинарный поиск (log (n)).

0 голосов
/ 23 ноября 2011

Рассматривали ли вы использование Hibernate?Это позволяет вам использовать SQL-подобные запросы (HQL) непосредственно на объектах Java.Обычно это подразумевается под «реальной» базой данных, но это не обязательно.Фактически, в одном из моих предыдущих профессиональных опытов мы очень успешно использовали его с базой данных в памяти (HSQLDB) по той уникальной причине: возможность выполнять сложные запросы (включая агрегирование, объединение и т. Д.) Для очень большихколлекции объектов Java.

0 голосов
/ 23 ноября 2011

Я хотел бы предложить Гуава .У меня нет полной информации, чтобы дать вам полный пример, но в гуаве вы можете создавать предикаты, которые будут действовать как фильтры.

Мне нравится этот урок, который он сделал на гуаве, ссылка на URL-адрес здесь .

Просто, чтобы дать вам пример возможного использования, вы можете указать метод, который будет возвращать для вас предикат, такой как

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 голосов
/ 23 ноября 2011

Вы можете просто создать несколько индексированных представлений для удовлетворения запросов, которые вы хотите разрешить.

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

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

Храните их в одном классе, который действует как слой доступа к данным и предоставляет методы поиска, которые вы предлагаете. Операции CRUD проходят через этот класс.

Если позже вы захотите переключиться на реализацию базы данных, реализация вашего класса доступа к данным изменится. Но если вы проделали разумную работу, то это не интерфейс.

0 голосов
/ 23 ноября 2011

Сериализация объектов может работать здесь ...

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

Я действительно могу рекомендовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...