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

标签 java mysql javafx tableview

我得到了一个带有表列(“ID”)的 TableView 。

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

我使用 2 个表:

人物(id,人物名称,人物商店ID)

商品(id,商店名称)

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;
    }


}

和团队类(class)(荷兰语 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 中没有值(value)?也许问题在这里

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());
            }
        }
    });

更新!!!我快到了!它从 personoon 获取“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' 时,它会给我正确的匹配结果!现在我需要名字..!

最佳答案

不存储链接项目的 ID,而是存储对项目本身的引用。所以你的 PersonBag 类将如下所示:

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 中所需的值,有两种方法。 “快速而肮脏”的方法就是在 PloegBag 类中定义一个 toString() 方法:

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());
        }
    }
});

关于JAVA 将 ID 链接到其他表中的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31637705/

相关文章:

Mysql带日期范围、多表汇总查询

java - 使用 CSS 从聚焦选项卡中删除发光边框

JavaFX |用户名和密码检查无法正常工作

java - *基本* 单字符串列的 JavaFX TableView

Java 静态方法重写和接口(interface)

mysql - 比较两个不同表中的两列?

java - 如何获得圆表面的(x,y)?

PHP 和 MySQL 我看不到这个错误?

java - 有java注解列表吗?

java - 为什么 SQL Developer 不接受 JDK?