Jedna funkcja która obsługuje różne zapytania

0

Chce napisać funkcję która będzie wykonywała różne zapytania. Chce jej przekazać nazwę tabeli oraz metodę select, insert oraz liste wartości z uwzględnieniem where itp. Robiłem coś podobnego w php i przetrzymywałem wszystko w array, ale nie wiem jak to rozwiązać w Javie istnieje może jakaś gotowa klasa?

Pozdrawiam

0

Chcesz napisać METODĘ - nie możesz po prostu podać zbudowanego Stringa ?

ResultSet rs = stmt.executeQuery("tu masz zapytanie, nie ?");
0

Tak, mogę ale chciałem aby to jakoś ładniej wyglądało.
W PHP mam to rozwiązane w taki sposób

$user = db::getInstance()->update('users', 2, array(
    'password' => 'newpassword'));

    public function update($table, $id, $fields){

        $set = '';
        $x = 1;

        foreach($fields as $name => $value){
            $set .= "{$name} = ?";

            if($x < count($fields)){
                $set .= ', ';       
            }
        }

        $sql = "UPDATE {$table} SET {$set} where id = {$id}";


        if(!$this->query($sql, $fields)->error()){
                    return true;
        }
    }
0

ktoś Ci broni opakować to w jakieś metody które będą stanowiły api ? zresztą możesz poszukać innych funkcji w np: jdbc.
BTW. Napisz co chcesz osiągnąć bo trochę nie rozumiem - btw2: nie rozumiem php'a więc mi nim nie rzucaj, nie jestem masochistą :D
Jeżeli chcesz coś fajniejszego niż czyste jdbc to zainteresuj się np: Hibernate (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/tutorial.html) w tedy taka aktualizacja wyglądała by tak:

User.setPassword("nowehaslo")
session.update(User)
0

Chodzi mi o to aby móc po prostu np. wrzucić do funkcji tablice 2 wymiarową z nazwami pól na których zrobić update oraz z określonymi wartościami na te pola.

1

Pytanie numer jeden dlaczego nie użyć ORMa?

Rozwiązaniem nie jest jakaś metoda, tylko tradycyjnie klasa w rodzaju:

class Operation {

    String table;

    CUD operationType;

    Map<String, String> valueMap;
    
    Map<String, String> conditionMap;

    public Operation(Operation other) {
        this.table = other.table;
        this.operationType = other.operationType;
        this.valueMap = other.valueMap;
        this.conditionMap = other.conditionMap;
    }
    
    public void execute(){
        // budowanie SQLa
    }
    
    enum CUD {
        CREATE ,
        UPDATE,
        DELETE;
    }

}

Masz dwie mapy. Pierwsza wskazuje wartości (pary nazwa kolumny, wartość) uzywane w zapytaniach. Przydatne przy insercie i updacie. Druga mapa zawiera pary dla warunku where, które wykorzystujesz przy update i delete. Do tego parametr z nazwą kolumny oraz z typem operacji. Reszta to jest składanie stringa z mapy, które w sumie można robić generycznie w enumie.

0

Ok, zrobiłem coś takiego dla insertów

	public int insert(Map<String, String> valueMap, String table) throws SQLException {	
 	// TODO Auto-generated method stub
		
		Connection conn = Database.getInstance().getConnection();
		
		View view = new View();

		String val = "";
		String query = "";
		String question = "";
		Integer mapsize = valueMap.size();
		Integer x = 1;

		for (Map.Entry<String, String> entry : valueMap.entrySet()) {

			val += entry.getKey();
			question += "?";

			if (x < mapsize) {
				val += ", ";
				question += ", ";
			}
			mapsize--;
		}
		
		query = "insert into " + table + "(" + val + ") values ("+question+")";
		PreparedStatement add = conn.prepareStatement(query);
		
		for(Map.Entry<String, String> entry : valueMap.entrySet()){
			add.setObject(x,entry.getValue());
			x+=1;
		}
		int addtotable = add.executeUpdate();
		add.close();
		return addtotable;
	}
0

Lekcja na dziś: Single responsibility principle

1

Jest czwartek, godzina 4:11 więc szybko bez zbędnego javovego kodu:

  1. query = : możesz zrobić metodę która zbuduje Ci zapytanie na podstawie jakichś warunków, prawda ? możesz ją potem wykorzystać. Więc mamy redukcje z 2 linijek:
        query = "insert into " + table + "(" + val + ") values ("+question+")";
        PreparedStatement add = conn.prepareStatement(query);

do jednego wywołania metody.

Dalej, wydaje mi się że to:

        for (Map.Entry<String, String> entry : valueMap.entrySet()) {
 
            val += entry.getKey();
            question += "?";
 
            if (x < mapsize) {
                val += ", ";
                question += ", ";
            }
            mapsize--;
        }

Może bez problemy śledzić jakaś klasa(instancja), jakiś serwis. coś co wykona logikę za Ciebie. Spróbuj dopieścić kod - myśl tak, że metoda ma wywoływać zapytania, które będą logicznymi prośbami, takimi jak

  • zbuduj zapytanie
  • wykonaj zapytanie i przypisz do X
  • wykonaj iteracje po X
    Zawsze staraj się zadawać pytanie co dana metoda ma robić - i staraj się zamienić pytanie w pewną restrykcję / warunek którą metoda ma spełnić.

P.S moje rady, przy tym co zapodał @Koziołek wydają się zwykłym szajsem, więc propozycja, wykorzystaj jego podejście, bo dla mnie wydaje się idealne. Jedna klasa która bierze odpowiedzialność za budowanie zapytań - po prostu piękne - i jeżeli możesz - i nawet jak nie możesz użyj jakiegoś ORM'a

0

Ok, dzięki będę nad tym myślał. Zastanawiam się teraz jak dodać nowy wątek. Mam jeden od GUI, chciałbym mieć 2 dla bazy. Dodać go w klasie, która jest odpowiedzialna za łączenie z bazą danych, czy w funkcjach które wywołują zapytania?

1 użytkowników online, w tym zalogowanych: 0, gości: 1