English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحليل الأسباب التي لا يمكن فيها تنفيذ أوتار SQL باستخدام dbutils في JavaWeb من خلال التحقق من النتائج

سبب عدم العثور على المحتويات عند تنفيذ JAVAWEB dbutils لجملة SQL ومعالجة مجموعة النتائج ومعالجة هذه المشكلة كما يلي:

عند مرور عبر مجموعة النتائج، يتم إخراج محتويات السطر الأول فقط إذا تم مرورها عبر كائنات الـ bean فقط (السطر الأول هو كائن تم استخدامه لـ UserEntity)، لذا يجب استخدام re.getRepoTableName() هنا لتتمكن من استدعاء المحتويات المطلوبة من خلال الكائن

بهذا يمكن الحصول على القيمة

ملاحظة إضافية: شرح مفصل لـ DBUtils في JavaWeb كما يلي:

أولاً، ما هو DBUtils وأهميته

  DBUtils مكتوبة من قبل شركة Apache. DBUtils هي أداة مفيدة بسيطة وسهلة الاستخدام لعمليات معالجة قاعدة البيانات في برمجة Java.

  يغلف DBUtils عمليات JDBC، مما يبسط عمليات JDBC. يمكن تقليل كتابة الكود.

  أولاً، يمكن له أن يتحول النتائج إلى List، Array، Set، وغيرها من مجموعات Java، مما يسهل على المبرمجين التعامل معها؛

  ثانيًا، يصبح تعريف عمليات الكتابة على جداول البيانات بسيطًا جدًا (فقط كتابة جملة SQL)

  يمكن استخدام مصادر البيانات، JNDI، خزائن الاتصال بالقاعدة البيانات، وغيرها من التقنيات لتحسين الأداء--إعادة استخدام عناصر الاتصال بالقاعدة البيانات المصنوعة مسبقًا

ثانياً، ثلاثة عناصر رئيسية لـ DBUtils

  2.1، كلاس QueryRunner

    يقدم QueryRunner واجهات API للتعامل مع جمل SQL. تحتوي على ثلاثة أساليب رئيسية: query() لتنفيذ select، update() لتنفيذ insert update delete، batch() معالجة جماعية. سأقوم بتقديم شرح مفصل حول استخدام هذه الأساليب.

  2.2، واجهة ResultSetHandler

    لتحديد كيفية تغليف مجموعة النتائج بعد تنفيذ عمليات select. يحتوي على 9 أنواع تقليدية، وسأقوم بتقديم شرح مفصل حول كيفية استخدامها.

  2.3، كلاس DbUtils

    إنه مكتبة أدوات تعريفية تعطي تعريف للطرق لإغلاق الموارد وتعاملات المعاملات

