connet.lolipop.jp
データベースクラスを作成
● データベースの構成

 データベース名 ->sample.DB
 テーブル名 ->sampleTbl

 テーブルの構造                
カラムタイプ
idINTEGER
nameTEXT
addressTEXT
memoTEXT
created_atTIMESTAMP
updated_atTIMESTAMP
 
データベースファイルの保存は管理しやすい場所でかまいませんが、ここでは設定を、以下のコードのように
「c:¥SQLite¥sample.DB」とすることにします。

「Sqlite」はプログラムの実行と同時に指定されたデータベースファイルの存在を、判断してくれます。
もしファイルが存在しない場合は、指定のファイルを自動生成してくれます。 ただし条件があり、テーブルを作成するコードに
”if not exists”文の挿入は必須になります。

SqliteDB.java
package sample.DB;

import java.sql.*;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;

public class SqliteDB { 
  private static Connection con = null; 
  public static void dbCon() throws SQLException, ClassNotFoundException {     
    Statement stmt = null;
    try {
      //sqlite JDBCドライバーのロード
      Class.forName("org.sqlite.JDBC");
    } catch (ClassNotFoundException ex) {
       System.out.println("JDBCドライバーが見つかりません?。\n" + ex);
       throw ex;
    }

    try {
      // データベース接続
      con = DriverManager.getConnection("jdbc:sqlite:c:/SQLite/sample.DB"); 
      // ステートメントの生成
      stmt = con.createStatement();                              
      // テーブル作成
      stmt.executeUpdate("create table if not exists sampleTbl(id integer primary key,name text,address text,memo text,created_at timestamp NOT NULL default (datetime(CURRENT_TIMESTAMP,'localtime')), updated_at timestamp NOT NULL default (datetime(CURRENT_TIMESTAMP,'localtime')))");                
    } catch (SQLException ex) {
          System.out.println("DB接続に失敗しました!。\n" + ex);
          throw ex;
    }
  }
    
  // 検索
  public static ResultSet dataQuery(String queryStmt) throws SQLException, ClassNotFoundException {          
    // CachedRowSetはDBから取得したデータを、メモリ上に格納した状態でもデータの操作が可能。
    RowSetFactory rowSetFactory = RowSetProvider.newFactory();
    CachedRowSet rowSet = rowSetFactory.createCachedRowSet();
    
    Statement stmt = null;
    ResultSet resultSet = null;
    try {
       dbCon();
       stmt = con.createStatement();
       resultSet = stmt.executeQuery(queryStmt);     
       // ResultSetオブジェクトのデータをpopulateメソットを使用して読み込む。
       rowSet.populate(resultSet);            
    } catch (SQLException ex) {
        System.out.println("検索に失敗しました!。\n" + ex);
        throw ex;
    } finally {
        if (resultSet != null) {
            resultSet.close();
        }
        if (stmt != null) {
            stmt.close();
        }
        if (con != null) {
            con.close();
        }
    }
    return rowSet;
  }
	
  // 追加・更新・削除
  public static void dbUpdate(String sqlStmt) throws SQLException, ClassNotFoundException {  
    Statement stmt = null;
    try {      
      dbCon();
      stmt = con.createStatement();
      stmt.executeUpdate(sqlStmt);
    } catch (SQLException ex) {
        System.out.println("データの処理に失敗しました!。\n" + ex);
    } finally {     
        if (stmt != null) {
          stmt.close();
        }
        if (con != null) {
          con.close();
        }
    }
  }
		
}
※CachedRowSetインタフェースについて
データベースから取得したデータをメモリ上に格納した状態で、いわばオフラインでも データの処理が可能。データ行のコンテナと言われます(Java7以降に搭載)。
参考:オフラインのResultSetとしてCachedRowSetを使う方法 - seraphyの日記
データベースの実行クラスを作成
● SQLの作成・発行

SqliteDBJ.java
package sample.DBJ;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Optional;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;

import sample.DB.SqliteDB;
import sample.model.SampleModel;

public class SqliteDBJ {
  // 登録
  public static void insertData (String name, String address, String memo) throws SQLException, ClassNotFoundException {                         
    String insertStmt;
    // SQL作成
    insertStmt = "INSERT INTO sampleTbl" + 
                "(name, address, memo)" + 
                "VALUES('" + name + "','" + address + "','" + memo + "')";
    
    try {
      // SqliteDBクラスへSQLを発行
      SqliteDB.dbUpdate(insertStmt);
    } catch (SQLException ex) {
        System.out.println("登録に失敗しました !。\n" + ex );
        throw ex;
    }
  }
  
