Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.97 KB | None | 0 0
  1. import java.sql.*;
  2. import java.util.*;
  3.  
  4. public class Main {
  5.  
  6. public static void main(String[] args) throws SQLException {
  7. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  8. Scanner lukija = new Scanner(System.in);
  9.  
  10. while (true) {
  11. System.out.println("Valitse toiminto (1-9): ");
  12. System.out.println("1-luo tietokanta"); //luo tietokannan
  13. System.out.println("2-lisää paikkatieto"); //lisää tiedon paikasta
  14. System.out.println("3-lisää asikastieto"); //lisää tiedon asiakkaasta
  15. System.out.println("4-lisää pakettitieto"); //lisää tiedon paketista
  16. System.out.println("5-lisää tapahtumatieto"); //lisää tapahtuman
  17. System.out.println("6-hae paketin reitti"); //hakee seurantakoodilla sijainnit ja aikaleimat
  18. System.out.println("7-hae paketit asiakkaan nimellä"); //hakee paketit asiakkaan nimellä
  19. System.out.println("8-hae tapahtumat paikalla ja päivällä"); //hakee tapahtumien määrän paikalla ja päivällä
  20. System.out.println("9-suorita tehokkuustesti ilman indeksejä"); //suorittaa tehokkkuustestin
  21. System.out.println("10-suorita tehokkustesti indekseillä");
  22. System.out.println("x-lopeta ohjelma"); //lopeta ohjelma
  23. System.out.print(">> ");
  24. String komento = lukija.nextLine();
  25.  
  26. if (komento.equals("1")) {
  27. luoTietokanta(lukija);
  28. } else if (komento.equals("2")) {
  29. lisaaPaikkatieto(lukija);
  30. } else if (komento.equals("3")) {
  31. lisaaAsiakastieto(lukija);
  32. } else if (komento.equals("4")) {
  33. lisaaPakettitieto(lukija);
  34. } else if (komento.equals("5")) {
  35. lisaaTapahtuma(lukija);
  36. } else if (komento.equals("6")) {
  37. haePaketinTapahtumat(lukija);
  38. } else if (komento.equals("7")) {
  39. haePaketit(lukija);
  40. } else if (komento.equals("8")) {
  41. haePaikanTapahtumat(lukija);
  42. } else if (komento.equals("9")) {
  43. tehokkuustestiIlmanIndekseja();
  44. } else if (komento.equals("10")) {
  45. tehokkuustestiIndekseilla();
  46. } else if (komento.equals("x")) {
  47. break;
  48. }
  49. }
  50. }
  51.  
  52. private static void luoTietokanta(Scanner lukija) throws SQLException {
  53. //Toiminto 1-luo tietokanta
  54. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  55. Statement s = db.createStatement();
  56.  
  57. s.execute("CREATE TABLE Paikat (id INTEGER PRIMARY KEY, nimi TEXT UNIQUE)");
  58. s.execute("CREATE TABLE Asiakkaat (id INTEGER PRIMARY KEY, nimi TEXT UNIQUE)");
  59. s.execute("CREATE TABLE Tapahtumat (id INTEGER PRIMARY KEY, kuvaus TEXT, "
  60. + "paketti_id INTEGER REFERENCES Paketit, paikka_id INTEGER "
  61. + "REFERENCES Paikat, aika TEXT)");
  62. s.execute("CREATE TABLE Paketit (id INTEGER PRIMARY KEY, koodi TEXT UNIQUE,"
  63. + " asiakas_id INTEGER REFERENCES Asiakkaat)");
  64. System.out.println("Tietokanta luotu");
  65. System.out.println("");
  66. }
  67.  
  68. private static void lisaaPaikkatieto(Scanner lukija) throws SQLException {
  69. //Toiminto 2-lisää paikkatieto
  70. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  71.  
  72. System.out.print("Anna paikan nimi: ");
  73. String paikka = lukija.nextLine();
  74.  
  75. try {
  76. PreparedStatement p = db.prepareStatement("INSERT INTO Paikat(nimi) VALUES (?)");
  77. p.setString(1,paikka);
  78. p.executeUpdate();
  79. System.out.println("Paikka lisätty");
  80. System.out.println("");
  81.  
  82. } catch (Exception e) {
  83. System.out.println("VIRHE: paikka on jo olemassa");
  84. System.out.println("");
  85. }
  86. db.close();
  87.  
  88. }
  89.  
  90. private static void lisaaAsiakastieto(Scanner lukija) throws SQLException {
  91. //Toiminto 3-lisää asikastieto
  92. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  93.  
  94. System.out.print("Anna asiakkaan nimi: ");
  95. String asiakas = lukija.nextLine();
  96.  
  97. try {
  98.  
  99. PreparedStatement p = db.prepareStatement("INSERT INTO Asiakkaat(nimi) VALUES (?)");
  100. p.setString(1,asiakas);
  101. p.executeUpdate();
  102. System.out.println("Asiakas lisätty");
  103. System.out.println("");
  104.  
  105. } catch (Exception e) {
  106. System.out.println("VIRHE: asiakas on jo olemassa");
  107. System.out.println("");
  108. }
  109. db.close();
  110.  
  111. }
  112.  
  113. private static void lisaaPakettitieto(Scanner lukija) throws SQLException {
  114. //Toiminto 4-lisää paketti (paketin seurantakoodi ja asiakas)
  115. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  116. System.out.print("Anna paketin seurantakoodi: ");
  117. String koodi = lukija.nextLine();
  118. System.out.print("Anna asiakkaan nimi: ");
  119. String asiakas = lukija.nextLine();
  120.  
  121. try {
  122.  
  123. PreparedStatement p = db.prepareStatement("SELECT id FROM Asiakkaat WHERE nimi=?");
  124. p.setString(1,asiakas);
  125. ResultSet r = p.executeQuery();
  126.  
  127. if (r.next()) {
  128. PreparedStatement q = db.prepareStatement("INSERT INTO Paketit(koodi,asiakas_id) VALUES (?,?)");
  129. q.setString(1,koodi);
  130. q.setInt(2,r.getInt("id"));
  131. q.executeUpdate();
  132. System.out.println("Paketti lisätty");
  133. System.out.println("");
  134. } else {
  135. System.out.println("Asiakasta ei löydy.");
  136. System.out.println("");
  137. }
  138.  
  139. } catch (Exception e) {
  140. System.out.println("Tapahtui tietokantavirhe!");
  141. System.out.println("");
  142. }
  143. db.close();
  144. }
  145.  
  146. private static void lisaaTapahtuma(Scanner lukija) throws SQLException {
  147. //Toiminto 5-lisää tapahtumatieto
  148. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  149.  
  150. try {
  151. System.out.print("Anna paketin seurantakoodi: ");
  152. String koodi = lukija.nextLine();
  153.  
  154. PreparedStatement seurantakoodi = db.prepareStatement("SELECT id FROM Paketit WHERE koodi=?");
  155. seurantakoodi.setString(1,koodi);
  156. ResultSet paketinID = seurantakoodi.executeQuery();
  157.  
  158. if (paketinID.next()) {
  159. System.out.print("Anna tapahtuman paikka: ");
  160. String paikka = lukija.nextLine();
  161.  
  162. PreparedStatement mesta = db.prepareStatement("SELECT id FROM Paikat WHERE nimi=?");
  163. mesta.setString(1,paikka);
  164. ResultSet paikkaID = mesta.executeQuery();
  165. if (paikkaID.next()) {
  166. System.out.print("Anna tapahtuman kuvaus: ");
  167. String kuvaus = lukija.nextLine();
  168.  
  169. PreparedStatement tapahtuma = db.prepareStatement("INSERT INTO Tapahtumat(kuvaus,paketti_id,paikka_id,aika) VALUES (?,?,?,datetime('now'))");
  170. tapahtuma.setString(1,kuvaus);
  171. tapahtuma.setInt(2,paketinID.getInt("id"));
  172. tapahtuma.setInt(3,paikkaID.getInt("id"));
  173.  
  174. tapahtuma.executeUpdate();
  175. System.out.println("Tapahtuma lisätty");
  176. System.out.println("");
  177. } else {
  178. System.out.println("VIRHE: Paikkaa ei ole olemassa");
  179. System.out.println("");
  180. }
  181. } else {
  182. System.out.println("Seurantakoodia ei löydy.");
  183. System.out.println("");
  184. }
  185.  
  186. } catch (Exception e) {
  187. System.out.println("Tapahtui tietokantavirhe!"+ e.getMessage());
  188. System.out.println("");
  189. }
  190. db.close();
  191.  
  192. }
  193.  
  194. private static void haePaketinTapahtumat(Scanner lukija) throws SQLException {
  195. //Toiminto 6-hae paketin tapahtumat
  196. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  197.  
  198. System.out.print("Anna paketin seurantakoodi: ");
  199. String haluttuPaketti = lukija.nextLine();
  200.  
  201. PreparedStatement p = db.prepareStatement("SELECT Tapahtumat.aika, Paikat.nimi, Tapahtumat.kuvaus FROM Tapahtumat, Paikat, Paketit WHERE Paketit.id = Tapahtumat.paketti_id AND Paikat.id = Tapahtumat.paikka_id AND Paketit.koodi = ?");
  202. p.setString(1, haluttuPaketti);
  203. ResultSet r = p.executeQuery();
  204.  
  205. while (r.next()) {
  206. System.out.println(r.getString("aika")+", "+r.getString("nimi")+", "+r.getString("kuvaus"));
  207. }
  208. System.out.println("");
  209. db.close();
  210. }
  211.  
  212. private static void haePaketit(Scanner lukija) throws SQLException {
  213. //Toiminto 7-hae paketit asiakkaan nimellä
  214. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  215.  
  216. System.out.print("Anna asiakkaan nimi: ");
  217. String asiakas = lukija.nextLine();
  218.  
  219. PreparedStatement p = db.prepareStatement("SELECT Paketit.koodi, COUNT(Tapahtumat.id) AS maara FROM Paketit LEFT JOIN Tapahtumat ON Paketit.id = Tapahtumat.paketti_id LEFT JOIN Asiakkaat ON Paketit.asiakas_id = Asiakkaat.id WHERE Asiakkaat.nimi = ? GROUP BY Paketit.id");
  220. p.setString(1, asiakas);
  221. ResultSet r = p.executeQuery();
  222.  
  223. while (r.next()) {
  224. System.out.println(r.getString("koodi")+", "+r.getInt("maara")+" tapahtumaa");
  225. }
  226.  
  227. System.out.println("");
  228. db.close();
  229. }
  230.  
  231. private static void haePaikanTapahtumat(Scanner lukija) throws SQLException {
  232. //Toiminto 8-hae tapahtumat paikalla ja päivällä
  233. Connection db = DriverManager.getConnection("jdbc:sqlite:paketit.db");
  234.  
  235. System.out.print("Anna paikan nimi: ");
  236. String paikka = lukija.nextLine();
  237. System.out.print("Anna päivämäärä (YYYY-MM-DD): ");
  238. String pvm = lukija.nextLine();
  239.  
  240. PreparedStatement p = db.prepareStatement("SELECT COUNT(Tapahtumat.id) AS tapahtumia FROM Tapahtumat LEFT JOIN Paikat ON Tapahtumat.paikka_id = Paikat.id WHERE Tapahtumat.aika LIKE ? AND Paikat.nimi=?");
  241. p.setString(1, pvm+'%');
  242. p.setString(2, paikka);
  243. ResultSet r = p.executeQuery();
  244.  
  245. System.out.println("Tapahtumien määrä: "+r.getInt("tapahtumia"));
  246. System.out.println("");
  247. db.close();
  248. }
  249.  
  250. private static void tehokkuustestiIlmanIndekseja() throws SQLException {
  251. //LUO TIETOKANTA
  252. long aika1 = System.nanoTime();
  253.  
  254. Connection db = DriverManager.getConnection("jdbc:sqlite:tehokkuustestiIlmanIndeksejaKanta.db");
  255. Statement s = db.createStatement();
  256.  
  257. s.execute("CREATE TABLE Paikat (id INTEGER PRIMARY KEY, nimi TEXT UNIQUE)");
  258. s.execute("CREATE TABLE Asiakkaat (id INTEGER PRIMARY KEY, nimi TEXT UNIQUE)");
  259. s.execute("CREATE TABLE Tapahtumat (id INTEGER PRIMARY KEY, kuvaus TEXT, "
  260. + "paketti_id INTEGER REFERENCES Paketit, paikka_id INTEGER "
  261. + "REFERENCES Paikat, aika TEXT)");
  262. s.execute("CREATE TABLE Paketit (id INTEGER PRIMARY KEY, koodi TEXT UNIQUE,"
  263. + " asiakas_id INTEGER REFERENCES Asiakkaat)");
  264.  
  265. //LISÄÄ TUHAT PAIKKAA P1
  266. long paikkaAika1 = System.nanoTime();
  267.  
  268. String paikka;
  269. s.execute("BEGIN TRANSACTION");
  270. PreparedStatement p = db.prepareStatement("INSERT INTO Paikat(nimi) VALUES (?)");
  271. for (int i=1; i<1001; i++) {
  272. paikka="P"+i;
  273. p.setString(1, paikka);
  274. p.executeUpdate();
  275. System.out.println("Paikan nimi: "+paikka);
  276. }
  277. s.execute("COMMIT");
  278. long paikkaAika2 = System.nanoTime();
  279. System.out.println("1000 paikan lisäämiseen kului "+(paikkaAika2-paikkaAika1)/1e9+" sekuntia");
  280.  
  281. //LISÄÄ TUHAT ASIAKASTA A1
  282. long asiakasAika1 = System.nanoTime();
  283.  
  284. s.execute("BEGIN TRANSACTION");
  285. String asiakas;
  286. PreparedStatement q = db.prepareStatement("INSERT INTO Asiakkaat(nimi) VALUES (?)");
  287. for (int j=1; j<1001; j++) {
  288. asiakas="A"+j;
  289. q.setString(1,asiakas);
  290. q.executeUpdate();
  291. System.out.println("Asiakkaan nimi: "+asiakas);
  292.  
  293. }
  294. s.execute("COMMIT");
  295. long asiakasAika2 = System.nanoTime();
  296. System.out.println("1000 asiakkaan lisäämiseen kului "+(asiakasAika2-asiakasAika1)/1e9+" sekuntia");
  297.  
  298. //LISÄÄ TUHAT PAKETTIA, JOKAISELLE ASIAKAS
  299. long pakettiAika1 = System.nanoTime();
  300.  
  301. s.execute("BEGIN TRANSACTION");
  302. String paketti;
  303. for (int k=1; k<1001; k++) {
  304. paketti = "S"+k;
  305. PreparedStatement r = db.prepareStatement("INSERT INTO Paketit(koodi,asiakas_id) VALUES (?,?)");
  306. r.setString(1,paketti);
  307. r.setInt(2,k);
  308. r.executeUpdate();
  309. System.out.println("Paketin numero: "+paketti);
  310.  
  311. }
  312. s.execute("COMMIT");
  313. long pakettiAika2 = System.nanoTime();
  314. System.out.println("1000 paketin lisäämiseen kului "+(pakettiAika2-pakettiAika1)/1e9+" sekuntia");
  315.  
  316. //LISÄÄ MILJOONA TAPAHTUMA, JOKAISELLE PAKETTI
  317. long tapahtumaAika1 = System.nanoTime();
  318.  
  319. s.execute("BEGIN TRANSACTION");
  320. Random random = new Random();
  321. for (int l=1; l<1000001; l++) {
  322. PreparedStatement tapahtuma = db.prepareStatement("INSERT INTO Tapahtumat(paketti_id) VALUES (?)");
  323. int satunnainen = random.nextInt(1000);
  324. String satunnainenPaketti = "S"+satunnainen;
  325. tapahtuma.setInt(1, satunnainen);
  326.  
  327. tapahtuma.executeUpdate();
  328. System.out.println("Tapahtuman paketti: "+satunnainenPaketti);
  329.  
  330. }
  331. s.execute("COMMIT");
  332. long tapahtumaAika2 = System.nanoTime();
  333. System.out.println("1 000 000 tapahtuman lisäämisen kului "+(tapahtumaAika2-tapahtumaAika1)/1e9+" sekuntia");
  334.  
  335. //KYSELE TUHAT ASIAKKAIDEN PAKETTIMÄÄRISTÄ
  336. long pakettiKyselyAika1 = System.nanoTime();
  337. s.execute("BEGIN TRANSACTION");
  338.  
  339. for (int m=1; m<1000; m++) {
  340. String hakuAsiakas = "A"+m;
  341. PreparedStatement haePaketit = db.prepareStatement("SELECT Asiakkaat.nimi, COUNT(Paketit.id) AS maara FROM Paketit LEFT JOIN Tapahtumat ON Paketit.id = Tapahtumat.paketti_id LEFT JOIN Asiakkaat ON Paketit.asiakas_id = Asiakkaat.id WHERE Asiakkaat.nimi = ? GROUP BY Asiakkaat.id");
  342. p.setString(1, hakuAsiakas);
  343. //ResultSet tulosAsiakkaat = haePaketit.executeQuery();
  344. System.out.println("Haun asiakkaan nimi: "+hakuAsiakas);
  345.  
  346. }
  347. s.execute("COMMIT");
  348. long pakettiKyselyAika2 = System.nanoTime();
  349. System.out.println("1000 asiakkaan pakettien kyselyyn kului "+(pakettiKyselyAika2-pakettiKyselyAika1)/1e9+" sekuntia");
  350.  
  351. //KYSELE TUHAT KERTAA JONKUN PAKETIN TAPAHTUMIA
  352. long tapahtumaKyselyAika1 = System.nanoTime();
  353. s.execute("BEGIN TRANSACTION");
  354.  
  355. for (int m=1; m<1000; m++) {
  356. String hakuPaketti = "P"+m;
  357. PreparedStatement haeTapahtumat = db.prepareStatement("SELECT Paketit.koodi, COUNT(Tapahtumat.id) AS maara FROM Paketit LEFT JOIN Tapahtumat ON Paketit.id = Tapahtumat.paketti_id WHERE Paketit.koodi = ? GROUP BY Paketit.id");
  358. p.setString(1, hakuPaketti);
  359. //ResultSet tulosPaketit = haeTapahtumat.executeQuery();
  360. System.out.println("Haun paketti: "+hakuPaketti);
  361.  
  362. }
  363. s.execute("COMMIT");
  364. long tapahtumaKyselyAika2 = System.nanoTime();
  365. System.out.println("1000 paketin tapahtumien kyselyyn kului "+(tapahtumaKyselyAika2-tapahtumaKyselyAika1)/1e9+" sekuntia");
  366.  
  367. System.out.println("");
  368.  
  369. long aika2 = System.nanoTime();
  370. System.out.println("Aikaa kului "+(aika2-aika1)/1e9+" sekuntia");
  371.  
  372. }
  373.  
  374. private static void tehokkuustestiIndekseilla() throws SQLException {
  375.  
  376. }
  377.  
  378. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement