Ho insegnato un corso anni fa, e poi ho usato alcuni esercizi JDBC usando quello che ora conosco come Active Record Pattern.
Mi piacerebbe modernizzare l'esercizio modificando il pattern Active Record in modo che le classi non facciano la loro persistenza. Ma non vorrei usare alcuna struttura di persistenza o ORM per scopi didattici.
Una classe di esempio è Vehicle:
- Riceve una connessione e un numero di targa nel costruttore.
- Nel costruttore interroga il database e popola i membri della classe e un membro booleano
existInDB
è impostato su true. - Se la piastra non viene trovata nel DB,
existInDB
rimane falsa. - Puoi cambiare lo stato dell'oggetto con i setter.
- Se chiami
save()
, inserisce nel database seexistInDB
è falso o aggiorna una riga nel database seexistInDB
è falso. - Dopo il refactoring la classe non sarebbe un semplice oggetto di trasferimento dati perché ha un metodo
doSomeBusinessThing()
che fa qualcosa di business. - Tutte le altre classi come Maker, Owner, usano anche il pattern Active Record, ma possiamo lasciarle da sole per ora.
Questo non è un codice di produzione. È materiale del corso Java SE. Non voglio introdurre framework per le persone che stanno imparando la lingua e / oi principi OOP per la prima volta. Un requisito della mia domanda è che deve essere basato su POJO. Forse usando un modello di design ma senza framework esterni o ORM.
Vorrei leggere i tuoi consigli su come eseguire un refactoring di questo tipo.
La classe del veicolo:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Vehicle {
private String plate;
private Model model;
private Owner owner;
private String color;
private String status;
private int year;
private boolean existInDB= false;
private Connection conn;
private ResultSet rs;
public Vehicle(Connection con_,String plate_) throws SQLException {
String sql=
"select \n"+
" v.plate, \n" +
" v.model_id, \n"+
" v.owner_id, \n"+
" v.color, \n"+
" v.status, \n"+
" v.year \n"+
"from \n"+
" vehicle v \n"+
"where \n"+
" v.plate = ? \n";
PreparedStatement ps = con_.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ps.setString(1, plate_);
rs = ps.executeQuery();
plate = plate_;
conn = con_;
if (rs.next()){
try {
model = new Model(conn,rs.getString("model_id"));
} catch (UnknownMakerException e) {
e.printStackTrace();
} catch (UnknownModelException e) {
e.printStackTrace();
}
try {
owner = new Owner(conn,rs.getInt("owner_id"));
} catch (UnknownOwnerException e) {
e.printStackTrace();
}
color = rs.getString("color");
status = rs.getString("status");
year = rs.getInt("year");
existInDB = true;
}
}
public void save() throws SQLException{
if (existsInDB()){
rs.absolute(1);
rs.updateString("plate",plate);
rs.updateString("model_id", model.getID());
rs.updateInt("owner_id", owner.getID());
rs.updateString("color", color);
rs.updateString("status", status);
rs.updateInt("year", year);
rs.updateRow();
} else {
rs.moveToInsertRow();
rs.updateString("plate", plate);
rs.updateString("model_id", model.getID());
rs.updateInt("owner_id", owner.getID());
rs.updateString("color", color);
rs.updateString("status", status);
rs.updateInt("year", year);
rs.insertRow();
}
}
public String getPlate() {
return plate;
}
public Model getModel() {
return model;
}
public Owner getOwner() {
return owner;
}
public String getColor() {
return color;
}
public String getStatus() {
return status;
}
public int getYear() {
return year;
}
public boolean existsInDB() {
return existInDB;
}
public void setPlate(String plate) {
this.plate = plate;
}
public void setModel(String modelID_) throws SQLException, UnknownModelException {
try {
this.model = new Model(conn,modelID_);
} catch (UnknownMakerException e) {
e.printStackTrace();
}
}
public void setOwner(int ownerID) throws SQLException, UnknownOwnerException {
this.owner = new Owner(conn,ownerID);
}
public void setColor(String color) {
this.color = color;
}
public void setStatus(String status) {
this.status = status;
}
public void setYear(int year) {
this.year = year;
}
protected void finalize() throws Throwable, SQLException
{
try {
PreparedStatement stmt = (PreparedStatement) rs.getStatement();
rs.close();
stmt.close();
stmt = null;
} finally {
super.finalize();
}
}
public String getDescription(){
return
this.getModel().getMaker().getName() + " " +
this.getModel().getName() + " " +
this.getColor() + " " +
this.getYear();
}
public String toString(){
return
"\nVEHICLE" +
"\nPlate: " +this.getPlate() +
"\nModel ID: " +this.getModel().getID() +
"\nOwner ID: " +this.getOwner().getID() +
"\nColor: " +this.getColor() +
"\nStatus: " +this.getStatus() +
"\nYear: " +this.getYear();
}
public void doSomeBusinessThing(){
/* some important business logic just to clarify
* that this is not a simple data transfer object
*/
}
}