2016年5月23日 星期一

範例 - 引用外部程式+SQLite範例

所謂引用外部程式,就是借助其他外部的.java或.jar程式碼或檔案,使腳本功能得以被擴充,像是SQLite與JFreeChart都是我會引用的jar檔。其實我們一直都在"引用",看看下面這個熟悉的範例。



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
lib "personal";

public class MyScript extends CustomCorePersonal
{
 public void init()
 {
  //對CustomCore_UI初始化
  CustomCore_UI_INIT();
 }
}

第一行的敘述就是引用外部程式,這裡引用一個目錄(script/library/personal),目錄下的所有.java檔都會一併被引用,最終也會引用到CustomCore(script/library/accustomcore)。

這邊另外提一件事,就是MyScript為什麼不直接繼承CustomCore,而要透過personal裡的CustomCorePersonal在去繼承CustomCore,其實主要是將腳色分配清楚,accustomcore由AC維護,personal由使用者自行維護,可在CustomCorePersonal中追加功能,如果AC要更新時就會比較容易替換。

---

也可以引用jar檔(一種壓縮檔,裡面放了很多編譯好的類別),這裡藉著引用jar檔的範例,順便示範一下SQLite的用法。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
lib "personal";
lib "sqlite-jdbc-3.8.7.jar";

import java.sql.*;
import org.sqlite.SQLiteConfig;
import org.sqlite.SQLiteDataSource;

public class MyScript extends CustomCorePersonal implements InpEventListener
{
 HtmlPanel my_panel = new HtmlPanel(BLACK, BLACK, false, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
 MyDB mydb = new MyDB();

 public void init()
 {
  //對CustomCore_UI初始化
  CustomCore_UI_INIT();

  //在側邊選單加入按鈕
  HtmlInputHelper html = new HtmlInputHelper(LIGHTGRAY);
  html.add(new InpBtn("建立資料表", this, new Args("cmd=create")));
  html.add(new InpBtn("新增資料", this, new Args("cmd=new")));
  html.add(new InpBtn("列出資料", this, new Args("cmd=list")));
  my_panel.setText(html.get());

  addTabPanel("資料庫", my_panel);
 }

 //處理按鈕事件
 public boolean eventOccurred(InpComponent comp, Args arg)
 {
  try
  {
   dbg.open();
   dbg.clear();

   if (arg != null && arg.get("cmd").equals("create"))
   {
    mydb.createTable();
    dbg.print("已建立資料表");
   }
   if (arg != null && arg.get("cmd").equals("new"))
   {
    String data = inpDialog("輸入資料", "輸入資料", "ABC");
    if (data != null && data.length() > 0)
    {
     mydb.insert(data);
     dbg.print("資料新增完成");
    }
   }
   if (arg != null && arg.get("cmd").equals("list"))
    mydb.listAll();
  }
  catch (Exception ex) {EX_HANDLE(EX_INT, ex);}
  return false;
 }


 //腳本終結時呼叫
 public void uninit()
 {
  //記得db要close
  if (mydb != null)
   mydb.close();
 }


 class MyDB
 {
  final String dbname = "mydbtest";
  final String tblname = "test";
  Connection con = null;

  public MyDB()
  {
   try
   {
    SQLiteConfig config = new SQLiteConfig();
    config.setSharedCache(true);
    config.enableRecursiveTriggers(true);

    SQLiteDataSource ds = new SQLiteDataSource(config);
    ds.setUrl("jdbc:sqlite:sqldb/"+dbname+".db");
    con = ds.getConnection();
   }
   catch (Exception ex) {EX_HANDLE(EX_INT, ex);}
  }

  //create Table
  public void createTable() throws SQLException
  {
   String sql = "DROP TABLE IF EXISTS "+tblname+" ;create table "+tblname+" (id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING);";
   Statement stat = null;
   stat = con.createStatement();
   stat.executeUpdate(sql);
   
  }

  //drop table
  public void dropTable() throws SQLException
  {
   String sql = "drop table "+tblname+" ";
   Statement stat = null;
   stat = con.createStatement();
   stat.executeUpdate(sql);
  }
  
  //新增
  public void insert(String name) throws SQLException
  {
   String sql = "INSERT INTO "+tblname+" (name) VALUES ('" + name + "')";

   Statement stat = con.createStatement();
   stat.executeUpdate(sql);
  }

  //修改
  public void update(int id, String name) throws SQLException
  {
   String sql = "update "+tblname+" set name = ? where id = ?";
   PreparedStatement pst = null;
   pst = con.prepareStatement(sql);
   int idx = 1 ;
   pst.setString(idx++, name);
   pst.setInt(idx++, id);
   pst.executeUpdate();
  }

  //刪除
  public void delete(int id) throws SQLException
  {
   String sql = "delete from "+tblname+" where id = ?";
   PreparedStatement pst = null;
   pst = con.prepareStatement(sql);
   int idx = 1 ;
   pst.setInt(idx++, id);
   pst.executeUpdate();
  }
  
  //列出
  public void listAll() throws SQLException
  {
   String sql = "select * from "+tblname+"";
   Statement stat = null;
   ResultSet rs = null;
   stat = con.createStatement();
   rs = stat.executeQuery(sql);
   int cnt = 0;
   while(rs.next())
   {
    cnt++;
    dbg.print(rs.getInt("id")+" : \t"+rs.getString("name"));
   }
   dbg.print("-------");
   dbg.print("共"+cnt+"筆");
  }

  public void close()
  {
   try
   {
    if (con != null)
     con.close();
   }
   catch (Exception ex) {EX_HANDLE(EX_INT, ex);}
  }
 }

}



引用的部分比較需要看的在2~6行,第二行引用的"sqlite-jdbc-3.8.7.jar"已經被放在script/library/下,其他幾行的import是java引用package的敘述,通常這種公開的jar檔在網路上都可以查到文件或範例。

---

另外一提,腳本還有一個固定會引用的目錄,就是script/library/default,裡面可以放一些使用者固定會引用java或jar檔,方便簡化開發流程。

沒有留言:

張貼留言

本人僅以個人知識經驗分享,多所無知,難免有錯,還請見諒。