- 浏览: 684996 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (254)
- java分布式应用架构 (22)
- SSH框架整合 (6)
- java web 学习笔记 (49)
- java 学习笔记 (56)
- struts 2 学习 (6)
- Hibernate学习 (10)
- spring 学习 (2)
- 客户端编程(javascript) (4)
- IDE使用 (13)
- 生命 人生 (6)
- 系统维护 (3)
- 技术篇 (10)
- MySql (2)
- J2ME (1)
- java网络编程 (4)
- 数据库 (5)
- C/C++ (8)
- Oracle (7)
- 软件测试 (0)
- 软件的安装和部署 (0)
- Java快讯 (1)
- swt (1)
- Flex (1)
- 软件工程 (1)
- PostgreSQL (1)
- sql server2000 (2)
- 嵌入式数据库sqlite (5)
- J2EE (1)
- XML (1)
- ibatis3(MyBatis) (6)
- Linux&Unix (1)
- velocity (1)
- 回报社会 (4)
- 软件项目管理 (3)
- android研究 (3)
- C# (2)
- Objective-C (1)
- 音乐 (0)
- webx (1)
- JMS (1)
- maven软件项目管理 (1)
- 分布式服务 (0)
- 云平台 (0)
- 分布式存储 (1)
- 分布式系统架构 (0)
- 移动互联网 (1)
- ZooKeeper (1)
最新评论
-
liyys:
楼主,可不可以发这个项目的源码工程出来分享一下,少了几个类。楼 ...
仿照Hibernate实现一个SQLite的ORM框架 -
liyys:
少了一些类的源码没有粘贴出来
仿照Hibernate实现一个SQLite的ORM框架 -
honglei0412:
我使用的是这种方式获取db文件的目录但是 URL p = Fi ...
使用sqlite注意事项 -
honglei0412:
大侠 能不能说明下DbFile您是怎么做的吗?
使用sqlite注意事项 -
ahack:
刚写完mapping才发现早就有人写好了。仔细一看还都是针对的 ...
仿照Hibernate实现一个SQLite的ORM框架
最近对sqlite的jdbc使用操作进行了封装,发现在系统内部Satement, ResultSet等不能轻易关闭,封装会报错,下面和大家分享一下我的正确的使用
其中 org.liufei.cbook.dbcon.DbFile 是配置的数据库文件的路径类获取
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文件夹下放着.
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数据库,维度数据库本地化配置这一块还没有弄明白,麻烦指导!非常感谢!
相关推荐
7. **注意事项** 在实际开发中,确保正确处理数据库连接,避免内存泄漏和资源浪费。同时,对于内存数据库,需要注意其数据的临时性,一旦程序关闭,所有数据都会丢失。 通过以上内容,我们了解了在Delphi中如何...
8. **注意事项**:在nwjs中使用sqlite3时,由于安全性和沙箱环境的限制,可能需要在主进程中而非渲染进程中操作数据库。使用`nw.App.dataPath`获取一个安全的本地存储路径。 9. **使用教程**:一旦编译完成并成功...
5. **注意事项**:由于Unity支持的平台各异,不同的平台可能需要不同版本的SQLite库。确保你使用的DLL文件适用于目标平台,并且在打包时遵循Unity的平台兼容性规则。 6. **错误处理和优化**:在实际开发中,还需要...
安全注意事项 - 存储密码时,应使用安全的方式,如哈希加盐,而不是明文存储,以增加安全性。 - 考虑使用异步方法处理数据库操作,避免阻塞UI线程。 - 错误处理是必须的,确保在出现异常时能妥善处理,避免程序崩溃...
#### 四、注意事项 1. **备份文件的选择**:选择合适的备份文件名和位置非常重要,以确保备份文件的安全。 2. **权限问题**:在执行备份或恢复操作时,确保当前用户具有足够的权限访问目标文件或目录。 3. **备份...
7. **注意事项**:在不同的Unity平台上,可能需要处理一些兼容性问题,例如,iOS平台可能需要预编译SQLite库。此外,考虑到性能和安全,应尽量减少在主线程中执行数据库操作,避免阻塞游戏的运行。 总之,Unity与...
### 注意事项 - 确保在创建数据库连接时设置正确的字符集,以正确显示中文数据。 - SQLiteSpy 支持多种操作系统,包括 Windows、Linux 和 macOS。 - 保存修改前记得备份原始数据库,以防意外丢失数据。 - 使用 ...
总结,董淳光的文章详细介绍了SQLite3的基本使用和编译步骤,为初学者提供了清晰的指南,同时也提醒了开发者关于性能和平台兼容性的注意事项。无论是在小型桌面应用还是移动设备中,SQLite3都是一个可靠且高效的...
**注意事项** 1. **备份数据**: 在进行任何重大更改之前,务必备份现有的MySQL数据库,以防万一需要回滚。 2. **测试环境**: 最好先在测试环境中进行转换,以确保一切正常工作后再应用到生产环境。 3. **性能比较**...
5. **注意事项**: - 考虑到VC6.0的年代较早,可能不支持现代C++特性,因此在使用时需注意兼容性问题。 - 记得管理内存,尤其是使用`sqlite3_malloc()`和`sqlite3_free()`时。 - 对于并发访问,需要了解SQLite的...
7. **注意事项** - 数据库文件的安全性:确保对数据库文件的访问权限控制得当,避免数据泄露。 - 事务管理:合理使用事务可以保护数据的一致性,尤其是在多线程环境中。 - 错误日志:记录错误信息有助于调试和...
在提供的压缩包文件“SQLite数据库文件自收缩.pdf”中,可能包含了关于如何使用VACUUM和PRAGMA语句进行数据库文件收缩的详细步骤、注意事项以及最佳实践。通过阅读这份文档,你可以深入理解这两个方法的工作原理,并...
4. 注意事项: - 关闭Cursor时,确保已经从适配器中解除引用,避免内存泄漏。 - 使用AutoRequery标志(适用于早期API),或使用LoaderManager(API 11+)来自动处理Cursor的生命周期。 - 为了性能考虑,尽量减少...
下面我们将详细探讨这两种转换的过程、相关的工具和注意事项。 1. Shapefile转SQLite: - **转换工具**:GDAL/OGR库是一个常用的开源工具,它提供了将Shapefile转换为SQLite的功能。你可以使用命令行工具 ogr2ogr ...
5. 开发者注意事项: - 错误处理:在使用SQLite API时,务必检查返回值,正确处理错误。 - 性能优化:了解如何使用pragma语句调整数据库性能,例如启用或禁用WAL模式。 - 安全性:确保对用户输入进行适当的参数化...
5. **注意事项** - **错误处理**: 在使用SQLite API时,务必检查返回值并处理可能出现的错误。 - **线程安全**: 考虑到SQLite的多线程支持级别,确保在多线程应用中正确管理连接和事务。 - **版本兼容性**: 不同...
7. **sqlite_port.htm** 和 **sqlite_port.doc**:这两个文件可能是关于SQLite在Symbian上移植的文档,详细介绍了在Symbian平台上的适应性修改和注意事项。 8. **TestApp**:这是另一个可能的应用程序测试实例,...
5. `install.txt`:安装指南或使用说明,可能包含了将SQLite Express集成到项目中的步骤和注意事项。 6. `license.txt`:包含了SQLite Express的许可协议,对于商业或非商业用途,开发者必须遵守其中的条款。 使用...
5. 注意事项: - 错误处理至关重要,因为SQLite3的API是异步的,需要检查每次调用的返回值。 - 记得释放资源,如关闭语句和数据库连接,避免内存泄漏。 - 考虑线程安全,如果多线程访问数据库,可能需要使用线程...
10. **文档分享**:为了方便他人使用,分享移植过程中的详细步骤、注意事项和可能遇到的问题,这有助于社区的协作和学习。 总之,SQLite3移植到开发板的过程涉及到源码编译、环境配置、依赖处理、文件系统集成、...