iBatis pobieranie danych

0

Chciałbym z użyciem iBatis pobrać wartość int

w pliku xml mam mam tak skonstruowane pytanie które pobiera największa wartość ID w tabeli

<select id="lastID" resultClass="Towary">
		select MAX(id_p) from TOWARY
		</select>

pytanie działa bo zwraca ta wartość która mnie interesuje (126)

nie wiem jak odwołać sie po przez kod Javy zeby wartosc ktora jest wyswietlana w bazie byla intem.

Próbowałem już tak jak w innych przypadkach rzutować to na obiekt Towar i pobrać jego wartość ale zawsze wyświetla się 0;

`Towary t = (Towary)sqlMap.queryForObject("Towary.lastID");`
0

Dlaczego w resultClass masz Towary? Jak chcesz pobrać tylko największą wartość bez innych kolumn z tabeli TOWARY odpowiadających tej wartości to wystarczy int. A potem w kodzie:
Integer w = (Integer)sqlMap.queryForObject("Towary.lastID");
Jeszcze do tego Towary.lastID ma zastrzeżenie/pytanie. Czy nie wystarczy samo lastID. Domyślam się, że chodzi tu o to, że masz kilka map w różnych plikach XML, tak?

0

Dopiero zaczołem poznawac iBatis i bazy danych.

Próbowałem zrzutowac na Integer błędu nie ma ale tez jest 0

