View Full Version : سوال: صفحه بندی فراخوانی از mysql در جاوا netbeans
cnmeysam
یک شنبه 17 بهمن 1395, 21:18 عصر
سلام
چطور میشه توی تیبل اطلاعاتی که از دیتابیس فراخوانی میشه صفحه بندیش کرد مثلا توی تیبل اول 10تا سطر اول از دیتابیس فراخوانی بشه دکمه next رو که میزنم از 10تا20 فراخوانی و نمایش داده بشه همینطور الی آخر و برعکس دکمه prev رو که میزنم 10تا 10تا کم کنه مثلا از 90تا 100 برگرده بشه 80تا89 و الی آخر من هرکاری کردم نتونستم مشخصات اتصال به دیتابیس رو توی یک کلاس تعریف کنم بعد توی فرم این عملیات رو درست انجام بدم فایل پروژه رو توی پیوست میذارم اگه میشه راهنماییم کنید یا اگه امکان داره پروژه رو ویرایش کنید برام ممنون میشم
درضمن من تازه کارم و هنوز 1هفته نیست با جاوا کار میکنم و هرچی هم تو برنامه نوشتم از آموزشهای توی اینترنت یاد گرفتم هیچ کلاسی نرفتم و آموزشی ندیدم
vahid-p
یک شنبه 17 بهمن 1395, 22:50 عصر
خب کدت درسته که!
دکمه اول و بعدی به درستی کار میکنه و دکمه قبلی و آخر رو که اصلا پیاده سازی نکردید. که به طریق مشابه میشه پیاده سازیش کرد.
اینم خروجی که از برنامه شما گرفتم (بدون هیچ تغییری):
http://s3.picofile.com/file/8285235892/java.jpg
cnmeysam
یک شنبه 17 بهمن 1395, 23:35 عصر
خب کدت درسته که!
دکمه اول و بعدی به درستی کار میکنه و دکمه قبلی و آخر رو که اصلا پیاده سازی نکردید. که به طریق مشابه میشه پیاده سازیش کرد.
اینم خروجی که از برنامه شما گرفتم (بدون هیچ تغییری):
http://s3.picofile.com/file/8285235892/java.jpg
شاید سوالم روبد پرسیدم
اول فکر میکنم روش کد نویسیم درست نیست
دوم برنامه شاکال اساسی داره دکمه صفحه بعد کار میکنه درسته ولی به صفحه آخر که میرسه متوقف نمیشه باز هم میره صفحه بعدی
دوم من یک لیبل گذاشتم به اسم lblpages گفتم تعداد سطرهای دیتابیس رو بشماره بریزه توی اون ولی این عمل انجام نمیشه نمیدونم چرا
در نتیجه کدی که گذاشتم برای توقف توی صفحه آخر کار نمیکنه مشکل من فقط توی این قسمته البته اگه روشی که باهاش صفحه بندی رو نوشتم درست باشه
اگه نباشه که کلا باید برنامه اصلاح بشه کدش
اگه میشه در درجه اول در مورد مشکل دوم یعنی کار نکردن لیبل راهنمایم کنید اون حل بشه برنامم کار میکنه لااقل
و اگه روحساب تنبلی و پرویی من نمیذارید بگبد روش کدنویسیم درسته یا اشتباه و اگه اشتباهه بگین چطوری باید این برنامه رو با راه بهتری بنویسم ممنون میشم
vahid-p
دوشنبه 18 بهمن 1395, 22:12 عصر
بذارید در مورد اشتباهات برنامه نویسی صحبت نشه چون همانطور که خودتون هم گفتید یک هفتست شروع کردید و انتظار نمیره خیلی چیزها رو از هفته اول رعایت کنید. از نام کلاس ها گرفته تا خیلی مسائل دیگه مشکل داره (اولین نکته برای نام کلاس ننویسید class... ، مشخصه کلاسه، شما باید اسمش رو بنویسید. مثلا DatabaseManager ). و از اسامی بامسما تری استفاده کنید، paging1 و paging2 خیلی بده.
ضمنا حتما از پکیج استفاده کن و کدهات رو تو default package نذار. لااقل یه پکیج main درست کن و کلاسهات رو داخل اون بذار. یا بنا به نیاز از پکیج های بیشتری استفاده کن.
بگذریم، نکات این چنینی زیاده.
ضمنا نیازی به پیچیده کردن برنامه برای خوندن url از یک فایل دیگه نبود. مستقیم داخل برنامه وارد میکردید.
کار با دیتابیس یکم کار داره، ولی به هر حال فعلا بهتون جواب میده (هر چند در کد زیر از prepareStatement به جای executeQuery مستقیم استفاده کردم، اینجا مهم نیست ولی علتش رو در اینترنت سرچ کنید).
ضمنا توصیه میکنم متدی که قراره از دیتابیس اطلاعاتی بگیره از متدی که میخواد اطلاعات رو برای جدول آماده کنه جدا باشه. شما همش رو در متد Query نوشتید که عملا برای دیگر بخش ها بلااستفاده میشه.
برای همین مجبور شدم برای اینکه بتونم تعداد سطرهای جدول رو بخونم، متد دیگه ای بنویسم. متدی که نوشتم تقریبا از کدهای خودت استفاده کردم، با اندکی تفاوت.
کلاسی نوشتم به اسم DatabaseUtil که هر کوئری بهش بدی، خروجی رو به صورت یک ArrayList ای از آرایه ای از String ها بهت میده. برای همین هم برای تعداد سطرها به درد میخوره هم برای پرکردن جدولت. این متد کاری به جداول و GUI برنامت نداره و برای همین استقلال بیشتری داره. از متدهای static استفاده کردم (برخلاف اینکه بهشون علاقه ای ندارم :لبخند: )
این کد DatabaseUtil.java:
import java.sql.Connection;import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DatabaseUtil {
private static Connection con;
private static String url = "jdbc:mysql://localhost:3306/testconection?user=root&password=123&useSSL=false";
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
Logger.getLogger(DatabaseUtil.class.getName()).log (Level.SEVERE, null, ex);
}
}
public static ArrayList<String[]> executeQuery(String query) {
String[] row;
int columnCount;
PreparedStatement st = null;
ResultSet rs = null;
ArrayList<String[]> results = new ArrayList<>();
try {
con = DriverManager.getConnection(url);
st = con.prepareStatement(query);
st.executeQuery();
columnCount = st.getMetaData().getColumnCount();
rs = st.getResultSet();
while (rs.next()) {
row = new String[columnCount];
for (int i = 1; i <= columnCount; i++) {
row[i - 1] = rs.getString(i);
}
results.add(row);
}
} catch (SQLException ex) {
Logger.getLogger(DatabaseUtil.class.getName()).log (Level.SEVERE, null, ex);
} finally {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (con != null) {
con.close();
}
} catch (SQLException ex) {
System.err.println("Error! " + ex.getMessage());
}
}
return results;
}
public static void main(String[] args) {
System.out.println(DatabaseUtil.executeQuery("select count(*) from users").get(0)[0]);
ArrayList<String[]> results = DatabaseUtil.executeQuery("select * from users");
for(String[] res:results){
System.out.println(Arrays.toString(res));
}
}
}
اگر این فایل رو اجرا کنید، خط اول تعداد سطرها رو بهتون میده و خطوط بعد داده های جدول users.
به هر حال این کلاس رو کنار سایر کلاسهات بذار. الان به راحتی داخل کلاس frmpaging میتونید با باز شدن برنامه این کد رو اجرا کنید:
lblpages.setText(DatabaseUtil.executeQuery("select count(*) from users").get(0)[0]);
مشکل صفحه بعدی، هم کافیه در این تابعی که نوشتم اگر اندازه خروجی صفر بود (results.size()==0)، جدول رو آپدیت نکنی. اما برای کد خودت تابع btnnextActionPerformed رو اینجوری تغییر بده:
int index = Integer.parseInt(lblrows.getText()); index = index + 10;
String sql = "select * from users limit " + index + ",10";
classtable obj = new classtable();
DefaultTableModel dtm = obj.Query(sql);
if (dtm.getRowCount() > 0) {
lblrows.setText(String.valueOf(index));
txtpage.setText(String.valueOf(index / 10));
datatable.setModel(dtm);
paging_Table();
String a = txtpage.getText();
String b = lblpages.getText();
if (Integer.parseInt(a) >= Double.parseDouble(b)) {
btnnext.setEnabled(true);
}
}
برای بهتر نوشتن، توصیه میکنم به جای استفاده از متد Query از کلاسی که نوشتم استفاده کنی و فقط برای قرار دادن نتایج در جدول، یک نگاشت ساده (در کلاس frmpaging) از مقادیر ArrayList به TableModel انجام بدید. اینجوری کار توسعه برنامه راحتتر میشه، در غیر این صورت به دردسر بر میخورید.
کد رو تا اونجایی که تغییر دادم رو پیوست کردم
cnmeysam
سه شنبه 19 بهمن 1395, 00:25 صبح
ممنون خیلی کمک کردی درسته زیاد نفهمیدم چی شد آخه کدها خیلی قاطی و شلوغ شده واسه منه تازه کار مثلا یه مشکلی که بود اینه توی کلاس اومدین فقط یک تیبل رو گذاشتین نمیدونم چطوری باید از این کلاس برای همه تیبل ها توی همه فرمهام استفاده کنم خیلی سخت شده. اون قسمت که گفتم از فایل بخونه کانکشن استرینگ برای این بود که هروقت خواستم بتونم توی فایل برنامه مشخصات دیتابیس رو عوض کنم برای اون هم یک فرم ساختم که مشخصات رو توی url.dll ذخیره میکنه راحتر میشه برام وقتی خروجی exe میگیرم از برنامه میتونم مشخصات مثلا آی پی پورت یوزر یا پس رو هروقت خواستم توی فرم پر کنم ذخیره کنم و بدون اینکه توی کد دست ببرم به سرور جدید وصل بشم روش دیگه ای بلد نبودم آخه
vahid-p
سه شنبه 19 بهمن 1395, 17:18 عصر
منظورتون از اینکه یک تیبل رو گذاشتم رو متوجه نشدم.
ببینید کافیه هر جای برنامه اطلاعات رو از دیتابیس بخونید، اینجوری بنویسی:
DatabaseUtil.executeQuery("Your query"); خروجی یک ArrayList از String[] میده. که تو کد نمونه ای که در main کلاس DatabaseUtil نوشتم میتونید ببینید چطور میشه اطلاعاتش رو خوند.
این کد رو هر جای برنامتون میتونید استفاده کنید و چون همه static هستن، نیازی به new کردن آبجکت نیست.
موفق باشید
cnmeysam
شنبه 23 بهمن 1395, 00:29 صبح
شرمنده باز به مشکل خوردم نتونستم کاری کنم کلاسی که شما نوشتین کانکشن رو از url من بخونه میشه کمکم کنید؟:گریه::افسرده:
چیکار کنم کلاس شما هم اطلاعات اتصال رو از فایل dll که ساختم بخونه؟؟؟؟:خجالت:
vahid-p
شنبه 23 بهمن 1395, 09:03 صبح
اگر نخوایم زیاد تغییرش بدیم، تو کلاس DatabaseUtil این متد static رو اضافه کن:
public static void setURL(String urlAddr){ url=urlAddr;
}
بعد تو main کلاس اصلی، frmpaging همونطور که قبلا آدرس url رو خوندی رو بخون و DatabaseUtil.setURL(...); وارد کن.
میشه:
public static void main(String args[]) { try(Scanner cin=new Scanner(new File("url.dll"))){
String url=cin.nextLine();
DatabaseUtil.setURL(url);
} catch (FileNotFoundException ex) {
Logger.getLogger(frmpaging.class.getName()).log(Le vel.SEVERE, null, ex);
}
...
...
cnmeysam
شنبه 23 بهمن 1395, 09:40 صبح
اینجوری هم نشد میشه پروژه رو ویرایش کنید بذارید شرمنده هنوز خیلی ناشی هستم
http://barnamenevis.org/attachment.php?attachmentid=144419&d=1486408466
import java.sql.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DatabaseUtil {
public static void setURL(String urlAddr)
{
url=urlAddr;
}
public static Connection con;
public static Statement stmt ;
public static ResultSet resSet ;
public static String url ;
public static void main(String args[]) {
try(Scanner cin=new Scanner(new File("url.dll"))){
String url=cin.nextLine();
DatabaseUtil.setURL(url);
} catch (FileNotFoundException ex) {
Logger.getLogger(frmpaging.class.getName()).log(Le vel.SEVERE, null, ex);
}
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
Logger.getLogger(DatabaseUtil.class.getName()).log (Level.SEVERE, null, ex);
}
}
public static ArrayList<String[]> executeQuery(String query) {
String[] row;
int columnCount;
PreparedStatement st = null;
ResultSet rs = null;
ArrayList<String[]> results = new ArrayList<>();
try {
con = DriverManager.getConnection(url);
st = con.prepareStatement(query);
st.executeQuery();
columnCount = st.getMetaData().getColumnCount();
rs = st.getResultSet();
while (rs.next()) {
row = new String[columnCount];
for (int i = 1; i <= columnCount; i++) {
row[i - 1] = rs.getString(i);
}
results.add(row);
}
} catch (SQLException ex) {
Logger.getLogger(DatabaseUtil.class.getName()).log (Level.SEVERE, null, ex);
} finally {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (con != null) {
con.close();
}
} catch (SQLException ex) {
System.err.println("Error! " + ex.getMessage());
}
}
return results;
}
}
vahid-p
شنبه 23 بهمن 1395, 22:46 عصر
دقیقا اون دو تکه کد رو اضافه کردم و جواب میده:
دانلود paging.zip (http://s4.picofile.com/file/8286024626/paging.zip.html)
cnmeysam
یک شنبه 24 بهمن 1395, 07:48 صبح
سلام
شرمنده ولی این فایل که فرستادی همون قبلیست
اصلا اصلاح نشده کانکشن باز هنوز بصورت دستی ست شده توی کلاس DatabaseUtil فکر کنم فایل رو اشتباهی آپلود کردید
private static String url = "jdbc:mysql://localhost:3306/testconection?user=root&password=123&useSSL=false";
vahid-p
یک شنبه 24 بهمن 1395, 23:23 عصر
این مقدار پیشفرضشه که دست نزدم. شما جای این رشته طولانی یک x بذارید بازم جواب میگیرید
cnmeysam
دوشنبه 25 بهمن 1395, 05:25 صبح
کاملا گیج شدم چطور اونجا x گذاشتم کار کرد پس url رو از کجا میخونه توی کلاس شما؟ توش کدی اضافه نشده آخه پس کانکشن رو الان از مکجا پیدا میکنه از کلاس paging خودم؟ شرمنده انقدر مزاحم میشم و وقتت رو میگیرما:افسرده::افسرده::خجا ت::خجالت:
vahid-p
دوشنبه 25 بهمن 1395, 12:24 عصر
کاملا گیج شدم چطور اونجا x گذاشتم کار کرد پس url رو از کجا میخونه توی کلاس شما؟ توش کدی اضافه نشده آخه پس کانکشن رو الان از مکجا پیدا میکنه از کلاس paging خودم؟ شرمنده انقدر مزاحم میشم و وقتت رو میگیرما:افسرده::افسرده::خجا ت::خجالت:
اگه چند پست قبلتر رو خونده باشید، نوشتم:
بعد تو main کلاس اصلی، frmpaging همونطور که قبلا آدرس url رو خوندی رو بخون و DatabaseUtil.setURL(...); وارد کن.
در نتیجه اون کد در متد main کلاس frmpaging اضافه شده. اونجا از فایل میخونه و با setURL این فیلد رو با مقدار جدید جایگزین میکنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.