6.1 RowSet bilan tanishish
Sen bilganingdek, JDBC standarti deyarli 20 yil bo'lib qoldi va u bir oz eskirgan. Unga asta-sekin yangi turlari va yangi sinflar qo'shilmoqda, lekin hamma joyda chiroyli qilib bo'lmaydi. Va shunday joylardan biri ResultSet.
Ma'lumotlar bazasi bilan ishlashni samaraliroq qilish mumkin, lekin ResultSet interfeysi bunga ko'p mos emas. Shu bilan birga, hech qayerda aniq obyektlar yaratmaymiz, bizga ularni executeQuery() metodi qaytaradi.
JDBC yaratuvchilari uzoq o'ylashmadi va avvaldan bo'lgan hamma narsaga to'liq parallel mexanizm yaratishdi. Va uning nomi RowSet bo'ldi.
Mana uning asosiy afzalliklari:
- RowSet ResultSet interfeysini kengaytiradi, shuning uchun uning funksiyalari ResultSetdan ko'ra kuchliroq.
- RowSet ma'lumotlar jadvalida erkin aylanishi mumkin va orqaga va oldinga siljiy oladi.
- RowSet kechirilgan ma'lumotlarni qo'llab-quvvatlaydi, ular hatto ulanish yopilganidan keyin ham ishlatilishi mumkin.
- RowSet yangi ulanish metodini qo'llab-quvvatlaydi, sen ma'lumotlar bazasiga ulanmasdan ulana olasan. Shuningdek, u XML ma'lumotlar manbaini o'qishni qo'llab-quvvatlaydi.
- RowSet ma'lumotlar filtrlashni qo'llab-quvvatlaydi.
- RowSet shuningdek, jadval birlashtirish operatsiyalarini qo'llab-quvvatlaydi.
RowSet turlari:
- CachedRowSet
- FilteredRowSet
- JdbcRowSet
- JoinRowSet
- WebRowSet
6.2 RowSet obyektini yaratish
Ishchi obyektni olishning uch xil yo'li mavjud.
Birinchi navbatda, uni klassik usul bilan olingan ResultSet ma'lumotlari bilan to'ldirish mumkin.
Masalan, biz CachedRowSet yordamida ResultSet ma'lumotlarini kechlashimiz mumkin:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results); // ResultSetni to'ldirish uchun foydalanamiz
Ikkinchi navbatda, ma'lumotlar bazasiga o'z ulanishini yaratib, to'liq mustaqil RowSet obyektini yaratish mumkin:
JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
rowSet.setUrl("jdbc:mysql://localhost:3306/test");
rowSet.setUsername("root");
rowSet.setPassword("secret");
rowSet.setCommand("SELECT * FROM user");
rowSet.execute();
Uchinchidan, RowSetni allaqachon mavjud bo'lgan ulanishga ulash mumkin:
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
JdbcRowSet rowSet = new JdbcRowSetImpl(con);
rowSet.setCommand("SELECT * FROM user");
rowSet.execute();
6.3 RowSet bilan ishlash misollari
Birinchi misol: keshlash.
Kod yozamiz, unda CachedRowSet yordamida barcha ma'lumotlarni kechlab, allaqachon yopilgan ulanishdan ularni o'qiymiz:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results); // ResultSetni to'ldirish uchun foydalanamiz
connection.close(); // Ulanishni yopamiz
// Kesh ma'lumotlari hali ham mavjud
while(crs.next()) {
System.out.println(crs.getString(1)+"\t"+ crs.getString(2)+"\t"+ crs.getString(3));
}
Ikkinchi misol: RowSet orqali satrlarni o'zgartirish:
// Ma'lumotlar bazasiga ulanamiz
CachedRowSet crs = rsf.createCachedRowSet();
crs.setUrl("jdbc:mysql://localhost/test");
crs.setUsername("root");
crs.setPassword("root");
crs.setCommand("SELECT * FROM user");
crs.execute();
// Bu turdagi operatsiya faqat mustaqil RowSetni o'zgartira oladi
// Avval kursornı bo'sh (yangi) satrga o'tkazamiz, joriy pozitsiya eslab qolinadi
crs.moveToInsertRow();
crs.updateString(1, Random.nextInt());
crs.updateString(2, "Клон" + System.currentTimeMillis());
crs.updateString(3, "Женский");
crs.insertRow(); // Joriy (yangi) satrni qolgan satrlarga qo'shamiz
crs.moveToCurrentRow(); // Kursornı oldindan turgan satrga qaytaramiz
crs.beforeFirst();
while(crs.next()) {
System.out.println(crs.getString(1) + "," + crs.getString(2) + "," + crs.getString(3));
}
// Endi o'zgarishlarimizni ma'lumotlar bazasiga yuklashimiz mumkin
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
con.setAutoCommit(false); // Sinxronizatsiya uchun kerak
crs.acceptChanges(con);// Ma'lumotlarni ma'lumotlar bazasiga sinxronlashtirish
Agar senga qiziq bo'lsa, qanday ishlashini bilish uchun rasmiy hujjatlarni o'qib chiqishing mumkin. Mening vazifam hozir shunchaki qaysi mavjudligini aytishdir.
GO TO FULL VERSION