JAVA将ID链接到其他表中的名称

时间:2015-07-26 13:49:14

标签: java mysql javafx tableview

我得到了一个带有tablecolumn(“ID”)的tableview。

如何链接ID以显示值? 例如:ID 90必须是“Shop”,ID 91必须是“Wallmart”..

我正在使用2张桌子:

Person(id,personName,personShopID)

项目(id,shopName)

PersonShopID链接到ITEMS ID,我必须显示shopName而不是ID ..

注意:我正在使用JavaFX并且我从mysql数据库获取数据并且我正在使用tcShopName.setCellValueFactory(new PropertyValueFactory<>("personShopID"));

亲切的问候!

 package databag;

import java.sql.Timestamp;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import vivesgoal.controller.CustomDate;

/**
 *
 * @author Lowie Menu
 */
public class PersoonBag {
    private int id;
    private String naam;
    private String voornaam;
    private Date geboortedatum;
    private String opmerking;
    private boolean isTrainer;
   private int ploeg_id;

    public PersoonBag(int id, String naam, String voornaam, Date geboortedatum, String opmerking,boolean isTrainer, int ploeg_id){
       this.id=id;
       this.naam=naam;
       this.voornaam=voornaam;
       this.geboortedatum=geboortedatum;
       this.opmerking=opmerking;
       this.isTrainer=isTrainer;
       this.ploeg_id=ploeg_id;
}

    public PersoonBag()
    {
    }


    public int getId() {
        return id;
    }

    public String getNaam() {
        return naam;
    }

    public String getVoornaam() {
        return voornaam;
    }

    public Date getGeboortedatum() {
        return geboortedatum;
    }

    public String getGeboortedatumAlter(){
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
        String datum = df.format(geboortedatum);
        return datum;
    }

    public CustomDate getMyDate(){
        return new CustomDate(geboortedatum.getTime());
    }

    public java.util.Date getGeboortedatumUtil(){
        return geboortedatum;
    }

    public String getOpmerking() {
        return opmerking;
    }

    public boolean isIsTrainer() {
        return isTrainer;
    }

    public int getPloeg_id() {
        return ploeg_id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setNaam(String naam) {
        this.naam = naam;
    }

    public void setVoornaam(String voornaam) {
        this.voornaam = voornaam;
    }

    public void setGeboortedatum(Date geboortedatum) {
        this.geboortedatum =geboortedatum;
    }

    public void setOpmerking(String opmerking) {
        this.opmerking = opmerking;
    }

    public void setIsTrainer(boolean isTrainer) {
        this.isTrainer = isTrainer;
    }

    public void setPloeg_id(int ploeg_id) {
        this.ploeg_id = ploeg_id;
    }


}

和班级队(荷兰人ploeg)

package databag;
/**
 *
 * @author Lowie Menu
 */
public class PloegBag {
    private int id;
    private String naam;
    private String niveau;
  private int trainer_id;

    public PloegBag(int id, String naam, String niveau, int trainer_id){
        this.id = id;
        this.naam = naam;
        this.niveau = niveau;
       this.trainer_id = trainer_id;
    }

