在JavaSwing中,当表使用联接包含空值时,如何将数据从DB添加到jTable?
好的,我有一个方法,从DB中获取数据,并将其放入如下列表:在JavaSwing中,当表使用联接包含空值时,如何将数据从DB添加到jTable?,java,mysql,swing,Java,Mysql,Swing,好的,我有一个方法,从DB中获取数据,并将其放入如下列表: public List<Sale> getSales() throws SQLException{ List<Sale> res = new ArrayList<Sale>(); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select sale.id,product.name,
public List<Sale> getSales() throws SQLException{
List<Sale> res = new ArrayList<Sale>();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select sale.id,product.name,sale.price,sale.quantity,sale.total,employee.name,buyer_seller.name from sale "
+ " join product on sale.product = product.id "
+ " join employee on sale.salesman = employee.id "
+ " join buyer_seller on sale.buyer = buyer_seller.id;");
while(rs.next()){
res.add(new Sale (rs.getInt(1),new Product(-1,rs.getString(2),new Category(-1,"",""),new Manufacturer(-1,"",""),0.0,-1),rs.getDouble(3),rs.getInt(4),rs.getDouble(5),new Employee(-1,rs.getString(6),"","",new JobCategory(-1,"",""),"",""),new BuyerSeller(-1,rs.getString(7),"","","")));
}
return res;
}
public List getSales()引发SQLException{
List res=new ArrayList();
语句st=conn.createStatement();
结果集rs=st.executeQuery(“从销售中选择sale.id、product.name、sale.price、sale.quantity、sale.total、employee.name、买方\卖方名称”
+“加入销售中的产品。产品=产品。id”
+“加入销售中的员工。sales=employee.id”
+“加入销售中的买方\卖方。买方=买方\卖方。id;”;
while(rs.next()){
res.add(新销售(rs.getInt(1)、新产品(-1、rs.getString(2)、新类别(-1、”、“”)、新制造商(-1、”、“”)、0.0、-1)、rs.getDouble(3)、rs.getInt(4)、rs.getDouble(5)、新员工(-1、rs.getString(6)、“”、“”、“”、“”、“”、“”)、新采购商(-1、rs.getString(7)、“”、“”、“”);
}
返回res;
}
然后我有一个方法,用这些数据填充jTable:
public void fillSales(){
jLabel1.setText("Podaci se ucitavaju iz baze...");
SwingWorker sw = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
MyShopRepository repo = MyShopRepository.getInstance();
List<Sale> allSale = repo.getSales();
return allSale;
}
@Override
protected void done() {
super.done();
try {
List<Sale> res = (List<Sale>)get();
DefaultTableModel dtm = (DefaultTableModel)jTable1.getModel();
int redova = dtm.getRowCount();
for(int i=0;i<redova;i++){
dtm.removeRow(0);
}
for(Sale s : res){
dtm.addRow(new Object[]{
s.id,s.product.name,s.price,s.quantity,s.total,s.salesman.name,s.buyer.name
});
}
jLabel1.setVisible(false);
} catch (InterruptedException | ExecutionException ex) { }
}
};
sw.execute();
}
public void fillSales(){
jLabel1.setText(“Podaci se ucitavaju iz baze…”);
SwingWorker sw=新SwingWorker(){
@凌驾
受保护对象doInBackground()引发异常{
MyShopRepository repo=MyShopRepository.getInstance();
List allSale=repo.getSales();
退还所有销售;
}
@凌驾
受保护的void done(){
超级。完成();
试一试{
List res=(List)get();
DefaultTableModel dtm=(DefaultTableModel)jTable1.getModel();
int redova=dtm.getRowCount();
对于数据库端的(int i=0;i,如果由于试图跨空值的表进行联接而看不到行,则使用左联接
而不是联接
在UI端,DefaultTableCellRenderer
将为任何null
对象返回一个空字符串。如果在JTable
中仍看到null
,则数据库很可能会将其作为字符串值“null”返回。若要绕过空字符串值,可以扩展DefaultTableCellRenderer
并重写setValue
方法以考虑“空”字符串值。例如:
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){
@Override
protected void setValue(Object value) {
setText((value == null || value.toString().equalsIgnoreCase("null")) ? "" : value.toString());
}
};
table.setDefaultRenderer(Object.class, renderer);
当我从DB表中删除一行(其中有一个FK)到另一个表时,我看不到JTTable中的行,该行上有一个FK的列的值为null,我使用on delete SET null。如果该行的某些列在DB中有一个null值,并且我希望它们的行可见,并且只显示它们的列,我在JTTable中看不到任何内容空..我有这个:,列“Radno mesto”也是另一个与FK连接的表,当我从表“Radno mesto”(第二个链接)中删除“sef”时,我在第一个表(第一个链接)中看不到任何内容我确实希望它们的行可见,它们的列只显示为空使用左连接