Classpath Sätts antingen via kommandoradsparameter till jvm:en (-cp -classpath) eller via en environment variabel (CLASSPATH). Går även att ställa in i eclipse för ett projekt. Class loading + resurser Innehåller kolonseparerade sökvägar till kataloger, jar-filer och zip-filer Katalognamn ska vara de kataloger som innehåller roten i en paketstruktur ex: java -cp ~/prog/myjar.jar:~/prog/lib/ Går även att ställa in i manifestfilen för jar-filer Class loader Ansvarig för att lösa in klassfilerna då de behövs I normalfallet laddas alla programmets klasser in då de behövs av system class loadern. Denna letar efter klasserna på de ställen som anges av programmets CLASSPATH Möjligt att skriva egna som laddar in klasserna från andra källor/på andra sätt jar-filer Kan användas för att packa ihop klassfiler som hör ihop (tex en applikation) till en fil Kan komprimeras och signeras Java program kan köras från jar-filer - Från kommandoraden java -jar minfil.jar - På endel plattformar exekveras de om man dubbelklickar på dem (program med grafiska användargränssnitt) Innehåller vanligtvis förutom själva klassfilerna också filer som beskriver innehållet (Manifest) Eclipse kan generera en jar-fil från ett projekt (se menyn File -> Export)
Manifest filer Metadatafil som kan finnas i jar-filer Ska heta MANIFEST.MF och finnas i katalogen META-INF i jar-filen I jar-filen kan anges: Huvudklass Main-Class: org.mypackage.helloworld Andra bibliotek som behövs: Class-Path: lib/supportlib.jar acme/ beans.jar Sökvägar anges relativt ursprungsjarfilen. De separeras med mellanslag... Resurser ur jarfiler Då program finns i JAR-filer kan vi inte längre bara ange sökvägar till filen för att komma åt den. Vi måste först ta fram en url till den fil vi vill använda URL url = getclass.getresource(filename); Sedan kan vi läsa in resursen via någon av de metoder/ konstruktorer som tar url:er som parametrar Image image = Toolkit.getDefaultToolkit(). getimage(url); Detta funkar även i fallet då vi inte paketerat ihop vårt program i en jarfil Bilder Bilder och animeringar i Java Bilder hanteras av ett antal olika klasser i java Icon Statiska bilder i en komponent BufferedImage Kan användas för att rita bilder i bakgrunden (ärver från Image) VolatileImage Annan variant på Image. Kan tappa sitt innehåll när som helst. Kan pga hårdvaruacceleration på vissa plattformar vara mkt snabbare än andra lösningar Lite bökig att använda (eg behöver ni den inte så kan ni skippa den i projektet)
Ladda in bilder För att göra detta kan tex ImageIO klassen användas File f = new File("c:\images\myimage.gif"); BufferedImage bi = ImageIO.read(f); Fixar bildformat som tex gif (även animerade), jpeg och png En BufferedImage kan sedan ritas ut mha Graphics.drawImage() Dubbelbuffring Teknik för att undvika flimmer och grafikproblem vid animeringar Bygger på att man ritar upp sin bild i bakgrunden och sedan ritar ut den färdigritade bilden (eller delar av den) på skärmen Swing har inbyggt stöd för dubbelbuffring som kan slås av/på Vissa plattformar har dessutom dubbelbuffring som ligger på en nivå utanför java Databaser - kortfattat Förenklad beskrivning - om ni vill veta mer bör ni gå den ordinarie databaskursen Databaser, SQL och JDBC Vilken ide finns bakom databaser Lagra information i en strikt struktur Fritext sökning Göra det möjligt att snabbt hämta information
Representera information Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Men matchar allting detta? 090 123 45 67 Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Kalle Svensson Karlsson Box 21 234 56 Tomby Svea Grahn Västgötagatan 45, 3tr 345 78 Gamby Clark Kent 21th Super Street Hero City 123-2389 Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Erik Karlsson Videvägen 18 987 65 Långtbortistan 090 890 123 Mia Grahn Videvägen 1289 876 54 Långtbortistan 090 222 22 22 Fia Talltopp Storgatan 1 129 21 Långbortistan 090 123 4857 Förnamn Efternamn Jobbar Telefon Förnamn Efternamn Jobbar Telefon Förnamn Efternamn Jobbar Telefon Förnamn Efternamn Jobbar Telefon Företag Efternamn Jobbar Telefon Företag Efternamn Jobbar Telefon
1 XX XX XX 1 XX XX XX 1 XX XX XX 1 1 2 2 2 4 2 1 1 XX 3 XX 2 XX 2 XX 3 XX 2 XX 4 XX 4 XX 3 1 3 4 1 XX XX XX Hur gör man rent praktiskt?? Olika implementationer, t.ex: 1 XX XX XX 1 1 2 2 2 4 2 1 3 3 1 4 1 XX XX XX MySQL Postgresql Oracle SQLite SQLServer...
Inte sann men ger en översikt Förenklad bild av hur det fungerar SQL Standard Query Language app Select SELECT XXX FROM YYY WHERE ZZZ JDBC app app Insert INSERT INTO XXX VALUES YYY SQL tolk Databashanterare API Delete DELETE FROM XXX WHERE YYY Update UPDATE XXX SET YYY WHERE ZZZ Databas JDBC - princip Fyra begrepp Statement MySQL Query Java program JDBC Driver Driver Postgresql ResultSet Transaction Driver Driver Oracle...
Ladda drivrutinen Class.forName( driverpath ) Öppna förbindelse con = DriverManager.getConnection( url, user, password ) Fixa till ett statement ms = con.createstatement() Gör nåt res = ms.executequery( sqlstuff ) nr = ms.executeupdate( sqlstuff ) final private static String driver = "org.postgresql.driver"; final private static String url = "jdbc:postgresql://postgres.cs.umu.se/x"; final private static String user = "X"; final private static String passwd = "X"; public static void main( String argv[] ) throws java.sql.sqlexception { Connection connection; try{ Class.forName( driver ); catch ( java.lang.classnotfoundexception e ) { System.err.println( "Problem - Kunde inte hitta drivrutinen" ); return; Jan Erik Moström try{ connection = DriverManager.getConnection( url, user, passwd ); catch ( java.sql.sqlexception e ) { System.err.println( "Problem - Kunde inte ansluta till databasen" ); return; ResultSet result = statement.executequery( "select last, first from names" ); System.out.println( "\n\ntest 1" ); Statement statement = connection.createstatement( ); statement.execute( "create table names (first char(20), last char(20))" ); statement.execute( "insert into names (first, last) values ('Kalle', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Kajsa', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Knatte', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Fnatte', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Tjatte', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Joakim', 'von Anka')" ); statement.execute( "insert into names (first, last) values ('Kalle', 'Johansson')" ); statement.execute( "insert into names (first, last) values ('Anna', 'Andersson')" ); Test 1 Anka, Kalle Anka, Kajsa Anka, Knatte Anka, Fnatte Anka, Tjatte von Anka, Joakim Johansson, Kalle Andersson, Anna
result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 2" ); result = statement.executequery( "select last, first from names where last = 'Anka' order by last, first" ); System.out.println( "\n\ntest 3" ); Test 2 Andersson, Anna Anka, Fnatte Anka, Kajsa Anka, Kalle Anka, Knatte Anka, Tjatte Johansson, Kalle von Anka, Joakim Test 3 Anka, Fnatte Anka, Kajsa Anka, Kalle Anka, Knatte Anka, Tjatte statement.execute( "update names set first = 'Karl' where first = 'Kalle'" ); result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 4" ); statement.execute( "delete from names where last = 'Anka'" ); result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 5" ); Test 4 Andersson, Anna Anka, Fnatte Anka, Kajsa Anka, Karl Anka, Knatte Anka, Tjatte Johansson, Karl von Anka, Joakim Test 5 Andersson, Anna Johansson, Karl von Anka, Joakim
String first = "Arne"; String last = "Anka"; statement.execute( "insert into names (first, last) values ('" + first + "', '" + last + "')" ); result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 6" ); Precompiled statements first = "Arne', 'Anka'); drop table names; insert into funny ( woop, miff) values ('Kalle"; last = "Anka"; PreparedStatement prep = con.preparestatement( "INSERT INTO XXX (a,b,c) VALUES (?,?,?)" ) prep.setxxx( index, value ) statement.execute( "insert into names (first, last) values ('" + first + "', '" + last + "')" ); prep.executeupdate... etc
Datatyper i databaser Olika databaser stödjer olika datatyper postgresql - smallint, integer, bigint, decimal, real, serial, money, varchar, text, timestamp, date, time, byte, boolean, etc. mysql - char, varchar, tinytext, text, blob, longtext, tinyint, int, bigint, date, datetime, timestamp, time, etc. Vad ska man tänka på? Tänk några steg framåt - Förändringar i framtiden - Överdesigna inte Lagra information på ett ställe Ofta bra att ha ett unikt id på (nästan) varje post Gör inte en databashanterare i ditt program!!! - Utnyttja databashanteraren och låt den göra jobbet