    public PloegBag(){
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setNaam(String naam) {
        this.naam = naam;
    }

    public void setNiveau(String niveau) {
        this.niveau = niveau;
    }

    public void setTrainer_id(int trainer_id){
        this.trainer_id=trainer_id;
    }

    public int getId() {
        return id;
    }

    public String getNaam() {
        return naam;
    }

    public String getNiveau() {
        return niveau;
    }

    public int getTrainer_id(){
        return trainer_id;
    }

}

注意:我正在尝试将PersoonBag中的ploeg_id链接到PloegBag(ploegnaam)的名称。

这个sql代码为我提供了匹配id

的俱乐部的名称
select * from persoon AS p INNER JOIN ploeg AS ploeg ON p.ploeg_id =ploeg.id where ploeg.naam=?"

更新:ploeg.naam中没有值?也许这里有问题

P

ublic ArrayList<PersoonBag> zoekAlleSpelers() throws DBException, ApplicationException {

        ArrayList<PersoonBag> pb = new ArrayList<>();
        try (Connection conn = ConnectionManager.getConnection();) {

            try(PreparedStatement stmt = conn.prepareStatement(
            "select * from persoon inner join ploeg where persoon.ploeg_id = ploeg.id");) {
            // execute voert elke sql-statement uit, executeQuery enkel de eenvoudige
            stmt.execute();
            // result opvragen (en automatisch sluiten)
            try (ResultSet rs = stmt.getResultSet()) {

                    // van alle rekennigen uit de database,
               // RekeningBag-objecten maken en in een RekeningVector steken
               while (rs.next()) {
                  PersoonBag p = new PersoonBag();
                  PloegBag ploeg = new PloegBag();
                 // ploeg.setId(rs.getInt("id"));
                  ploeg.setNaam(rs.getString("naam"));



                  p.setId(rs.getInt("id"));
                  p.setNaam(rs.getString("naam"));
                  p.setVoornaam(rs.getString("voornaam"));                 
                  p.setGeboortedatum(rs.getDate("geboortedatum"));
                  p.setOpmerking(rs.getString("opmerking"));
                  p.setIsTrainer(rs.getBoolean("isTrainer"));
                  p.setPloeg_id(ploeg);

                  pb.add(p);

               }
               return pb;
            } catch (SQLException sqlEx) {
               throw new DBException(
                  "SQL-exception in zoekAlleRekeningen - resultset");
            }
         } catch (SQLException sqlEx) {
            throw new DBException(
               "SQL-exception in zoekAlleRekeningen - statement");
         }
      } catch (SQLException sqlEx) {
         throw new DBException(
            "SQL-exception in zoekAlleRekeningen - connection");
      }
   }

仍然没有找到问题..这是在表注释中存储来自sql查询的数据的函数:这​​只有ploegname没有显示

       PersoonDB pdb = new PersoonDB();
    ArrayList<PersoonBag> persoonbag = new ArrayList<>();   

    try {
        ArrayList<PersoonBag> spelersLijst = pdb.zoekAlleSpelers();
        for (PersoonBag r : spelersLijst) {
           PersoonBag speler = new PersoonBag(r.getId(),r.getNaam(), r.getVoornaam(),r.getMyDate(),r.getOpmerking(), r.isIsTrainer(),r.getPloeg_id());
           persoonbag.add(speler);
        }

        ObservableList<PersoonBag> spelers = FXCollections.observableArrayList(persoonbag);
        taSpelers.setItems(spelers);

细胞项目

 @FXML
    private TableView<PersoonBag> taSpelers;
    @FXML
    private TableColumn tcFamilienaam;
    @FXML
    private TableColumn tcVoornaam;
    @FXML
    private TableColumn tcOpmerking;
    @FXML
    private TableColumn<PersoonBag, CustomDate> tcGeboortedatum;
    @FXML
    private TableColumn<PersoonBag, PloegBag> tcPloeg;


@Override
public void initialize(URL url, ResourceBundle rb) {   
    tcFamilienaam.setCellValueFactory(new PropertyValueFactory<>("naam"));
    tcVoornaam.setCellValueFactory(new PropertyValueFactory<>("voornaam"));
    tcGeboortedatum.setCellValueFactory(new PropertyValueFactory<PersoonBag, CustomDate>("geboortedatum"));
    tcOpmerking.setCellValueFactory(new PropertyValueFactory<>("opmerking"));
    tcPloeg.setCellValueFactory(new PropertyValueFactory<>("ploeg"));    
    tcPloeg.setCellFactory(tc -> new TableCell<PersoonBag, PloegBag>() {
        @Override
        public void updateItem(PloegBag ploeg, boolean empty) {
            if (empty || ploeg ==null){
                setText("");
            } else{
                setText(ploeg.getNaam());
            }
        }
    });

UPDATE !!!我快到了!这是来自persoon的'naam'数据,而不是来自ploeg的'naam'!

问题:

 while (rs.next()) {

             PloegBag ploeg = new PloegBag();
             ploeg.setId(rs.getInt("id"));
           ploeg.setNaam(rs.getString("naam"));

           PersoonBag p = new PersoonBag();  
              p.setId(rs.getInt("id"));
              p.setNaam(rs.getString("naam"));
              p.setVoornaam(rs.getString("voornaam"));                 
              p.setGeboortedatum(rs.getDate("geboortedatum"));
              p.setOpmerking(rs.getString("opmerking"));
              p.setIsTrainer(rs.getBoolean("isTrainer"));
              p.setPloeg(ploeg);

              pb.add(p);

           }

当我放置niveau而不是'naam'时,它会得到正确的匹配结果!现在我需要这个名字..!

3 个答案:

答案 0 :(得分:0)

1)使用JDBC从Java程序建立与数据库的连接:

private static Connection getDBConnection()  {
    Connection connection = null;
    try {
      Class.forName("com.mysql.jdbc.Driver");
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase?autoReconnect=true&user=myUser&password=myPass");
    } catch (ClassNotFoundException | SQLException e) {
      System.out.println("Error on getDBCOnnection "+e.toString());
    } 
    return connection;
}

2)在如下查询中查询您的Items表:

SELECT shopName FROM Items WHERE ID = 90

爪哇:

public static ResultSet runQuery(String query) {
  if(conn == null){
      conn = getDBConnection();
  }
  Statement stmt;
  ResultSet rs;

  try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery(query);
    return rs;
  } catch (SQLException e) {
    System.out.println(e + " " + e.getMessage());
    return null;
  }
}

3)阅读结果

