`
liufei.fir
  • 浏览: 685921 次
  • 性别: 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数据库,维度数据库本地化配置这一块还没有弄明白,麻烦指导!非常感谢!

相关推荐

    Delphi使用SQLite3内存数据库

    7. **注意事项** 在实际开发中,确保正确处理数据库连接,避免内存泄漏和资源浪费。同时,对于内存数据库,需要注意其数据的临时性,一旦程序关闭,所有数据都会丢失。 通过以上内容,我们了解了在Delphi中如何...

    nwjs(v0.14.7)中使用sqlite3所需的编译文件和使用教程

    8. **注意事项**:在nwjs中使用sqlite3时,由于安全性和沙箱环境的限制,可能需要在主进程中而非渲染进程中操作数据库。使用`nw.App.dataPath`获取一个安全的本地存储路径。 9. **使用教程**:一旦编译完成并成功...

    unity使用sqlite配置文件

    5. **注意事项**:由于Unity支持的平台各异,不同的平台可能需要不同版本的SQLite库。确保你使用的DLL文件适用于目标平台,并且在打包时遵循Unity的平台兼容性规则。 6. **错误处理和优化**:在实际开发中,还需要...

    winform连接sqlite3登陆功能实现

    安全注意事项 - 存储密码时,应使用安全的方式,如哈希加盐,而不是明文存储,以增加安全性。 - 考虑使用异步方法处理数据库操作,避免阻塞UI线程。 - 错误处理是必须的,确保在出现异常时能妥善处理,避免程序崩溃...

    sqlite3 命令行下备份与恢复

    #### 四、注意事项 1. **备份文件的选择**:选择合适的备份文件名和位置非常重要,以确保备份文件的安全。 2. **权限问题**:在执行备份或恢复操作时,确保当前用户具有足够的权限访问目标文件或目录。 3. **备份...

    Unity使用SQLite所需要的dll

    7. **注意事项**:在不同的Unity平台上,可能需要处理一些兼容性问题,例如,iOS平台可能需要预编译SQLite库。此外,考虑到性能和安全,应尽量减少在主线程中执行数据库操作,避免阻塞游戏的运行。 总之,Unity与...

    SQLite VC6.0 使用库

    5. **注意事项**: - 考虑到VC6.0的年代较早,可能不支持现代C++特性,因此在使用时需注意兼容性问题。 - 记得管理内存,尤其是使用`sqlite3_malloc()`和`sqlite3_free()`时。 - 对于并发访问,需要了解SQLite的...

    .net下使用sqlite3实例 SQLiteSpy

    ### 注意事项 - 确保在创建数据库连接时设置正确的字符集,以正确显示中文数据。 - SQLiteSpy 支持多种操作系统,包括 Windows、Linux 和 macOS。 - 保存修改前记得备份原始数据库,以防意外丢失数据。 - 使用 ...

    董淳光的SQLITE3_使用总结

    总结,董淳光的文章详细介绍了SQLite3的基本使用和编译步骤,为初学者提供了清晰的指南,同时也提醒了开发者关于性能和平台兼容性的注意事项。无论是在小型桌面应用还是移动设备中,SQLite3都是一个可靠且高效的...

    Wordpress改SqLite数据库操作

    **注意事项** 1. **备份数据**: 在进行任何重大更改之前,务必备份现有的MySQL数据库,以防万一需要回滚。 2. **测试环境**: 最好先在测试环境中进行转换,以确保一切正常工作后再应用到生产环境。 3. **性能比较**...

    SQLite3C++

    7. **注意事项** - 数据库文件的安全性:确保对数据库文件的访问权限控制得当,避免数据泄露。 - 事务管理:合理使用事务可以保护数据的一致性,尤其是在多线程环境中。 - 错误日志:记录错误信息有助于调试和...

    SQLite数据库文件自收缩_sqlite3_

    在提供的压缩包文件“SQLite数据库文件自收缩.pdf”中,可能包含了关于如何使用VACUUM和PRAGMA语句进行数据库文件收缩的详细步骤、注意事项以及最佳实践。通过阅读这份文档,你可以深入理解这两个方法的工作原理,并...

    SQLite适配器使用

    4. 注意事项: - 关闭Cursor时,确保已经从适配器中解除引用,避免内存泄漏。 - 使用AutoRequery标志(适用于早期API),或使用LoaderManager(API 11+)来自动处理Cursor的生命周期。 - 为了性能考虑,尽量减少...

    Shape与Sqlite数据转换

    下面我们将详细探讨这两种转换的过程、相关的工具和注意事项。 1. Shapefile转SQLite: - **转换工具**:GDAL/OGR库是一个常用的开源工具,它提供了将Shapefile转换为SQLite的功能。你可以使用命令行工具 ogr2ogr ...

    SQLCipher为sqlite数据库设置密码

    6. **安全注意事项**:尽管SQLCipher提供了强大的加密,但为了确保数据安全,还需要注意其他方面,比如避免在日志中泄露密码、定期更新密码策略、以及妥善处理内存中的敏感信息等。 7. **版本升级和迁移**:当需要...

    sqlite-3.24.0源码

    5. 开发者注意事项: - 错误处理:在使用SQLite API时,务必检查返回值,正确处理错误。 - 性能优化:了解如何使用pragma语句调整数据库性能,例如启用或禁用WAL模式。 - 安全性:确保对用户输入进行适当的参数化...

    供VC6使用的sqlite的SDK

    5. **注意事项** - **错误处理**: 在使用SQLite API时,务必检查返回值并处理可能出现的错误。 - **线程安全**: 考虑到SQLite的多线程支持级别,确保在多线程应用中正确管理连接和事务。 - **版本兼容性**: 不同...

    qt sqlite for symbian

    7. **sqlite_port.htm** 和 **sqlite_port.doc**:这两个文件可能是关于SQLite在Symbian上移植的文档,详细介绍了在Symbian平台上的适应性修改和注意事项。 8. **TestApp**:这是另一个可能的应用程序测试实例,...

    SQLite Express

    5. `install.txt`:安装指南或使用说明,可能包含了将SQLite Express集成到项目中的步骤和注意事项。 6. `license.txt`:包含了SQLite Express的许可协议,对于商业或非商业用途,开发者必须遵守其中的条款。 使用...

    数据库sqlite3 vs2010

    5. 注意事项: - 错误处理至关重要,因为SQLite3的API是异步的,需要检查每次调用的返回值。 - 记得释放资源,如关闭语句和数据库连接,避免内存泄漏。 - 考虑线程安全,如果多线程访问数据库,可能需要使用线程...

Global site tag (gtag.js) - Google Analytics