moze pokaze calosc:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
  PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
  "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Towary">
		<insert id="dodaj" parameterClass="Towary">
		insert into Towary (id_p, ilosc)
		values (#id_p#,#ilosc#)
		
     </insert>
     <insert id="dodajT" parameterClass="Towary">
		insert into IDPRODUKTU (id_p, nazwa, cena)
		values (#id_p#, #nazwa#, #cena#)
		
     </insert>
     
		
		<!--- Showing all data of table -->

		<select id="all" resultClass="Towary">
			select * from produkty1
		</select>
		
		<select id="wysAll" resultClass="Towary">
		select a.id_p, a.ilosc , b.nazwa, b.cena 
		from TOWARY a, IDPRODUKTU b 
		where (a.id_p = b.id_p);
		
		</select>
		
		<select id="wysID" resultClass="Towary">
		select a.id_p, a.ilosc , b.nazwa, b.cena 
		from TOWARY a, IDPRODUKTU b 
		where (a.id_p = b.id_p)AND a.id_p=#id#;
		</select>
		
		<select id="lastID" resultClass="Towary">
		select MAX(id_p) from TOWARY
		</select>
		
		<update id="Dostawa" parameterClass="int">
		update TOWARY set ILOSC=ILOSC+1 where id_p=#id#;
		
		</update>
		
		<update id="Stan" parameterClass="int">
		update TOWARY set ILOSC=(ILOSC-1) where id_p=#id#;
		
		</update>
		


</sqlMap>

public class Towary {
	String nazwa;
	int ilosc;
	int cena;
	int id;
	int id_p;
	
	public Towary(int id_p,String nazwa, int ilosc, int cena){
		this.id_p=id_p;
		this.nazwa=nazwa;
		this.ilosc=ilosc;
		this.cena=cena;
	}

// plus getery i setery
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;

import java.util.*;


public class Sklep {

	static SqlMapClient sqlMap;
	Reader reader;
	public Sklep() throws IOException, SQLException {
		
		this.reader = Resources.getResourceAsReader("sqlMapConfig.xml");
		this.sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
		lista();
	}
	
	public static List<Towary> lista()throws SQLException{
		return (List<Towary>)sqlMap.queryForList("Towary.wysAll", null);
		
	}
	public static void dostawaProduktu(int kodTowaru)throws SQLException{
		sqlMap.update("Towary.Dostawa",kodTowaru);
		
	}

	public static void dostawaWielu(int kodProduktu, int ileProduktow)throws SQLException{
		for(int i=0; i<ileProduktow; i++){
			dostawaProduktu(kodProduktu);
		}
	}
	public static void wysProdukt(int kod) throws SQLException{
		
		Towary t = (Towary)sqlMap.queryForObject("Towary.wysID", kod);
		System.out.println(t.getNazwa()+ " " + t.getCena()+"zl  "+" na stanie:"+t.getIlosc() );
		
	}
	public Towary kup(int kod, int ilosc)throws SQLException{
		Towary t =(Towary)sqlMap.queryForObject("Towary.wysID", kod);
		int doZaplaty= t.getCena()*ilosc;
		System.out.println("kupiles: "+t.getNazwa()+" - ilosc: "+ilosc+" do zaplaty:  "+doZaplaty+" zl");
		for(int i=0; i<ilosc; i++){
			sqlMap.update("Towary.Stan", kod);
		}
		
		return t;
	}
	public static void kupProdukt(int kod) throws SQLException{
		
		sqlMap.update("Towary.Stan", kod);
		
	}
	public static void dodajTowar(int kod, String nazwa, int ilosc, int cena)throws SQLException{
		Towary towar = new Towary(kod, nazwa, ilosc,cena);
		sqlMap.insert("Towary.dodaj", towar);		//1. dodaje wiersz to tabeli towary
		sqlMap.insert("Towary.dodajT", towar);		//2	dodaje towar 
		
	}
	public void wyswietl() throws SQLException{
		System.out.println("w sklepie na stanie: ");
		System.out.println("---------------------------");
		System.out.printf("%1$4s| %2$-7s| %3$-5s|%4$-6s","kod","nazwa", "cena", "ilosc"+"\n");
		System.out.print("---------------------------"+"\n");
		
		for(Towary tt: lista())
		
		System.out.printf("%1$4s|%2$-8s|%3$6s|%4$6s",tt.getId_p(), tt.nazwa, tt.getCena(), tt.getIlosc()+"\n");
		//System.out.printf("%2$s",tt.getId_p());
		//+"   " + tt.getCena()+ "   "+ tt.ilosc+"\n");
		//System.out.printf("%1$s", tt.getNazwa());
		System.out.println("---------------------------");

	}
	
	
	public static void main(String[] args) throws SQLException, IOException{

		Sklep sklep =new Sklep();
	
		//Sklep.dodajTowar(127, "keczup", 10, 4, sklep.sqlMap); // zwieksz zawsze o jeden zeby kody sie nie powtarzaly
		//List<Towary> tow = (List<Towary>)sklep.sqlMap.queryForList("Towary.all",null);
	
		//kupProdukt(124); 		// odejmuje 1 sztuke ze stanu(kup); 
		wysProdukt(111);
		
		//System.out.println(" ostani : "+ lastID());
		//Sklep.dostawaProduktu(123); 	// dostawa jednego poduktu o podanym kodzie
		//dostawaWielu(124, 5);	// dostawa wielu produktow o podanym kodzie
		System.out.println(sklep.kup(124,1));
	//	System.out.println("tak czy nie : "+sklep.sprawdz(150));
		sklep.wyswietl();
			}	
}

i jeszcze jeden konfiguracyjny połączenie ale juz nie będę go wklejał.

0

Zrobiłem sobie uproszczoną wersję Twojej aplikacji. Klasę Towary uprościłem do atrybutów id_p (int) i nazwa (String). Moja wersja zapytania:

	<select id="lastID" resultClass="int">
		select max(id_p) from towary
	</select>

z wywołaniem w postaci:
Integer id_p = (Integer) client.queryForObject("lastID", null);
(na ominięcie "Towary." w nazwie zapytania w wywołaniu pozwala ustawienie:
<settings useStatementNamespaces="false"/>
w pliku konfiguracyjnym iBatis. Ale wtedy w przypadku wielu map zapytania muszą mieć unikalne id w skali wszystkich map).
W Twoim przypadku chcesz dostać wynik w postaci obiektu klasy Towary o największym id_p. Ale musisz pamiętać, że w iBatis wszelkie atrybuty, które chcesz otrzymać w wyniku muszą być wybrane w zapytaniu. Ponadto jak chcesz wybierać do Twoich domenowych obiektów to musisz po nazwie kolumny podać nazwę odpowiadającego jej atrubutu jako alias. Zapytanie, które wybierze Towary o największym id_p będzie wyglądało następująco:

	<select id="lastIDTowary" resultClass="pawel.ibatisproject1.model.Towary">
		select 
			id_p as id_p,
			nazwa as nazwa from towary 
		where id_p = (select max(id_p) from towary)
	</select>

Chodzi o to, że iBatis musi wiedzieć wartości z jakiej kolumny wpisać do konkretnych atrybutów klasy.
Pamiętaj też, że w przypadku, kiedy klasa jest w pakiecie trzeba podać pełną nazwę klasy wraz z pakietem.

0

działa dzieki :)

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