ResultSet rs = runQuery(query);
String result = rs.getString(1);

答案 1 :(得分:0)

不存储链接项的id,而是存储对项本身的引用。因此,您的PersoonBag课程将如下所示:

public class PersoonBag {
    private int id;
    private String naam;
    private String voornaam;
    private Date geboortedatum;
    private String opmerking;
    private boolean isTrainer;
    private PloegBag ploeg;

    public PersoonBag(int id, String naam, String voornaam, Date geboortedatum, String opmerking,boolean isTrainer, PloegBag ploeg){
       this.id=id;
       this.naam=naam;
       this.voornaam=voornaam;
       this.geboortedatum=geboortedatum;
       this.opmerking=opmerking;
       this.isTrainer=isTrainer;
       this.ploeg=ploeg;
    }

    public PersoonBag()
    {
    }

    public PloegBag getPloeg() {
        return ploeg ;
    }

    public void setPloeg(PloegBag ploeg) {
        this.ploeg = ploeg ;
    }

    // other get/set methods ...

}

现在,您可以使用SQL中的内部联接一次加载所有内容:

String sql = "select * from persoon inner join ploeg where persoon.ploeg_id = ploeg.id";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet rs = statement.executeQuery();
List<Persoon> persoonList = new ArrayList<>();
while (rs.next()) {
    PloegBag ploeg = new PloegBag();
    // populate ploeg with data from rs...
    PersoonBag persoon = new PersoonBag();
    persoon.setPloeg(ploeg);
    // populate persoon with remaining data from rs...
    persoonList.add(persoon);
}

(显然你可以修改SQL代码,例如从数据库中检索特定项目,或者通常只是为了改进它等等。)

现在您的JavaFX代码如下:

TableView<PersoonBag> persoonTable = new TableView<>();
TableColumn<PersoonBag, PloegBag> tcPloeg = new TableColumn<>("Ploeg");
tcPloeg.setCellValueFactory(new PropertyValueFactory<>("ploeg"));
// other columns...

要让单元格显示PloegBag所需的值,有两种方法。 “快速而肮脏”的方法只是在toString()类中定义PloegBag方法:

public class PloegBag {

    // ...

    @Override
    public String toString() {
        return naam ;
    }
}

但这并不是很令人满意,因为您可能希望toString()方法在您的应用程序中出于其他原因而执行其他操作。 “适当”的方式是使用细胞工厂:

tcPloeg.setCellFactory(tc -> new TableCell<PersoonBag, PloegBag>() {
    @Override
    public void updateItem(PloegBag ploeg, boolean empty) {
        if (empty || ploeg == null) {
            setText(null);
        } else {
            setText(ploeg.getNaam());
        }
    }
});

答案 2 :(得分:0)

Hibernate可以为你完成所有这些工作,包括查询......只是说......虽然第一次这样做会有陡峭的学习曲线......你需要建模你的容器对象以拥有这些字段,比如人会有:

class Person{
   long id;
   String name;
   String shopName;
   ...
}

然后在您的数据服务(数据提供者)中,您可以查询,请说:

SELECT p.id, p.name, s.name 
FROM person p, shop s 
WHERE p.shopId = s.shopId;

并提供简单的rowmapper

@Ovrride
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
  Person person = new Person(rs.getInt("personId"), rs.getString("personName"), rs.getString("shopName"));
  return person;
}

您最终会获得人员列表,您可以在应用内操作。正如前面提到的那样,你想要事先做到这一点。每次需要该列表时,您都会点击本地缓存,而不是返回到DB。您可以根据需要设置策略以刷新缓存。