  // id検索
  public static ObservableList searchId(String sql) throws SQLException,ClassNotFoundException {    
    // データの表示内容を作る --- コレクションクラスのインスタンスを作りリストのdataプロパティを定義
    ObservableList data = FXCollections.observableArrayList();
    // SQLを作成
    String idSql = "SELECT * FROM sampleTbl WHERE id="+sql;              
    try {
      // SqliteDbクラスへSQLを発行して結果を取得
      ResultSet rs = SqliteDB.dataQuery(idSql);          
      // データ内容を取得
      data = (ObservableList) searchIdData(rs);      
      return data;         
    } catch (SQLException ex) {           
      System.out.println("番号" + sql + "の検索に失敗しました!。\n" + ex);            
      throw ex;
    }                                      
  }

  // id検索(データ取得)
  private static ObservableList searchIdData(ResultSet rs) throws SQLException {
    ObservableList data = FXCollections.observableArrayList();
    if (rs.next()){
      data.add(new SampleModel(
      rs.getInt("id"),
      rs.getString("name"),
      rs.getString("address"),
      rs.getString("memo"),
      rs.getString("created_at"),        
      rs.getString("updated_at")     
      ));     
    }
    return data;
  }
  
  // 全件検索
  public static List searchAllData() throws SQLException, ClassNotFoundException {    
    // SQL作成
    String sql = "SELECT * FROM sampleTbl";        
    try {
      ResultSet rs = SqliteDB.dataQuery(sql);
      ObservableList data = searchAllDataList(rs);     
      return data; 
    } catch (SQLException ex) {           
      System.out.println("全件の検索に失敗しました!。\n" + ex);
      throw ex;
    }
  }

  // 全件検索(データ取得)
  private static ObservableList searchAllDataList(ResultSet rs) throws SQLException, ClassNotFoundException {      
    ObservableList data = FXCollections.observableArrayList();    
    while (rs.next()){
      data.add(new SampleModel(
      rs.getInt("id"),
      rs.getString("name"),
      rs.getString("address"),
      rs.getString("memo"),
      rs.getString("created_at"),        
      rs.getString("updated_at")));                                        
    }
    return data;
  }
  
  // memo更新
  public static boolean dataUpdate (String upId, String upMemo) throws SQLException, ClassNotFoundException {             
    Alert update_alert = new Alert (Alert.AlertType.CONFIRMATION);
    update_alert.setTitle("JavaFXSampleDataBase");
    update_alert.setHeaderText("更新確認");                          
    update_alert.setContentText(upId + "番のデータを更新します。\n"
      + "間違いなければOKボタンを押してください。");
    Optional result = update_alert.showAndWait();
    if(result.get() != ButtonType.OK){
      return false;
    }
    
    // 日時更新
    String updatedTime = "datetime(CURRENT_TIMESTAMP,'localtime')";    
    // SQL作成
    String upSql;
    upSql = "UPDATE sampleTbl SET updated_at = " + updatedTime + ", memo = '" + upMemo + "' WHERE id = " + upId ;       

    try {
      SqliteDB.dbUpdate(upSql);
      return true;
    } catch (SQLException ex) {
      System.out.print("更新に失敗しました!。\n" + ex);
      throw ex;
    }    
  }
  
  // 削除
  public static boolean dataDelete (String delId) throws SQLException, ClassNotFoundException {         
    Alert del_alert = new Alert (Alert.AlertType.CONFIRMATION);        
    del_alert.setTitle("JavaFXSampleDataBase");
    del_alert.setHeaderText("削除確認");                          
    del_alert.setContentText(delId + "番のデータを削除します。\n"
      + "間違いなければOKボタンを押してください。");
    
    Optional result = del_alert.showAndWait();
    if(result.get() != ButtonType.OK){
      return false;
    }
    
    // SQL作成  
    String delSql;
    delSql = "DELETE FROM sampleTbl" + " WHERE id = " + delId;
    try {
      SqliteDB.dbUpdate(delSql);
      return true;
    } catch (SQLException ex) {
      System.out.print("削除に失敗しました!。\n" + ex);
      throw ex;
    }     
  }
}
カラム「memo」について
更新処理は「memo」のみにしていますが、データを更新した際に、同時に日時も更新するようにしてます。
日付の処理について、Sqliteは時刻はUTCで出力するようですが、”localtime”を使うことで現地時間に変換してくれます。

Search
Google


↟ このページの先頭へ