نمایش نتایج 1 تا 3 از 3

نام تاپیک: پر کردن اصولی jTable با یک resultSet چگونه؟

  1. #1

    پر کردن اصولی jTable با یک resultSet چگونه؟

    با سلام.

    چطوری عنوان تاپیک رو اجرا کنم؟

    از متد setModel چجوری استفاده بشه که یه جورایی jTable بایند بشه به resultSet ؟

    با تشکر

  2. #2
    کاربر دائمی
    تاریخ عضویت
    آبان 1386
    محل زندگی
    کرج
    پست
    238

    نقل قول: پر کردن اصولی jTable با یک resultSet چگونه؟

    سلام به همه
    من هم همین مشکل رو دارم و کدی که در زیر قرار میدم رو نوشتم.البته کامل نیست و کار نمی کنه.تعداد ستونهای جدول و نام ستونها رو میاره ولی محتویاتش نمیاد.کسی می دونه مشکل کار کجاست؟
    [CODE]package mypkg;

    import javax.swing.table.AbstractTableModel;
    import java.sql.Connection;
    import java.sql.Statement;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;

    public class tb extends AbstractTableModel{

    private Connection myCON;
    private Statement mySTATE;
    private ResultSet myRESULT;
    private ResultSetMetaData myMETA;

    public tb(){
    try{
    Class.forName("com.mysql.jdbc.Driver");
    myCON = DriverManager.getConnection("jdbc:mysql://localhost/testTable?useUnicode=true&characterEncoding=UTF8", "root","");
    mySTATE = myCON.createStatement();
    myRESULT = mySTATE.executeQuery("select * from urls;");
    myMETA = myRESULT.getMetaData();
    }
    catch(ClassNotFoundException e){
    e.printStackTrace();
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    }
    public Class getColumnClass(int column)throws IllegalStateException{
    try{
    String className = myMETA.getColumnClassName(column+1);
    }
    catch(Exception e){
    e.printStackTrace();
    }
    return Object.class;
    }

    public int getRowCount()throws UnsupportedOperationException {
    int row_count = 0;
    try{
    while(myRESULT.next()){
    row_count++;
    }
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    return row_count;
    }

    public int getColumnCount()throws UnsupportedOperationException {
    int col_count = 0;
    try{
    col_count = myMETA.getColumnCount();
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    return col_count;
    }

    public Object getValueAt(int rowIndex, int columnIndex)throws UnsupportedOperationException {
    try{
    myRESULT.absolute(rowIndex + 1);
    return myRESULT.getObject(columnIndex + 1);
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    return "";
    }

    public String getColumnName(int column){
    try{
    return myMETA.getColumnName(column + 1);
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    return "";
    }
    }
    [/CODE]

  3. #3
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    سن
    44
    پست
    966

    نقل قول: پر کردن اصولی jTable با یک resultSet چگونه؟

    نقل قول نوشته شده توسط FVVSBN مشاهده تاپیک
    با سلام.

    چطوری عنوان تاپیک رو اجرا کنم؟

    از متد setModel چجوری استفاده بشه که یه جورایی jTable بایند بشه به resultSet ؟

    با تشکر
    در زبانها Object Oriented باید فقط دید Objective داشت بر خلاف زبانهای دیگه مثل SQL. یکی از علتهایی که از ORM استفاده می شه سهولتی هست که تبدیل یک زبان غیر Object ی را به Objectی و بر عکس برای کسی کار develop انجام می ده رو فراهم می کنه.

    نکته: اگر از ORM ا ستفاده نمی کنیم باید زحمت ساخت Object رو باید developer انجام بشه.

    یک روش عملیاتی خوب برای پیاده سازی نکته بالا.

    به ازای هر table در قسمت database یک Class بسازید.
    به ازای هر فیلد از آن Table در database در همان کلاس آن فیلدها رو بسازید با همان data type.
    نام کلاسهایی که به ازای table ها می سازید با یک کلمه کلید مشخص کنید. برای مثال اگر در database یک table داشتید با نام user یک کلاس با هما نام به اضافه یک کلمه اضافه ثابت برای باقی class ها برای مثال UserModel

    حالا با خیال راحت مطمعن هستیم که به ازای هر table کلاسی با Model او table وجود داره.

    از این پس این مدل های ما هستن که تا دم دره قسمت query ها رد و بدل می شن.

    نکته: Object هایی از کلاسهای مدل ساخته می شن نماینده یک رکورد از database شما هستند.

    مثال اگر در یک table صد 100 رکورد وجود داشته باشد شما باید 100 object از آن class با پسوند Model در یک LinkedList داشته باشید.

    حالا می خواهیم گفتهامون رو عملی کنیم.

    مثال یک table بانام user که دارای سه فیلد هست رو در نظر بگیرید که این table دارای سه رکورد است. می خواهیم در کلاسی که با resultset کار می کنه این 3 object رو در یک لیست درست کنیم و در نهایت به هر لایه ای که خواستیم ببریمش.

    به کد اول که UserModel هست که در اصل table user رو Model می کنیم توجه کنید.

    public class UserModel implements Serializable{

    public Integer id;

    public String username;

    public String password;

    public Integer getId() {
    return id;
    }

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

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }
    }


    قسمت بعد کلاسی هست که قرار عمل query رو روی table user بزنه و تمام رکودها که سه تا هستن رو برای ما برداره و از class UserModel سه Object بسازه و در یک list نگاه داره.

    کد:

    import java.sql.*;
    import java.util.LinkedList;
    import java.util.List;

    /**
    * Created by IntelliJ IDEA.
    * User: azarmi
    * Date: 2/23/11
    * Time: 3:30 PM
    * To change this template use File | Settings | File Templates.
    */
    public class MyDao {

    public final static String USERNAME = "root";
    public final static String PASSWORD="babak";
    public final static String URL="jdbc:mysql://localhost:3306/babak";


    private Connection connection = null;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;

    public MyDao() {

    try {
    Class.forName("com.mysql.jdbc.Driver");

    connection = DriverManager.getConnection(MyDao.URL,MyDao.USERNA ME, MyDao.PASSWORD);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }

    public List<UserModel> getAllUserModels() throws Exception {
    LinkedList<UserModel> userModels = new LinkedList<UserModel>();
    String sqlCommand = "select * from user";
    preparedStatement = connection.prepareStatement(sqlCommand);
    resultSet = preparedStatement.executeQuery();

    while(resultSet.next()) {
    UserModel userModel = new UserModel();
    userModel.setId(resultSet.getInt(1));
    userModel.setUsername(resultSet.getString(2));
    userModel.setPassword(resultSet.getString(3));
    userModels.add(userModel);
    }

    resultSet.close();
    preparedStatement.close();

    return userModels;
    }

    public static void main(String[] s) throws Exception {
    /**
    * for testing your code
    */

    MyDao m = new MyDao();
    List<UserModel> allUserModels = m.getAllUserModels();
    System.out.println("allUserModels.size() = " + allUserModels.size());
    }
    }


    در کد بالا ما مقدار رو از database آوردیم حالا تو کد پایین از application به database می برییم

    کد:

    import java.sql.*;
    import java.util.LinkedList;
    import java.util.List;

    /**
    * Created by IntelliJ IDEA.
    * User: azarmi
    * Date: 2/23/11
    * Time: 3:30 PM
    * To change this template use File | Settings | File Templates.
    */
    public class MyDao {

    public final static String USERNAME = "root";
    public final static String PASSWORD = "babak";
    public final static String URL = "jdbc:mysql://localhost:3306/babak";


    private Connection connection = null;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;

    public MyDao() {

    try {
    Class.forName("com.mysql.jdbc.Driver");

    connection = DriverManager.getConnection(MyDao.URL, MyDao.USERNAME, MyDao.PASSWORD);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }



    public void createOrUpdateUser(UserModel userModel) throws Exception {
    /**
    * searching for the user
    * if the user is found so we have to update else we have new user and
    * we have to insert the new user
    * for finding the user we count the user.
    */

    String sqlCommandForCount = "select count(*) from user where username = ?;";

    String sqlCommandForInsert = "insert into user (username,password) values (?,?);";

    String sqlCommandForUpdate = "update user set password = ? where username=?;";

    int countResult = -1;

    // finding the user

    preparedStatement = connection.prepareStatement(sqlCommandForCount);
    preparedStatement.setObject(1, userModel.getUsername());
    String showSqlCommandForCount = preparedStatement.toString();
    System.out.println(showSqlCommandForCount);
    resultSet = preparedStatement.executeQuery();
    while (resultSet.next()) {
    countResult = resultSet.getInt(1);
    }

    preparedStatement.close();
    resultSet.close();

    if (countResult == 0) {
    //run insert query
    System.out.println("Start to Insert");
    preparedStatement = connection.prepareStatement(sqlCommandForInsert);
    preparedStatement.setObject(1, userModel.getUsername());
    preparedStatement.setObject(2, userModel.getPassword());
    String showSqlCommandForInsert = preparedStatement.toString();
    System.out.println(showSqlCommandForInsert);
    // connection.commit();
    preparedStatement.close();
    } else {
    // run update query
    System.out.println("Start to update");
    preparedStatement = connection.prepareStatement(sqlCommandForUpdate);
    preparedStatement.setObject(2, userModel.getUsername());
    preparedStatement.setObject(1, userModel.getPassword());
    String showSqlCommandForUpdate = preparedStatement.toString();
    System.out.println(showSqlCommandForUpdate);
    // connection.commit();
    preparedStatement.close();
    }

    connection.close();
    }

    public static void main(String[] s) throws Exception {
    /**
    * for testing your code
    */

    MyDao m = new MyDao();

    UserModel userModel = new UserModel();
    userModel.setUsername("babak");
    userModel.setPassword("babak");

    m.createOrUpdateUser(userModel);

    }
    }


    یکی از ابزارهایی که می تونه به سرعت develop شما اضافه کنه محصولی هست به نام JDBCTemplate. این کلاس به همراه framework spring بسیار راحت کرده کار رو و مدیریت خیلی از خطاها و این ساخت و ساز رو براتون راحت کرده. استفاده از اون رو به همه پیشنهاد می کنم.


    اما قسمت آخر. می خواهیم یک table داشته باشیم که مقدار خونده شده رو که بصورت Object یعنی List از UserModel ها درست کردیم رو نشون بده.

    نتکه: تعدا Object های توی لیست تعدار رکورد ها هست و فیلد های آنها مقدار هر فیلد در رکورد table.

    این قسمت به swing بر می گرده. یکی از روشهای ساده این چنین است.

    اول یک مدل درست می کنیم. یعنی اون حالتی که می خواهیم نمایش بدیم رو مدل می کنیم. اگر دقت کرده باشید در قسمت قبل هم ما یک مدل ساختیم که شامل تمام فیلدهای datavbase table هست. اما در این مدل که می خواهیم نشون بدیم شایل لازم نباشه که همه فیلدها رو نمایش بدیم یا شاید بخواهیم فیلدهای اضافه تری رو نشون بدیم برای همین دوباره یک مدل درنظر می گیرم. این بار با پسوند UIModel نشون می دیم که تغییر خاصی یا حالت خاصی از UserModel رو داریم پس در کلاس UserUIModel من فیلد ID رو حذف می کنم.

    کد :

    public class UserUIModel {

    public String username;
    public String password;

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }
    }


    حال زمان نشون دادن هست.

    یک کلاس برای فریم اصلی

    یک کلاس برای مدلی که می خواهم در جدول نشون بدم

    در نهایت در فریم اصلی کلاس JTable رو می زارمی که به این کلاس Model ساخته شده یا همون کلاس بالایی رو پاس می دم و در این کلاس مدلی که قبل درست کردیم رو پاس می دم UserUIModel.

    نکته : استفاده از کلاس UserUIModel در این مثل اختیاری هست. چون کلاس UserModel کامل تر از این کلاس هست. در صورتی که می خواستیم فیلدهای اضافه تر داشته باشیم می بایستی از این کلاس استفاده می کردیم. این کار فقط جنبه یادآوری داشت. من خودم هم استفاده در این مثال نمی کنم.

    ساخت کلاس model برای Jtable

    کد:

    import javax.swing.table.DefaultTableModel;
    import java.util.List;

    /**
    * Created by IntelliJ IDEA.
    * User: azarmi
    * Date: 2/23/11
    * Time: 4:18 PM
    * To change this template use File | Settings | File Templates.
    */
    public class UserTableModel extends DefaultTableModel {

    private MyDao myDao = new MyDao();
    private Object[] columns = {"username","password"};


    private void initializeTableModel() throws Exception {
    List<UserModel> allUserModels = myDao.getAllUserModels();
    Object[] obj = new Object[2]; // we know that we have 2 columns

    for (UserModel userModel:allUserModels) {
    obj[0] = userModel.getUsername();
    obj[1] = userModel.getPassword();
    this.addRow(obj);
    }
    }


    public UserTableModel() {
    try {
    this.initializeTableModel();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    @Override
    public int getColumnCount() {
    return this.columns.length;
    }

    @Override
    public String getColumnName(int column) {
    return this.columns[column].toString();
    }

    @Override
    public boolean isCellEditable(int row, int column) {
    return false;
    }
    }


    نکته : در متدود private initializerTableModel که در تابع سازنده این کلاس صدا شده. از کلاس MyDao که قبلا نوشته ایم رو صدا می کنه.

    چون تعداد فیلدهای جدول مشخص شده که 2 تا هست یک آرایه از Object به طول 2 تعریف می کنیم. متدود addRow که مال خود کلاس DefaultTableModel هست به ازای یک آرایه از Object یک رکورد یا یک row اضافه می کند. تعداد رکود ما که قبلا اشاره شده تعداد Object ها در List ما یا نتیجه query ما هست که قبلا بک list از UserModel درست شده است.

    باقی متدود ها بصورتی که مشاهده می کنید باید Override بشود. حداقل اون چند متدودی که الان من Override کردم.

    قسمت آخر اضافه کردن این model به Jtabel اصلی در فرم اصلی

    کد:

    import javax.swing.*;
    import java.awt.*;

    /**
    * Created by IntelliJ IDEA.
    * User: azarmi
    * Date: 2/23/11
    * Time: 4:40 PM
    * To change this template use File | Settings | File Templates.
    */
    public class MyForm extends JFrame {


    public MyForm() {
    this.setBounds(new Rectangle(300,300));
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.getContentPane().add(new JTable(new UserTableModel()));
    this.setVisible(true);
    }


    public static void main(String[] s) {
    new MyForm();
    }
    }


    خسته نباشین همگی.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •