2012年5月26日土曜日

SQLlite:グループ化

検索対象データベース

集計関数
MAX 最大値
MIN 最小値
AVG 平均値
COUNT データの個数

合計(Sum)
name別にpriceの合計を計算して表示
ResultSet rs = stmt.executeQuery("SELECT name,Sum(name) FROM data GROUP BY name "); 

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("price = " + rs.getInt(2));
}

結果:
name = いちご
price = 110
name = りんご
price = 201

データの個数(Count)
ResultSet rs = stmt.executeQuery("SELECT name,Count(name) FROM data GROUP BY name ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("count = " + rs.getInt(2));
}

結果:
name = いちご
count= 1
name = りんご
count= 2


複数の集計関数を指定
ResultSet rs = stmt.executeQuery("SELECT name,Sum(price),Avg(price) FROM data GROUP BY name ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("合計 = " + rs.getInt(2));
 System.out.println("平均 = " + rs.getFloat(3));
}

結果:
name = いちご
合計 = 110
平均 = 110.0
name = りんご
合計 = 201
平均 = 100.5

列名の指定(AS)
ResultSet rs = stmt.executeQuery("SELECT name,Sum(price) AS '合計' FROM data GROUP BY name ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("合計 = " + rs.getInt("合計"));
}

特定の集計行のみの表示(HAVING)
ResultSet rs = stmt.executeQuery("SELECT name,Sum(price) AS '合計' FROM data GROUP BY name HAVING Sum(price) > 200 ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("合計 = " + rs.getInt("合計"));
}

結果:
name = りんご
合計 = 201

SQLlite:並べ替え

ORDER BY句
カラム名を指定して並べ替え
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101
id = 2
date = 5/24
name = いちご
price = 110


ORDER BY句 昇順
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price ASC ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101
id = 2
date = 5/24
name = いちご
price = 110


ORDER BY句 降順
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price DESC ");

結果:
id = 2
date = 5/24
name = いちご
price = 110
id = 3
date = 5/23
name = りんご
price = 101
id = 1
date = 5/25
name = りんご
price = 100

ORDER BY句 複数カラムの指定
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price,id ");

指定を省略した場合は昇順
text型とimage型の列は指定できない。


2012年5月25日金曜日

SQLlite:検索

検索対象のデータベース


テーブルのデータ表示
ResultSet rs = stmt.executeQuery( "select * from data" );

表示:
Class.forName("org.sqlite.JDBC");
Connection connection = null;
// データベースに接続 なければ作成される
String databaseFullPass = "jdbc:sqlite:" + "E:/yamato/tvData/test.db";

connection = DriverManager.getConnection( databaseFullPass );
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( "select * from data");

while( rs.next() ) {
    System.out.println("id = " + rs.getInt("id"));
    System.out.println("date = " + rs.getString("date"));
    System.out.println("name = " + rs.getString("name"));
  System.out.println("price = " + rs.getInt("price"));
}

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 2
date = 5/24
name = いちご
price = 110
id = 3
date = 5/23
name = りんご
price = 101

WHERE句の使い方
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご'");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101

WHERE句+AND
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' AND price = '101'");

結果:
id = 3
date = 5/23
name = りんご
price = 101

WHERE句+OR
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' OR price = '110'");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 2
date = 5/24
name = いちご
price = 110
id = 3
date = 5/23
name = りんご
price = 101

WHERE句+NOT
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE NOT name = 'りんご' ");

結果:
id = 2
date = 5/24
name = いちご
price = 110

WHERE句+比較演算子
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' AND price = '100'  ");

priceが50以上101未満のデータを抽出
priceのデータ型がINTEGERでないと範囲指定できない。
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' AND price > 50 and price < 101 ");

結果:
id = 1
date = 5/25
name = りんご
price = 100

WHERE句+BETWEEN条件
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE price BETWEEN 50 and 100 ");

結果:
id = 1
date = 5/25
name = りんご
price = 100

IN条件
指定した値のリストにマッチするか
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE price IN ( 100 , 110) ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 2
date = 5/24
name = いちご
price = 110

LIKE条件
文字の検索条件を指定する。
%は「任意の文字数の任意の文字」
_は「1文字の任意の文字」,_は一文字にマッチ

__ 2文字の任意の文字列
a__b aで始まりbで終わる4文字の文字列


例:
name LIKE 'a%'は、nameがaで始まる任意の長さの文字列
name LIKE 'a%b'は、nameがaで始まりbで終わる任意の長さの文字列

name LIKE 'a_'は、nameがaで始まる2文字の文字列
name LIKE 'a_%b'は、nameが aで始まりbで終わる3文字以上の任意の長さの文字列

ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name LIKE 'り%' ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101


2012年5月24日木曜日

javacコマンドで文字コード指定


D:\lab\Java> javac -encoding UTF-8 Test.java


:16: エラー: この文字は、エンコーディングMS932にマップできません
               // TODO 閾ェ蜍慕函謌舌&繧後◆ catch 繝悶Ο繝?け

2012年5月22日火曜日

カッコで囲まれている文字の取得

String regex = "\\((.+?)\\)";//正規表現で指定
String target = "(abc)def(ghi)jkl";
List<String> omaewamoshindeiru = new ArrayList<String>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(target);
while (matcher.find()) {
    omaewamoshindeiru.add(matcher.group(1));
}
System.out.println( omaewamoshindeiru.get(0) );//abc

2012年5月17日木曜日

WebDriver:特定のリンクアドレスを取得する

gooで始まるリンクアドレスを取得する。

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  // 検索結果のURLを取得
  WebElement link = driver.findElement(By.partialLinkText("goo"));
  System.out.println(link.getAttribute("href"));
 }
}


検索結果:
https://www.google.co.jp/

WebDriver:ページのリンクを取得する

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  // Aタグを取得
  List<WebElement> cheese = driver.findElements(By.tagName("a"));

  // 取得した要素の0番目のリンクアドレス
  System.out.println(cheese.get(0).getAttribute("href"));
  
  // 取得した要素の0番目のリンクテキスト
  System.out.println(cheese.get(0).getText());
 }
}

WebDriver:IDを指定してテキストを取得する

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  // ブラウザ(Firefox)を起動
  // WebDriver driver = new FirefoxDriver();
  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  WebElement addDynamicElement = driver.findElement(By.id("add"));

  String actual = addDynamicElement.getText();
  
  System.out.println( actual );

 }
}

WebDriver:ページのタイトル取得

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  // ブラウザ(Firefox)を起動
  // WebDriver driver = new FirefoxDriver();
  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  System.out.println(driver.getTitle());

 }
}

WebDriver 準備

selenium-java-2.21.0.zip をダウンロードする。

解凍する。
selenium-java-2.21.0.jar と
libs フォルダのの中のファイルをプロジェクトのjavaビルドパスに追加する。

参考
その他のhtmlテストツール
HtmlUnit
HttpUnit::Httpプロトコルのテストを重視した作り