`
liufei.fir
  • 浏览: 675888 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用sqlite注意事项

阅读更多
最近对sqlite的jdbc使用操作进行了封装,发现在系统内部Satement, ResultSet等不能轻易关闭,封装会报错,下面和大家分享一下我的正确的使用
package org.liufei.cbook.dbcon;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;

public class SQLiteConn implements Serializable {
	private static final long serialVersionUID = 102400L;

	private DbFile dbfile ;

	public SQLiteConn(DbFile dbfile) {
		super();
		this.dbfile = dbfile;
	}
	
	/**
	 * 与SQLite嵌入式数据库建立连接
	 * @return Connection
	 * @throws Exception
	 */
	public Connection getConnection() throws Exception {
		Connection connection = null ;
		try{
			Class.forName("org.sqlite.JDBC", true, this.getClass().getClassLoader()) ;
			connection = DriverManager.getConnection("jdbc:sqlite:" + dbfile.getDbfilepath());
		}catch (Exception e) {
			throw new Exception("" + e.getLocalizedMessage(), new Throwable("可能由于数据库文件受到非法修改或删除。")) ;
		}
		return connection ;
	}
}

其中 org.liufei.cbook.dbcon.DbFile 是配置的数据库文件的路径类获取
package org.liufei.cbook.dbutils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class SQLiteCRUD {

	private Connection connection ;
	public SQLiteCRUD(Connection connection) {
		this.connection = connection ;
	}

	/**
	 * 创建表。
	 * @param sql
	 * @return boolean
	 */
	public boolean createTable(String sql){
		System.out.println(sql);
		Statement stmt = null ;
		try{
			stmt = this.connection.createStatement() ;
			stmt.executeUpdate(sql) ;
			return true ;
		}catch (Exception e) {
			System.out.println("创建指定表时异常 : " + e.getLocalizedMessage());
			connectionRollback(connection) ;
			return false ;
		}
	}
	
	/**
	 * 向指定表中插入一条数据。
	 * @param table 表名
	 * @param params 参数数组
	 * @return boolean
	 */
	public boolean insert(String table, String[] params){
		Statement stmt = null ;
		String sql = "insert into " + table  + " values('";
		for(int i = 0 ; i < params.length ;i++){
			if(i == (params.length - 1)){
				sql += (params[i] + "');") ;
			}else{
				sql += (params[i] + "', '") ;
			}
		}
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			stmt.executeUpdate(sql) ;
			return true ;
		}catch (Exception e) {
			System.out.println("向表插入" + table + "数据时异常 : " + e.getLocalizedMessage());
			connectionRollback(connection) ;
			return false ;
		}
	}
	
	/**
	 * 修改表中一个元组的数据。
	 * @param table 表名
	 * @param keyParam 要修改的元组的主键值
	 * @param keyField 要修改的元组的主键字段名称
	 * @param fields 要修改的元组的字段名称数组
	 * @param params 要修改的元组的值数组
	 * @return boolean
	 */
	public boolean update(String table, String keyParam, String keyField, String[] fields, String[] params){
		Statement stmt = null ;
		String sql = "update " + table + " set " ;
		for(int i = 0 ; i < fields.length ; i++){
			if(i == (fields.length - 1)){
				sql += (fields[i] + "='" + params[i] + "' where " + keyField + "='" + keyParam +"';") ;
			}else{
				sql += (fields[i] + "='" + params[i] + "', ") ;
			}
		}
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			stmt.executeUpdate(sql) ;
			return true ;
		}catch (Exception e) {
			System.out.println("修改表" + table + "数据时异常 : " + e.getLocalizedMessage());
			connectionRollback(connection) ;
			return false ;
		}
		
	}
	
	/**
	 * 删除指定表中指定键值的元组。
	 * @param table
	 * @param key
	 * @param keyValue
	 * @return boolean
	 */
	public boolean delete(String table, String key, String keyValue){
		Statement stmt = null ;
		String sql = "delete from " + table + " where " + key + "='" + keyValue + "';" ;
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			stmt.executeUpdate(sql) ;
			return true ;
		}catch (Exception e) {
			System.out.println("删除表" + table + "数据时异常 : " + e.getLocalizedMessage());
			connectionRollback(connection) ;
			return false ;
		}
	}
	
	/**
	 * 将一个表中满足指定条件的所有元组以Vector<Vector<Object>>的形式返回
	 * @param table
	 * @param key
	 * @param keyValue
	 * @return Vector<Vector<Object>>
	 */
	public Vector<Vector<Object>> selectVector(String table, String key, String keyValue){
		Statement stmt = null ;
		ResultSet rs = null ;
		
		Vector<Vector<Object>> value = new Vector<Vector<Object>>() ;
		
		String sql = "select * from " + table + " where " + key + "='" + keyValue + "';" ;
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			int columnCounts = getFieldsCounts(rs) ;
			while(rs.next()){
				Vector<Object> valueVector = new Vector<Object>() ;
				for(int i = 1; i <= columnCounts ; i++){
					valueVector.addElement(rs.getObject(i)) ;
				}
				value.addElement(valueVector) ;
			}
			return value ;
		}catch (Exception e) {
			System.out.println("查询表" + table + "数据时异常 : " + e.getLocalizedMessage());
			return value ;
		}
	}
	
	/**
	 * 返回制定sql语句查询的Vector<Vector<Object>>结果集
	 * @param sql sql语句
	 * @return Vector<Vector<Object>>
	 */
	public Vector<Vector<Object>> selectVector(String sql){
		Statement stmt = null ;
		ResultSet rs = null ;
		
		Vector<Vector<Object>> value = new Vector<Vector<Object>>() ;
		
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			int columnCounts = getFieldsCounts(rs) ;
			while(rs.next()){
				Vector<Object> valueVector = new Vector<Object>() ;
				for(int i = 1; i <= columnCounts ; i++){
					valueVector.addElement(rs.getObject(i)) ;
				}
				value.addElement(valueVector) ;
			}
			return value ;
		}catch (Exception e) {
			System.out.println("查询表sql数据时异常 : " + e.getLocalizedMessage());
			return value ;
		}
	}
	
	/**
	 * 将满足一定条件的指定表中所有元组数据以Object[][]形式返回
	 * @param table
	 * @param key
	 * @param keyValue
	 * @return Object[][]
	 */
	public Object[][] selectObject(String table, String key, String keyValue){
		Statement stmt = null ;
		ResultSet rs = null ;
		
		int columns = getFieldsCounts(table) ;
		int rows = getTableCount(table, key, keyValue) ;
		
		Object[][] tableObject = new Object[rows][columns] ;
		
		String sql = "select * from " + table + " where " + key + "='" + keyValue + "';" ;
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			int i = 0 ;
			while(rs.next()){
				for(int j = 0 ; j < columns ; j++){
					tableObject[i][j] = rs.getObject(j+1) ;
				}
				i++ ;
			}
			return tableObject ;
		}catch (Exception e) {
			System.out.println("查询表" + table + "数据时异常 : " + e.getLocalizedMessage());
			return tableObject ;
		}
	}
	
	/**
	 * 将一个表中所有的元组以Vector<Vector<Object>>的形式返回
	 * @param table
	 * @param key
	 * @param keyValue
	 * @return Vector<Vector<Object>>
	 */
	public Vector<Vector<Object>> select(String table){
		Statement stmt = null ;
		ResultSet rs = null ;
		
		Vector<Vector<Object>> value = new Vector<Vector<Object>>() ;
		
		String sql = "select * from " + table + ";" ;
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			int columnCounts = getFieldsCounts(rs) ;
			while(rs.next()){
				Vector<Object> valueVector = new Vector<Object>() ;
				for(int i = 1; i <= columnCounts ; i++){
					valueVector.addElement(rs.getObject(i)) ;
				}
				value.addElement(valueVector) ;
			}
			return value ;
		}catch (Exception e) {
			System.out.println("查询表" + table + "数据时异常 : " + e.getLocalizedMessage());
			return value ;
		}
	}
	
	/**
	 * 将一个表中所有的元组以Object[][]的形式返回
	 * @param table
	 * @return Object[][]
	 */
	public Object[][] selectObject(String table){
		Statement stmt = null ;
		ResultSet rs = null ;
		
		int columns = getFieldsCounts(table) ;
		int rows = getTableCount(table) ;
		
		Object[][] tableObject = new Object[rows][columns] ;
		
		String sql = "select * from " + table + ";" ;
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			int i = 0 ;
			while(rs.next()){
				for(int j = 0 ; j < columns ; j++){
					tableObject[i][j] = rs.getObject(j+1) ;
				}
				i++ ;
			}
			return tableObject ;
		}catch (Exception e) {
			System.out.println("查询表" + table + "数据时异常 : " + e.getLocalizedMessage());
			return tableObject ;
		}
	}
	
	/**
	 * 将一个ResultSet结果集中的所有字段以List形式返回
	 * @param resultSet
	 * @return List<String>
	 */
	public List<String> getFields(ResultSet resultSet){
		List<String> fieldsList = new ArrayList<String>() ;
		try {
			int columnCounts = resultSet.getMetaData().getColumnCount();
			for(int i = 1 ; i <= columnCounts ; i++){
				fieldsList.add(resultSet.getMetaData().getColumnName(i)) ;
			}
		} catch (SQLException e) {
			System.out.println("加载表中字段异常 :" + e.getLocalizedMessage());
			return null ;
		}
		return fieldsList ;
	}
	
	/**
	 * 将一个表中的所有字段以List形式返回
	 * @param resultSet
	 * @return List<String>
	 */
	public List<String> getFields(String table){
		List<String> fieldsList = new ArrayList<String>() ;
		Statement stmt = null ;
		ResultSet rs = null ;
		String sql = "select * from " + table + ";" ;
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			fieldsList = getFields(rs) ;
		}catch (Exception e) {
			System.out.println("查询表" + table + "数据时异常 : " + e.getLocalizedMessage());
		}
		return fieldsList ;
	}
	
	/**
	 * 将一个ResultSet结果集中的所有字段的数目返回
	 * @param resultSet
	 * @return int
	 */ 
	public int getFieldsCounts(ResultSet resultSet){
		try {
			return resultSet.getMetaData().getColumnCount();
		} catch (SQLException e) {
			System.out.println("加载表中字段异常 :" + e.getLocalizedMessage());
			return 0;
		}
	}
	
	/**
	 * 返回一个表的所有字段数目
	 * @param table
	 * @return int
	 */
	public int getFieldsCounts(String table){
		int counts = 0 ;
		Statement stmt = null ;
		ResultSet rs = null ;
		String sql = "select * from " + table + ";" ;
		System.out.println(sql);
		try{
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			counts = getFieldsCounts(rs) ;
		}catch (Exception e) {
			System.out.println("查询表" + table + "数据时异常 : " + e.getLocalizedMessage());
		}
		return counts ;
	}
	
	/**
	 * 查询一个表中的所有元组数目
	 * @param table
	 * @return int
	 */
	private int getTableCount(String table){
		String sql = "select count(*) from " + table + ";" ;
		Statement stmt = null ;
		ResultSet rs = null ;
		int counts = 0 ;
		try {
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			while(rs.next()){
				counts = rs.getInt(1) ;
			}
			return counts ;
		} catch (Exception e) {
			System.out.println("查询表" + table + "元组数时异常 : " + e.getLocalizedMessage());
			return counts ;
		}
	}
	
	/**
	 * 查询一个表中的满足一定条件的所有元组数目
	 * @param table 表名
	 * @param key 字段名称
	 * @param keyValue 字段值
	 * @return int
	 */
	private int getTableCount(String table, String key, String keyValue){
		String sql = "select count(*) from " + table + " where " + key + "='" + keyValue + "';";
		Statement stmt = null ;
		ResultSet rs = null ;
		int counts = 0 ;
		try {
			stmt = this.connection.createStatement() ;
			rs = stmt.executeQuery(sql) ;
			while(rs.next()){
				counts = rs.getInt(1) ;
			}
			return counts ;
		} catch (Exception e) {
			System.out.println("查询表" + table + "元组数时异常 : " + e.getLocalizedMessage());
			return counts ;
		}
	}
	
	private void connectionRollback(Connection connection){
		try {
			connection.rollback() ;
		} catch (SQLException e) {
			System.out.println("异常时回滚错误 : " + e.getLocalizedMessage()) ;
		}
	}
}

分享到:
评论
3 楼 honglei0412 2015-08-19  
我使用的是这种方式获取db文件的目录但是 URL p = FileLocator.find(Activator.getDefault().getBundle(), new Path("/projects"), null);
p = FileLocator.resolve(p);
String path = p.getPath();
System.out.println(path.toLowerCase());,

打包后生成exe可执行文件后 就获取不到这个db文件了,这个文件是在工程根目录下的projects文件夹下放着.
2 楼 honglei0412 2015-08-19  
大侠  能不能说明下DbFile您是怎么做的吗?
1 楼 jidilangzi603 2013-05-20  
大侠,能否说明一下DbFile类怎么配置?我现在正在研究Java项目集成sqlite数据库,维度数据库本地化配置这一块还没有弄明白,麻烦指导!非常感谢!

相关推荐

    C#对sqlite进行访问和修改,listBox,源码,教程,sqlite.Net

    资源清单: 1.源码:C#访问Sqlite数据库并显示在listBox中,并且支持对数据库的插入和删除。 2. 教程文档:该项目开发...3. 使用说明文档:该源码项目的使用说明和注意事项。 4. sqlite.Net。程序运行的必要安装软件。

    sqlite3-心得

    使用sqlite3更新数据库文件,以前是自己通过组织命令,进行table表的增删改等操作,但是最近几年NDS数据库和sqlite官方合作,可以通过RBU进行差分更新了。但是更新过程中也有一些注意事项。

    Android 解决sqlite无法创建新表的问题

    补充知识:Android studio sqllite数据库操作中关于表的创建和无法插入数据时的注意事项以及解决 创建表的sql语句 1.如果有条件的话。最好使用sqllite expert编辑代码测试,再复制到Android studio中 2.如果没有的话...

    sqlite开发文档全手册

    sqlite3开发api手册,注意事项,问题解答

    SQLite3的绑定函数族使用与其注意事项详解

    主要介绍了SQLite3的绑定函数族使用与其注意事项的相关资料,文中通过示例代码介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

    c#sqlite仓库管理系统源码

    一、源码描述 简易版仓库管理系统,具有查询,添加,修改,删除,入库操作,出库操作,浏览出库列表及详细功能。...三、注意事项 开发环境为Visual Studio 2017,数据库:SQLite,使用.net 2.0开发。

    C#访问sqlite并分页显示源码

    资源清单: 1.源码:C#访问Sqlite数据库并分页显示。 2. 教程文档:该项目开发的详细步骤,并添加了必要的说明。...3. 使用说明文档:该源码项目的使用说明和注意事项。 4. sqlite.Net。程序运行的必要安装软件。

    ecto_sqlite3:Ecto SQLite3适配器

    注意事项和限制请参阅Hexdocs中的。安装defp deps do { :ecto_sqlite3 , " ~&gt; 0.5.2 " }end用法定义与此类似的仓库。 defmodule MyApp . Repo do use Ecto . Repo , otp_app: :my_app , adapter: Ecto . Adapters . ...

    Sqlite文件上传下载 SqliteFileUploadDownload.rar

    Sqlite文件上传下载源码 源码描述: 一、菜单功能 1、C#实现对Sqlite数据库的操作。欢迎各位给出意见和建议。...三、注意事项 1、开发环境为Visual Studio 2013,数据库为SQLite,使用.net 4.0开发。

    php使用pdo连接sqlite3的配置示例

    主要介绍了php使用pdo连接sqlite3的配置方法,结合实例形式较为详细的分析了php基于pdo操作sqlite3的相关注意事项,需要的朋友可以参考下

    SQLiteCpp:SQLiteC ++(SQLiteCpp)是一个聪明易用的C ++ SQLite3包装器

    执照: 版权所有(c)2012至2020年塞巴斯蒂安Rombauts( ) 根据MIT许可证(MIT)分发(请参阅随附文件LICENSE.txt或在复制)关于重新分发SQLite源文件的注意事项如MIT许可证所述,欢迎您按照自己想要的方式重用,...

    Android+SQLite数据库实现的生词记事本功能实例

    主要介绍了Android+SQLite数据库实现的生词记事本功能,结合具体实例形式分析了Android操作SQLite数据库实现生词记录功能的操作步骤与相关注意事项,需要的朋友可以参考下

    importlite:将CSV文件导入SQLite数据库

    安装与注意事项 需要Python 2.7或3.2+ 经过SQLite 3.7版测试 与UTF-8编码文件兼容。 使用Python的软件包管理器pip从命令行进行安装。 --pre标志是必需的,因为importlite仍处于预发布阶段; 最新版本是0.1.0。 $...

    php基于SQLite实现的分页功能示例

    主要介绍了php基于SQLite实现的分页功能,结合具体实例形式分析了php操作SQLite数据库实现分页功能的相关技巧与注意事项,需要的朋友可以参考下

    后端开发技术要点&详细案例*注意事项

    了解常见的关系型数据库(如MySQL、PostgreSQL、SQLite)和非关系型数据库(如MongoDB、Redis)的基本原理和使用方法。学习使用ORM(对象关系映射)工具简化数据库操作。 4. 学习API设计 学习如何

    Windows平台Python连接sqlite3数据库的方法分析

    主要介绍了Windows平台Python连接sqlite3数据库的方法,结合实例形式分析了Windows平台安装SQLite数据库及创建、连接数据库的实现方法与相关注意事项,需要的朋友可以参考下

    andorid通讯录,基础练手app

    8.Activtiy+Intent的使用及注意事项 9.Android中的定时提醒及Service的运用 10. MVC框架的搭建及运用 11.Android自带手机通讯录数据库分析 12.导入导出通讯录 13.通讯录的备份与还原 买教学视频花了好多大洋的……...

    exqlite:Sqlite3 Elixir库

    注意事项使用Ecto适配器时,所有准备好的语句都使用LRU缓存进行缓存。 准备好的语句不是一成不变的。 在处理语句并将值绑定到语句时,您必须小心。 不要尝试同时操作语句。 保持隔离到一个进程。 所有本机调用都通过...

    服装进销存系统源码2012615

    服装进销存系统源码 项目描述 运行环境:VisualStudio2010 + SQLite 技术特点:使用了三层架构设计程序,更换底层数据库类型方便。...注意事项:SQLite的数据库建议使用Navicat To SQLite 打开。

Global site tag (gtag.js) - Google Analytics