From 01ff3475b6136c56c000019f6c40f351204fd035 Mon Sep 17 00:00:00 2001 From: Keerthana Srinivasan Date: Tue, 7 Dec 2021 21:54:21 -0500 Subject: [PATCH] Finished --- .idea/compiler.xml | 1 + .idea/jarRepositories.xml | 20 +++ .idea/vcs.xml | 6 + jdbc-dao.iml | 3 +- pom.xml | 12 ++ src/main/java/MainExecutor.java | 70 +++++++++ src/main/java/daos/BaseDao.java | 12 ++ src/main/java/daos/CarDao.java | 144 ++++++++++++++++++ src/main/java/models/BaseModel.java | 6 + src/main/java/models/Car.java | 65 ++++++++ target/classes/MainExecutor.class | Bin 0 -> 4551 bytes target/classes/daos/BaseDao.class | Bin 0 -> 609 bytes target/classes/daos/CarDao.class | Bin 0 -> 5096 bytes target/classes/models/BaseModel.class | Bin 0 -> 128 bytes target/classes/models/Car.class | Bin 0 -> 1882 bytes target/jdbcdao-1.0-SNAPSHOT.jar | Bin 0 -> 7777 bytes target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 5 + .../compile/default-compile/inputFiles.lst | 5 + .../default-testCompile/inputFiles.lst | 0 20 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/vcs.xml create mode 100644 src/main/java/MainExecutor.java create mode 100644 src/main/java/daos/BaseDao.java create mode 100644 src/main/java/daos/CarDao.java create mode 100644 src/main/java/models/BaseModel.java create mode 100644 src/main/java/models/Car.java create mode 100644 target/classes/MainExecutor.class create mode 100644 target/classes/daos/BaseDao.class create mode 100644 target/classes/daos/CarDao.class create mode 100644 target/classes/models/BaseModel.class create mode 100644 target/classes/models/Car.class create mode 100644 target/jdbcdao-1.0-SNAPSHOT.jar create mode 100644 target/maven-archiver/pom.properties create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f006a55..5a76f28 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,6 +6,7 @@ + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/jdbc-dao.iml b/jdbc-dao.iml index 78b2cc5..cc83370 100644 --- a/jdbc-dao.iml +++ b/jdbc-dao.iml @@ -1,2 +1,3 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index d97c43d..4929175 100644 --- a/pom.xml +++ b/pom.xml @@ -8,11 +8,23 @@ jdbcdao 1.0-SNAPSHOT + + 1.8 + 1.8 + + junit junit 4.10 + + mysql + mysql-connector-java + 8.0.25 + + + \ No newline at end of file diff --git a/src/main/java/MainExecutor.java b/src/main/java/MainExecutor.java new file mode 100644 index 0000000..69321a1 --- /dev/null +++ b/src/main/java/MainExecutor.java @@ -0,0 +1,70 @@ +import daos.CarDao; +import models.Car; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.List; + +public class MainExecutor { + + public static final String URL = "jdbc:mysql://localhost:3306/zipcode"; + public static final String USER = "keer"; + public static final String PASS = "keer123"; + + public static void main(String[] args) { + +// try { +// Class.forName("com.mysql.jdbc.driver"); +// } +// catch (ClassNotFoundException e) { +// e.printStackTrace(); +// } + //TRY RESOURCE METHOD + try (Connection connection = DriverManager.getConnection(URL, USER, PASS)){ + + CarDao carDao = new CarDao(connection); + + List cars = carDao.findAll(); + int noOfCars = cars.size(); + System.out.println("No of Cars available in database: " + noOfCars); + cars.forEach(System.out::println); + + Car foundCar = carDao.findById(cars.get(1).getId()); + System.out.println("Find Car by ID : " + cars.get(1).getId() + " => Model: " + foundCar.getMake() + " Make: " + foundCar.getModel() + " VIN: " + foundCar.getVin()); + + Car newCar = getCar(++noOfCars, "Audi", "R8", 2020, "yellow", 154323456); + Car createdCar = carDao.create(newCar); + System.out.println("New Car created ID : " + createdCar.getId() + " => Model: " + createdCar.getMake() + " Make: " + createdCar.getModel() + " VIN: " + createdCar.getVin()); + + foundCar.setVin(foundCar.getVin()+100); + Car updatedCar = carDao.update(foundCar); + System.out.println("Updated Car ID : " + updatedCar.getId() + " => Model: " + updatedCar.getMake() + " Make: " + updatedCar.getModel() + " VIN: " + updatedCar.getVin()); + + List carsBeforeDelete = carDao.findAll(); + int noOfCarsBeforeDelete = carsBeforeDelete.size(); + System.out.println("No of Cars available before delete operation: " + noOfCarsBeforeDelete); + + carDao.delete(noOfCars); + System.out.println("Successfully deleted car. ID: " + noOfCars); + + List carsAfterDelete = carDao.findAll(); + int noOfCarsAfterDelete = carsAfterDelete.size(); + System.out.println("No of Cars available after delete operation: " + noOfCarsAfterDelete); + + } catch (SQLException ex) { + throw new RuntimeException("Error connecting to the database", ex); + } + } + + public static Car getCar(int id, String make, String model, int year, String color, long vin) { + Car car = new Car(); + car.setId(id); + car.setModel(model); + car.setMake(make); + car.setYear(year); + car.setColor(color); + car.setVin(vin); + return car; + } +} diff --git a/src/main/java/daos/BaseDao.java b/src/main/java/daos/BaseDao.java new file mode 100644 index 0000000..4a04cc7 --- /dev/null +++ b/src/main/java/daos/BaseDao.java @@ -0,0 +1,12 @@ +package daos; + +import java.util.List; + +public abstract class BaseDao { + + public abstract T findById(int id); + public abstract List findAll(); + public abstract T update(T dto); + public abstract T create(T dto); + public abstract void delete(int id); +} diff --git a/src/main/java/daos/CarDao.java b/src/main/java/daos/CarDao.java new file mode 100644 index 0000000..9b18786 --- /dev/null +++ b/src/main/java/daos/CarDao.java @@ -0,0 +1,144 @@ +package daos; + +import models.Car; +import models.Car; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class CarDao extends BaseDao { + + private Connection connection; + + public CarDao(Connection connection) { + this.connection = connection; + } + + /** + * This method is used to find Car by id + * @param id + * @return Car + */ + public Car findById(int id) { + + Car car = null; + try (PreparedStatement ps = connection.prepareStatement("Select id,make,model,year,color,vin from Car where id = ?")) { + + ps.setInt(1, id); + + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + + car = new Car(); + car.setId(rs.getInt(1)); + car.setMake(rs.getString(2)); + car.setModel(rs.getString(3)); + car.setYear(rs.getInt(4)); + car.setColor(rs.getString(5)); + car.setVin(rs.getLong(6)); + } + + } catch (SQLException sqlException) { + sqlException.printStackTrace(); + } + return car; + } + + /** + * + * @return + */ + public List findAll() { + List carList = new ArrayList<>(); + try (PreparedStatement ps = connection.prepareStatement("Select id,make,model,year,color,vin from Car order by id")) { + + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + + Car car = new Car(); + car.setId(rs.getInt(1)); + car.setMake(rs.getString(2)); + car.setModel(rs.getString(3)); + car.setYear(rs.getInt(4)); + car.setColor(rs.getString(5)); + car.setVin(rs.getLong(6)); + carList.add(car); + } + } catch (SQLException sqlException) { + sqlException.printStackTrace(); + } + return carList; + } + + /** + * + * @param car + * @return + */ + public Car update(Car car) { + + try (PreparedStatement ps = connection.prepareStatement("update car set make=?,model=?,year=?,color=?,vin=? where id =?")) { + + ps.setString(1, car.getMake()); + ps.setString(2, car.getModel()); + ps.setInt(3, car.getYear()); + ps.setString(4, car.getColor()); + ps.setLong(5, car.getVin()); + ps.setInt(6, car.getId()); + + boolean status = ps.execute(); + if (status) { + System.out.println("Successfully Updated Car Data"); + } + } catch (SQLException sqlException) { + sqlException.printStackTrace(); + } + return car; + } + + /** + * + * @param car + * @return + */ + public Car create(Car car) { + + try (PreparedStatement ps = connection.prepareStatement("insert into Car(id,make,model,year,color,vin) values(?,?,?,?,?,?)")) { + + + ps.setInt(1, car.getId()); + ps.setString(2, car.getMake()); + ps.setString(3, car.getModel()); + ps.setInt(4, car.getYear()); + ps.setString(5, car.getColor()); + ps.setLong(6, car.getVin()); + + boolean status = ps.execute(); + if (status) { + System.out.println("Successfully Inserted Car Data"); + } + } catch (SQLException sqlException) { + sqlException.printStackTrace(); + } + return car; + } + + /** + * + * @param id + */ + public void delete(int id) { + try (PreparedStatement ps = connection.prepareStatement("delete from car where id = ?")) { + + ps.setInt(1, id); + + boolean status = ps.execute(); + if (status) { + System.out.println("Successfully Delete Car Data"); + } + } catch (SQLException sqlException) { + sqlException.printStackTrace(); + } + } +} diff --git a/src/main/java/models/BaseModel.java b/src/main/java/models/BaseModel.java new file mode 100644 index 0000000..7e20643 --- /dev/null +++ b/src/main/java/models/BaseModel.java @@ -0,0 +1,6 @@ +package models; + +public interface BaseModel { + + int getId(); +} diff --git a/src/main/java/models/Car.java b/src/main/java/models/Car.java new file mode 100644 index 0000000..1efe2d3 --- /dev/null +++ b/src/main/java/models/Car.java @@ -0,0 +1,65 @@ +package models; + +public class Car implements BaseModel { + + int id; + String make; + String model; + String color; + int year; + long vin; + + @Override + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public long getVin() { + return vin; + } + + public void setVin(long vin) { + this.vin = vin; + } + + @Override + public String toString() { + return String.format("Car {id: %s, make: %s, model: %s, year: %s, color: %s, vin: %s}", id, make, model, year, color, vin); + } +} diff --git a/target/classes/MainExecutor.class b/target/classes/MainExecutor.class new file mode 100644 index 0000000000000000000000000000000000000000..2c218ad0be5aad189b86f3f2858538249cd71d25 GIT binary patch literal 4551 zcmbVP2Y3_L9sfO9(w*fqHUa|zLc~gKun{XjWR{H~nA(P5a7xp4md^I!vrdst7?U>X zNOzm=HeKm1-3>`9Rs$U=DU>!%)4gfak#wX@_X_>JJJ~vcKfZqT_xZi||G)ow|9Lw1 z)QM97RtrS18KVjgsu)voNX0D?JRdJmaBBn#Zj;LkYw#kxxEe3P?FwERfre2PFO&Pr zDNOTs|Y0qFj#3<(OQKD>xxgwRd-yK(uSWen3xHdS)=u z>*UPLV5>mw7CV!7^o-M|TLnWPxVLxfZf?8UdV2-J>&=YmY@~$7raoe~*lE(#b(tBX zr!dlQDy44&A10U1{CUC$_ktWaI?})_ZIP$Fve%X5QhAnz45dkdC*ali+||$fOAiXk8<; z*>a_jFq|<)U3?^!GjzxBh$4k-dIG4ITH1{PJ7;tlmf`Su)5pbEqU$7O+kj)_#tEm5 z6INg&DLa!fQjTf!*$tlc`J1f-U0*`evVd_=U}pKU_lB;m2UA8?a>=*rxk0{e+9W=s zD=XbUmK_hlyh~iQ-tUc#6kFTt=&9juJ?q9yK}x|%rWrGgz8W+f*H_m!c6xIBsdG7I z5~3YVeuaFbnReqpOs9t2zz`fWWS~MR+p@V=9gxW(cJM^^vXXo4LM~-&Gi9Dl^{3J@ zna&!v;d+MIe<84Nf4V=F92ujRlZk{SlXJ+mtU*1Utr!{;IpI7h&4PV3q3cjS_3?5{-E-k3`f@!6t%mqDm+#ZP2efc=8 zG%Z;daWfNVp6UI1-bltZd>Loua!$ina9+VzHGB;ZY4|!GW|Fttwv%^qdbZnehU|2{ zE{t!~+2rWs`cT->tnk?PKx9?W~d0 zWf4ew9>e1T^Lh)Zl#$O56fA43M3#;-S(Z_&d|=C@Vs%-llSpO8Yxs>!qG{!D?itG2 zqcUb1ev9AneeRVkT7O*%%r3L+E@T{Y#F!{rf%w*3&d$Zht3NXsckH+`WK1N1%&p&R zcmj`W_=61nALa6-1pkDGm;`0%JNx&ugN)l)**(|*Cd})|nFowqx1P}lWggbb8lGq~ z0^N<5*X{p;Y4V6F^|F7=D#^R#Lbh>bfT`DJS)2}yC3b(yp5mH3fnkQ_%|k44P8xP_ z-^+W)@{TdW3%kJgm)fUkCw6gyIhj=imVYKX~O65vMY za#E?RiZ75BRyeR^BO5wzI~fpF=0W?IJl09la-)*^NF-a2=MJ|id4s1Da+2&o?1Pf?k!}q zId&R@wvT7J8~lm(z*q<@nIytKgDZ(cG{kia_tJY6d32p1Py5_)sPeQ$PDBNN)9`ov zTMmauI9SS#Ff#}2VI$F{kMyT?P6>TLPw@+Dj2(WY3@LbukL^D3@6uCwWnO4p8s{8>^PpzAyRncHHbc}Hn-6x^!TY3~~ zPfHQi$zUva91(#vp?gqs6576_sEtl3qOKuSM12uci-^X8yxUjAv>Q)gI&d5f0kp(| zWSkM;ht13)W)%@jhJ6xdQ^KVb_0c&J8!lol_vlq6V4ei7E&=f(=6gzS4~d3QbU}3C zROQj=qUl(C3{OicEit8t#-!>~)g)O}*M^b?0%Z*Z${GliHN?WwmiTlm(Tiwqkw8nb z+9!FLlw9qXOrR{8Kv^<@vSin@kyym@Y>iK3f+8DgCOq3By}aCaze3)ZJ?{$AVwxwY z)kqlq~?j`0d7UN-DBO1^s7NSWk z#S&qoSrpJBZpAWjCzgx5utFT;^G@*x`h&PuT)_s1|>8zNA8+lUr?Ocy%@TAg)BKGlA zO)D%sle`hylEO{ot)UeQ@hsvr+A7*b$Da8b8&>EQoGL{V41BSYzLoH7!+$W}w1 zL7-j1{u*`#ertPO0r$}cl^iQiVkXNynN(s5>$NqeG#9ZxrYtRDLrh_LZj33hU=f>Q z$_%Dtb4$QHA7DoPi+hA``3L@kf3khPmay!BcTmRb I@Or%Azl(C19{>OV literal 0 HcmV?d00001 diff --git a/target/classes/daos/BaseDao.class b/target/classes/daos/BaseDao.class new file mode 100644 index 0000000000000000000000000000000000000000..0409070825801b68e36c634cdcfae169da532be3 GIT binary patch literal 609 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