ثالثاً، كيفية استخدام إطار العمل DBUtils

  3.1، خطوات الاستخدام

    إدخال الجرابات المطلوبة

    إنشاء عنصر QueryRunner

      استخدام طريقة query لتنفيذ جملة select

      استخدام ResultSetHandler لتغليف مجموعة النتائج

      استخدام كلاس DbUtils لإطلاق الموارد

  3.2، نموذج

    ملاحظة: أنا أستخدم مكتبة C3P0 للتنسيق بين البيانات

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
إدراج java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import com.jxlg.domain.User;
public class TestSelect {
 @Test
 public void testSelect(){
 //إنشاء QueryRunner
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 try {
  // new ResultSetHandler<List<User>> يخبرنا كيف يتم تعبئة مجموعة النتائج
  List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
  @Override
  // بعد تنفيذ جملة query، يتم إرجاع النتائج على شكل قيمة
  public List<User> handle(ResultSet rs) throws SQLException {
   List<User> list = new ArrayList<User>();
   while(rs.next()){
   User u = new User();
   u.setId(rs.getInt(1));
   u.setUsername(rs.getString(2));
   u.setPassword(rs.getString(3));
   u.setEmail(rs.getString(4));
   u.setBirthday(rs.getDate(5));
   list.add(u);
   }
   return list;
  }
  });
  for (User user : list) {
  System.out.println(user);
  }
 } catch (SQLException e) {
  e.printStackTrace();
 }
}
 @Test
 public void testSelect2(){
 //إنشاء QueryRunner
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 try {
  // تنفيذ جملة SQL، وإرجاع النتائج
  List<User> list = qr.query("select * from user where id=? and username=?", new BeanListHandler<User>(User.class),1,"tom");
  for (User user : list) {
  System.out.println(user);
  }
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
}

الجزء الرابع: تفصيل ثلاثة كائنات رئيسية لـ DBUtils

  4.1、كائن QueryRunner

    4.1.1、المؤلفة

         new QueryRunner(); يمكن التحكم في معاملاته يدويًا.                    

ذلك يعني أن يجب أن يحتوي على كائن الاتصال (مثل: query،update،batch) في معاملات الطريقة التي يتم استدعاؤها.

           جديد QueryRunner(DataSource ds); معاملاته تكون自动ية. كل sql معاملته.                           

لا تحتاج إلى对象 Connection في معاملات الدالة (مثل query، update، batrch).

    4.1.2、الطرق الشائعة 

  

        

        

        

  4.2、واجهة ResultSetHandler

    4.2.1、يوجد 9 معالجات نتائج

      ArrayHandler: مناسب لاستخراج سجل واحد. يغلف كل قيمة عمود في Object[]
      ArrayListHandler: مناسب لاستخراج سجلات متعددة. يغلف كل قيمة عمود في Object[]، ثم يغلف هذه Arrays في List
      ColumnListHandler: استخراج بيانات عمود معين. يغلف في List
      KeyedHandler: استخراج سجلات متعددة، ويغلف كل سجل في Map، ثم يغلف هذه Maps في Map آخر، المفتاح هو قيمة الحقل المحددة.
      MapHandler: مناسب لاستخراج سجل واحد. يضيف اسم عمود القيمة الحالية في Map
      MapListHandler: مناسب لاستخراج سجلات متعددة. يغلف كل سجل في Map، ثم يغلف هذه Maps في List
      ScalarHandler: مناسب لاستخراج بيانات صفحة واحدة واحدة من عمود واحدة
      BeanHandler
      BeanListHandler

    4.2.2、مثال       

import static org.junit.Assert.*;
import java.sql.SQLException;
إدراج java.util.List;
إدراج java.util.Map;
إدراج java.util.Map.Entry;
import org.apache.commons.dbutils.QueryRunner;
إدراج org.apache.commons.dbutils.handlers.ArrayHandler;
إدراج org.apache.commons.dbutils.handlers.ArrayListHandler;
إدراج org.apache.commons.dbutils.handlers.BeanHandler;
إدراج org.apache.commons.dbutils.handlers.ColumnListHandler;
إدراج org.apache.commons.dbutils.handlers.KeyedHandler;
إدراج org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.jxlg.domain.User;
public class TestResultSetHandler {
 @Test
 public void test1() {
 //ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 try {
  Object[] o = qr.query("select * from user where id=?", new ArrayHandler(),5);
  for (Object object : o) {
  System.out.println(object);
  }
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 @Test
 public void test2() throws SQLException {
 //ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 List<Object[]> list = qr.query("select * from user", new ArrayListHandler());
 for (Object[] objects : list) {
  for (Object object : objects) {
  System.out.println(object);
  }
  System.out.println("----------------------");
 }
 }
 @Test
 public void test3() throws SQLException {
 //ColumnListHandler:取某一列的数据。封装到List中
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 List<Object> list = qr.query("select username,password from user ", new ColumnListHandler(1));
 for (Object object : list) {
  System.out.println(object);
 } 
 }
 @Test
 public void test4() throws SQLException {
 //KeyedHandler:取多条记录,每一条记录封装到一个Map中,
 //ثم قم بتغليف هذا Map في Map آخر، حيث يكون المفتاح هو القيمة المحددة للميدان.}
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 //المفتاح الكبير هو بيانات عمود في الجدول، والمفتاح الصغير هو اسم العمود في الجدول، لذا يتم استخدام نوع Object للمفتاح الكبير، ونوع String للمفتاح الصغير.
 Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));
 لـ (Map.Entry<Object, Map<String, Object>> m : map.entrySet()) {
  System.out.println(m); //هو id، لأن تم تعيين "1"
  لـ (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
  System.out.println(mm); //استخراج المفتاح والقيمة من الصغير
  }
  System.out.println("--------------------");
 }
 }
 @Test
 public void test5() throws SQLException {
 //MapHandler: مناسبة لاستخراج سجل واحد. قم بوضع اسم الحقل وحلقة القيمة في Map
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 Map<String, Object> map = qr.query("select * from user", new MapHandler());
 لـ (Map.Entry<String, Object> m : map.entrySet()) {
  System.out.println(m.getKey() + "\t" + m.getValue());
  //يتم أخذ السجل الأول بشكل افتراضي، يجب إضافة شرط باستخدام where لاستخراج السجلات الأخرى
 }
 }
 @Test
 public void test6() throws SQLException {
 //MapListHandler: مناسبة لاستخراج سجلات متعددة. قم بتغليف كل سجل في Map، ثم قم بتغليف Map في List
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 List<Map<String, Object>> list = qr.query("select * from user", new MapListHandler());
 لـ (Map<String, Object> map : list) {
  لـ (Map.Entry<String, Object> m : map.entrySet()) {
  System.out.println(m); 
  }
  System.out.println("-----------");
 }
 }
 @Test
 public void test7() throws SQLException {
 //ScalarHandler: مناسب لاستخراج بيانات عمود واحدة من سطر واحد
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 Object o = qr.query("select * from user", new ScalarHandler(2));
 System.out.println(o);
 } 
 @Test
 public void test8() throws SQLException {
 //BeanHandler: مناسب لاستخراج بيانات عمود واحدة من سطر واحد
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 User user = qr.query("select * from user", new BeanHandler<User>(User.class));
 System.out.println(user);
 } 
}

