Java与嵌入式数据库SQLite的结合

Wesley13
• 阅读 962

      最近研究了一下嵌入式数据库,并使用Java与一个叫做SQLite的轻量级数据库结合写了个小程序,这个过程中也获得了不少经验,下面来总结一下。

      本来是决定用Flex写的,因为它做出的界面比较美观,但是写完了界面发现连接数据库这方面Flex还处于幼儿阶段,而且支持的数据库也不多....所以不得不放弃而转向Java了。

      首先解释下为什么用嵌入式数据库,一是程序比较小,数据也不多,二是对于用户比较麻烦,安装一个小程序还要安装一个数据库软件。。。其次就是感觉有点大材小用了。

      原来也写了不少数据库变成的小程序,但有的细节还是没去研究,就像preparedStatement的executeUpdate()方法是返回一个整型数,当返回大于0的数,表示更新了 返回值的这么多条记录,而返回0时则有两种情况:

(1)  所执行的SQL语句是对数据库管理系统的记录进行操作;并且没有记录被更新

(2)  所执行的SQL语句是对数据库管理系统的表、视图等对象进行操作的DDL语言,没有数据记录被直接修改。

下面介绍一下SQLite:

      SQLite 是一款轻量级的、基于文件的嵌入式数据库,2000年就已经诞生,经过7年多的发展,直到今天已经成为最流行的嵌入式数据库,包括google在内的公司在其桌面软件中亦使用 SQLite 存储用户数据。由此可以看出,已经没有任何理由去怀疑SQLite的稳定性了。

SQLite的优势在哪呢?

1. 免配置,和access一样,只要把数据库文件通过ftp上传到服务器上就可以使用,不需要服务器的额外支持

2. 备份方便,因为只是一个文件,只要复制一份该文件,就能备份整个数据库

3. 虽然是轻量级数据库,但他支持最大 2tb 的单个库文件。

4. 快,无与伦比的快。经过实际测试,在几百万记录的情况下,SQLite的插入和查询速度和 mysql 不分上下,快于 sql server,10倍于 access (但这并不意味着它可以替代 sql server )

      这个程序使用SQLite作为数据库,嵌入在程中,但是在使用之前要下载它的驱动sqlitejdbc-v054.jar。

然后将这个包导入你的工程,然后导入org.sqlite.JDBC包即可,驱动程序名也是org.sqlite.JDBC,驱动程序地址:jdbc:sqlite:/d:/test.db。其中/d:/test.db表示建立数据库文件的地址和文件名。

最后给出一个测试程序,简单易懂:

package sqlitetest;
import java.sql.*;
//import SQLite.*;
import org.sqlite.JDBC;
public class TestConn {
    void test(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rset = null;
        System.out.println(new java.util.Date());
        try {  Class.forName("org.sqlite.JDBC");
        conn = DriverManager.getConnection( "jdbc:sqlite:/d:/test.db");
        conn.setAutoCommit(false);
        stmt = conn.createStatement();
        stmt.executeUpdate("create table hehe(id number, name varchar(32))");
        System.out.println("建表hehe成功!");
        for (int i=0; i<10000; i++) {
            System.out.print("插入条目i/n");
            System.out.println(stmt.executeUpdate("INSERT INTO hehe VALUES(" + i + ", '我爱中国" + i + "')"));
        }
        conn.commit();


        System.out.println("不建索引查询:");
        System.out.println(new java.util.Date());
        rset = stmt.executeQuery("SELECT id, name FROM hehe where id>5");
        while (rset.next()){
            System.out.println(rset.getInt("id"));
            System.out.println(rset.getString("name"));
        }
        if (rset!=null){
            rset.close(); rset = null;
        }
        System.out.println(new java.util.Date());




        System.out.println("建索引:");
        System.out.println(new java.util.Date());
        stmt.executeUpdate("CREATE INDEX hehe_idx on hehe(id)");
        stmt.executeUpdate("CREATE INDEX hehe_idx2 on hehe(name)");
        conn.commit();
        System.out.println(new java.util.Date());
        System.out.println("建索引后的查询:");
        System.out.println(new java.util.Date());
        rset = stmt.executeQuery("SELECT id, name FROM hehe where id > 5 ");
        while (rset.next()){
            System.out.println(rset.getInt("id"));
            System.out.println(rset.getString("name"));
        }
        System.out.println(new java.util.Date());
        stmt.executeUpdate("drop table hehe");
        System.out.println("删除表hehe成功!");
        conn.commit();
        System.out.println(new java.util.Date());
        } catch(ClassNotFoundException cnfe)
        {
            System.out.println("Can´t find class for driver: " + cnfe.getMessage());
            System.exit(-1);
        } catch (SQLException e){
            System.out.println("SQLException :" + e.getMessage());
            System.exit(-1); }
        finally {
            try {
                if (rset!=null) rset.close();
                stmt.close();
                conn.close();
            } catch (SQLException e) { System.out.println("SQLException in finally :" + e.getMessage());
            System.exit(-1);} } }

public static void main(String[] args) {
    TestConn conn = new TestConn();
    conn.test();
    System.out.print("Success!!");
}
}

好了,谢谢大家赏脸,睡觉时间到!!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这