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

JavaWeb dbutilsがSQLコマンドを実行し、結果セットを巡回できない理由の分析

JAVAWEB dbutilsでSQLコマンドを実行し、結果セットを巡回する際に内容を確認できない原因と対応方法は以下の通りです:

結果セットを巡回する際にbeanオブジェクトのみを巡回すると、最初の行の内容のみ出力される(最初の行はUserEntityクラスのインスタンスの出力です)ため、ここではre.getRepoTableName()を使用してオブジェクトを呼び出す必要があります

このようにして、値を取得することができます

PS:以下にJavaWebのDBUtilsの詳細な説明を示します:

一、DBUtilsとは何か及びその役割

  DBUtilsはapache社が書かれています。DBUtilsはJavaプログラミングにおけるデータベース操作のユーティリティであり、小さくて簡単で実用的です

  DBUtilsはJDBCの操作を封装し、JDBC操作を簡略化します。コードを少なく書けるようになります

  1.データテーブルの読み取り操作では、結果をList、Array、SetなどのJavaコレクションに変換して、プログラマーが操作しやすくなります

  2.データテーブルの書き込み操作では、SQL文を書くだけで簡単になります

  3.データソース、JNDI、データベース接続プールなどの技術を使用してパフォーマンスを最適化できます--既に構築したデータベース接続オブジェクトを再利用します

二、DBUtilsの3つの核心オブジェクト

  2.1、QueryRunnerクラス

    QueryRunnerはSQL文の操作に対応するAPIを提供します。主に以下の3つのメソッドがあります:query()はselectを実行、update()はinsert update deleteを実行、batch()はバッチ処理を行います。以下でこれらのメソッドの使用法を詳しく説明します。

  2.2、ResultSetHandler接口

    select操作の後、結果セットをどう封装するかを定義するために使用されます。これは全部で9よく使われる実装クラスがあります。以下で、どのように使用するか詳しく説明します。

  2.3、DbUtilsクラス

    これはツールクラスであり、リソースの閉じる方法とトランザクション処理を定義しています

三、DBUtilsフレームワークの使用方法

  3.1、使用手順

    対応するjarパッケージをインポートします

    QueryRunnerオブジェクトを作成します

      queryメソッドを使用してselect文を実行します

      ResultSetHandlerを使用して結果セットを封装します

      DbUtilsクラスを使用してリソースを解放します

  3.2、インスタンス

    注:私が使用しているのはCです3P0接続プール

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import 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语句执行select语句后,结果一返回值的形式传递过来
  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)参数中要有Connection对象。

           new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。                           

此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。

    4.1.2、常用方法 

  

        

        

        

  4.2、ResultSetHandler接口

    4.2.1、它有9个结果处理器

      ArrayHandler:適用して1件のレコード。そのレコードの各列の値をObject[]に包装します
      ArrayListHandler:適用して複数のレコードを取得。各レコードの各列の値をObject[]に包装し、それをListに包装します
      ColumnListHandler: 取某一列的数据。封装到List中。
      KeyedHandler: 取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
      MapHandler:適用於獲取1條記錄。將當前記錄的列名和列值放到一個Map中
      MapListHandler:適用於獲取多條記錄。將每條記錄封裝到一個Map中,再將Map封裝到List中
      ScalarHandler:适合取单行单列数据
      BeanHandler
      BeanListHandler

    4.2.2、インスタンス       

import static org.junit.Assert.*;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import 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中,key為指定的字段值。
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 //大的Map的key是表中的某列數據,小的Map的key是表的列名,所以大的map的key使用Object類型,小的是String。
 Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));
 for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
  System.out.println(m);//就是id至,因為設置了“1”.
  for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
  System.out.println(mm);//從小map中的key和value
  }
  System.out.println("--------------------");
 }
 }
 @Test
 public void test5() throws SQLException {
 //MapHandler:適用於獲取1條記錄。將當前記錄的列名和列值放到一個Map中
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
 Map<String, Object> map = qr.query("select * from user", new MapHandler());
 for (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());
 for (Map<String, Object> map : list) {
  for (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(",63;,?,?,?)", "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=",63;,password=",63; 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=",63; ","}}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();
 }
 }
}

まとめ

以上の内容は、編集者が皆さんに紹介したJavaWeb dbutilsがSQL命令を実行し、結果セットを巡回できない理由の分析です。皆さんの助けになれば幸いです。何かご不明な点があれば、コメントを残してください。編集者は迅速に回答します。また、呐喊ガイドへのサポートに感謝しています。

声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に提供された内容であり、本サイトは所有権を有しておらず、人工的な編集は行われていません。著作権侵害を疑う内容があれば、メールを送信してください:notice#oldtoolbag.com(メールを送信する際、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