خامسًا: استخدم DBUtils كمثال على إضافة، حذف، تحديث واستعلام  

import static org.junit.Assert.*;
import java.sql.SQLException;
import java.util.Date;
import javax.crypto.spec.OAEPParameterSpec;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
public class TestInCURD {
 @Test
 public void testInsert() {
 //إنشاء QueryRunner
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 try {
  qr.update("insert into user (username,password,email,birthday)values(?,?,?,?)", "guapi","4646","[email protected]",new Date());
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 @Test
 public void testUpdate() {
 //إنشاء QueryRunner
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 try {
  qr.update("update user set username=?,password=? where id=4 ", "meizimeizi","520520");
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 @Test
 public void testDelete() {
 //إنشاء QueryRunner
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 try {
  qr.update("delete from user where id=? ",4);
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 @Test
 public void testBatch() {
 //إنشاء QueryRunner
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 try {
  Object[][] params = new Object[10][]; //مقدار عالي يمثل عدد مرات تنفيذ جملة SQL
  for(int i =0;i<params.length;i++){
  params[i] =new Object[]{"guapi"+i,"4646","[email protected]",new Date()}; 
  }
  qr.batch("insert into user (username,password,email,birthday)values(?,?,?,?)", params );
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
}

الخاتمة

تحليل الأسباب التي لا يمكن من خلالها تحديد المحتوى عند تنفيذ أمر SQL باستخدام dbutils في JavaWeb، أتمنى أن يكون هذا مفيدًا لكم، إذا كان لديكم أي استفسارات، يرجى ترك تعليق، وسأقوم بالرد على رسائلكم في الوقت المناسب. وأشكركم أيضًا على دعمكم لتعليمات النفخ!

بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق النشر، تم جمع المحتوى من قبل المستخدمين عبر الإنترنت الذين قاموا بتحميله بشكل تلقائي، ويتمتع هذا الموقع بلا حقوق ملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا اكتشفتم محتوى يشتبه في انتهاك حقوق النسخ، يرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وقدموا الأدلة ذات الصلة، وسنقوم بإزالة المحتوى المزعوم عن انتهاك حقوق النسخ فور التحقق منه.

توصيات لك