JAVA 将 ID 链接到其他人的姓名 table

JAVA linking ID to name from other table

我得到了一个带有 table 列 ("ID") 的 table 视图。

如何link ID 显示值? 例如:ID 90 必须是 "Shop",ID 91 必须是 "Wallmart"..

我正在使用 2 tables:

人(id,personName,personShopID)

商品(id, shopName)

PersonShopID links 到 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队(dutch 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;
    }

}

注意:我正在尝试 link ploeg_id 从 PersoonBag 到 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 查询中的数据存储在 table 中的功能注意:这仅适用于 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());
            }
        }
    });

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

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 table:

SELECT shopName FROM Items WHERE ID = 90

Java:

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

不存储链接项目的 ID,而是存储对项目本身的引用。所以你的 PersoonBag class 看起来像:

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 值,有两种方法。 "quick and dirty"方式就是在PloegBag中定义一个toString()方法 class:

public class PloegBag {

    // ...

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

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

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

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;

并提供简单的行映射器

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

您最终得到了人员列表,您可以在应用程序中对其进行操作。正如前面有人提到的,您可能希望事先执行此操作。每次您需要该列表时,您都会访问本地缓存,而不是返回数据库。如果需要,您可以设置刷新缓存的策略。