[SQL] 어떻게 데이터베이스 데이터와의 TableView를 채우기 위해
SQL어떻게 데이터베이스 데이터와의 TableView를 채우기 위해
나는 데이터베이스에서 쿼리 데이터로의 TableView를로드하기 위해 노력했지만, 일에 그것을 얻을 수없는 것.
이것은 내 첫 번째 경우에, 데이터베이스 쿼리 항목과 데이터베이스를 채우기 위해 시도에 시도 내 코드가 mungled 보인다 훨씬 좋은에서입니다.
FXML은 자바 FX SceneBuilder를 통해 이루어졌다.
이 데이터베이스 쿼리 클래스입니다 :
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableView;
public class StudentInfo {
static String JDBC_DRIVER = "org.h2.Driver";
static String DB_URL = "jdbc:h2:file:C:/WAKILI/WAKILIdb";
// Database credentials
static final String USER = "sa";
static final String PASS = "";
public static Connection conn = null;
@FXML
private TableView<StudentInfo> lovelyStudents;
private ObservableList data;
// Public static ObservableList<COA> getAllCOA(){
public void getAllstudentInfo() {
Statement st = null;
ResultSet rs;
String driver = "org.h2.Driver";
try {
Class.forName(driver);
conn = DriverManager.getConnection(DB_URL, USER, PASS);
st = conn.createStatement();
String recordQuery = ("SELECT id, KIWI FROM KIWI");
rs = st.executeQuery(recordQuery);
while (rs.next()) {
ObservableList row = FXCollections.observableArrayList();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
row.add(rs.getString(i));
System.out.println(row);
}
data.add(row);
}
lovelyStudents.setItems(data);
} catch (ClassNotFoundException | SQLException ex) {
// CATCH SOMETHING
}
}
}
이것은 자바 FX 장면 빌더를 통해 생성 된 FXML 스크립트입니다 :
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="700.0" xmlns:fx="http://javafx.com/fxml" fx:controller="wakiliproject.SampleController">
<children>
<TableView prefHeight="400.0" prefWidth="700.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn prefWidth="75.0" text="Column X" />
</columns>
</TableView>
</children>
</AnchorPane>
해결법
-
==============================
1.다음은 데이터베이스에서있는 tableView에 충전 데이터에 대한 최적의 솔루션입니다.
다음은 데이터베이스에서있는 tableView에 충전 데이터에 대한 최적의 솔루션입니다.
import java.sql.Connection; import java.sql.ResultSet; import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn.CellDataFeatures; import javafx.scene.control.TableView; import javafx.stage.Stage; import javafx.util.Callback; /** * * @author Narayan */ public class DynamicTable extends Application{ //TABLE VIEW AND DATA private ObservableList<ObservableList> data; private TableView tableview; //MAIN EXECUTOR public static void main(String[] args) { launch(args); } //CONNECTION DATABASE public void buildData(){ Connection c ; data = FXCollections.observableArrayList(); try{ c = DBConnect.connect(); //SQL FOR SELECTING ALL OF CUSTOMER String SQL = "SELECT * from CUSTOMer"; //ResultSet ResultSet rs = c.createStatement().executeQuery(SQL); /********************************** * TABLE COLUMN ADDED DYNAMICALLY * **********************************/ for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){ //We are using non property style for making dynamic table final int j = i; TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1)); col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){ public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) { return new SimpleStringProperty(param.getValue().get(j).toString()); } }); tableview.getColumns().addAll(col); System.out.println("Column ["+i+"] "); } /******************************** * Data added to ObservableList * ********************************/ while(rs.next()){ //Iterate Row ObservableList<String> row = FXCollections.observableArrayList(); for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){ //Iterate Column row.add(rs.getString(i)); } System.out.println("Row [1] added "+row ); data.add(row); } //FINALLY ADDED TO TableView tableview.setItems(data); }catch(Exception e){ e.printStackTrace(); System.out.println("Error on Building Data"); } } @Override public void start(Stage stage) throws Exception { //TableView tableview = new TableView(); buildData(); //Main Scene Scene scene = new Scene(tableview); stage.setScene(scene); stage.show(); } }
여기서 참조 번호는
감사..
-
==============================
2.
public TableView queryToTable(String sql) { TableView result = new TableView(); ObservableList data = FXCollections.observableArrayList(); jdbcTemplate.query(sql, (rs)->{ for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){ final int j = i; TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1)); col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){ public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) { return new SimpleStringProperty(param.getValue().get(j).toString()); } }); result.getColumns().addAll(col); } while(rs.next()){ ObservableList<String> row = FXCollections.observableArrayList(); for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++) row.add(rs.getString(i)); data.add(row); } return null; }); return result; }
-
==============================
3.데이터베이스는 서로 다른 유형의 데이터가 포함되어있는 경우뿐만 아니라, 문자열, 다음 컬럼 형 할당 동적을하는 것이 좋습니다 :
데이터베이스는 서로 다른 유형의 데이터가 포함되어있는 경우뿐만 아니라, 문자열, 다음 컬럼 형 할당 동적을하는 것이 좋습니다 :
package sample; import javafx.application.Application; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; import java.sql.*; import java.util.ArrayList; import java.util.TimeZone; //Author: Yerbol //SQL database "sqlbase_schema" contains a Table "sqlbase_table" with 3 columns: "id" (Integer(INT(11))), "name" (String(VARCHAR(45))), "married" (Boolean(TINYINT(1))); public class Main extends Application { private TableView<Person> tableView = new TableView<>(); @Override public void start(Stage primaryStage) throws SQLException, ClassNotFoundException { //Show window buildData(); Parent root = tableView; primaryStage.setScene(new Scene(root, 300, 275)); primaryStage.show(); } public void buildData() throws ClassNotFoundException, SQLException { Connection dbConnection; //SQL Database connection params String dbHost = "localhost"; String dbPort = "3306"; String dbUser = "root"; String dbPassword = "12345"; String dbName = "sqlbase_schema"; String dbTableName = "sqlbase_table"; String select = "SELECT * FROM " + dbTableName; String connectionString = "jdbc:mysql://" + dbHost + ":" + dbPort +"/" + dbName+"?useLegacyDatetimeCode=false&&serverTimezone=" + TimeZone.getDefault().getID(); Class.forName("com.mysql.cj.jdbc.Driver"); //Connecting to Database dbConnection = DriverManager.getConnection(connectionString, dbUser, dbPassword); //Extracting data from Databasee ResultSet resultSet = null; try { PreparedStatement preparedStatement = dbConnection.prepareStatement(select); resultSet = preparedStatement.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } ObservableList dbData = FXCollections.observableArrayList(dataBaseArrayList(resultSet)); //Giving readable names to columns for(int i=0 ; i<resultSet.getMetaData().getColumnCount(); i++) { TableColumn column = new TableColumn<>(); switch (resultSet.getMetaData().getColumnName(i+1)) { case "id": column.setText("ID #"); break; case "name": column.setText("Person Name"); break; case "married": column.setText("Marital Status"); break; default: column.setText(resultSet.getMetaData().getColumnName(i+1)); //if column name in SQL Database is not found, then TableView column receive SQL Database current column name (not readable) break; } column.setCellValueFactory(new PropertyValueFactory<>(resultSet.getMetaData().getColumnName(i+1))); //Setting cell property value to correct variable from Person class. tableView.getColumns().add(column); } //Filling up tableView with data tableView.setItems(dbData); } public class Person { IntegerProperty id = new SimpleIntegerProperty(); //variable names should be exactly as column names in SQL Database Table. In case if you want to use <int> type instead of <IntegerProperty>, then you need to use getter/setter procedures instead of xxxProperty() below StringProperty name = new SimpleStringProperty(); BooleanProperty married = new SimpleBooleanProperty(); public IntegerProperty idProperty() { //name should be exactly like this [IntegerProperty variable name (id) + (Property) = idProperty] (case sensitive) return id; } public StringProperty nameProperty() { return name; } public BooleanProperty marriedProperty() { return married; } public Person(int idValue, String nameValue, boolean marriedValue) { id.set(idValue); name.set(nameValue); married.set(marriedValue); } Person(){} } //extracting data from ResulSet to ArrayList private ArrayList dataBaseArrayList(ResultSet resultSet) throws SQLException { ArrayList<Person> data = new ArrayList<>(); while (resultSet.next()) { Person person = new Person(); person.id.set(resultSet.getInt("id")); person.name.set(resultSet.getString("name")); person.married.set(resultSet.getBoolean("married")); data.add(person); } return data; } public static void main(String[] args) { launch(args); } }
"ID"(정수 (INT (11))), "이름"(문자열 (VARCHAR (45))), "결혼 (부울 (TINYINT :이 예제 SQL 데이터베이스"sqlbase_schema "에서 3 열"sqlbase_table의 "표 포함 (1)));
from https://stackoverflow.com/questions/18941093/how-to-fill-up-a-tableview-with-database-data by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 제대로 MySQL의에서 CASE..WHEN 사용합니까 (0) | 2020.05.25 |
---|---|
[SQL] 사슬로 매인 선택 박스 (국가, 주, 도시) (0) | 2020.05.25 |
[SQL] 데이터베이스 MySQL을 PDO 연결 [중복] (0) | 2020.05.25 |
[SQL] 오라클 OCI, ID 등 IN 바인드 변수 및 질의 (1, 2, 3) (0) | 2020.05.25 |
[SQL] ORA-22905 - SELECT 문을 사용하여 테이블 유형을 쿼리 할 때 (0) | 2020.05.25 |