SQLite文本数据库JDBC连接使用介绍
SQLite三种JDBC驱动的区别
SQLite Wrapper by Christian
http://www.ch-werner.de/javasqlite/
这个驱动其实是在本地C/C++的SQLite上用JDBC实现进行了包装。大小100+K。
优点:体积小;速度快
缺点:依赖本地SQLite驱动
SQLite Zentus Driver
http://www.zentus.com/sqlitejdbc/
这个驱动是SQLite数据库的纯Java实现,仅需要这个驱动就可以操作SQLite数据库文件。大小2.6M。
优点:无其他依赖
缺点:速度稍慢(纯Java实现)
SQLite Xerial Driver
http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC
这个驱动扩展了Zentus版本,并且在jar中加入了Windows、Linux、Mac OS X三种本地SQLite驱动库,使四种驱动并存于jar包中。其目的在于在不同的操作系统中自动使用不同的本地驱动(在这三种以外的系统中则使用纯Java实现的驱动),既保证无其他依赖,又保证速度最快。但是因为包含这么多版本的驱动,所以就比较大,大小有3M。
优点:速度快;无其他依赖
缺点:体积大
xerial官方网站
注意sqlite-jdbc-3.8.5-pre1.jar 、sqlite-jdbc4-3.8.2-SNAPSHOT.jar 这两个版本在Linux服务器上有BUG
会出现 java.lang.NoClassDefFoundError: org/sqlite/NativeDB
解决方法:使用版本 sqlite-jdbc-3.7.15-M1.jar
使用Demo
public class JDBCConnectionUtil {
private ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
private static Logger logger = Logger.getLogger(JDBCConnectionUtil.class);
public Connection getConnection() throws Exception {
Connection connection = threadLocal.get();
if (connection == null || connection.isClosed()) {
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:D\:/kaven/workcopy/Database.db");
threadLocal.set(connection);
} catch (Exception e) {
logger.error("获取JDBC连接出错", e);
throw e;
}
}
return connection;
}
public int executeUpdate(String sql) throws Exception{
Connection connection = null;
Statement stmt = null;
int res = 0;
try {
connection = getConnection();
connection.setAutoCommit(false);
stmt = connection.createStatement();
res = stmt.executeUpdate(sql);
connection.commit();
stmt.close();
connection.close();
return res;
} catch (Exception e) {
logger.error("", e);
throw e;
}
}
/**
* 判断表是否存在
* @param tableName 表名
* @return
* @throws Exception
*/
public static boolean isExist(String tableName) throws Exception {
JDBCConnectionUtil util = new JDBCConnectionUtil();
String testSQL = "select id from "+tableName;
Connection connection = null;
Statement stmt = null;
try {
connection = util.getConnection();
stmt = connection.createStatement();
stmt.executeQuery(testSQL);
}catch(Exception e){
if(e.getMessage() != null && e.getMessage().indexOf("no such table: "+tableName) != -1){
return false;
}
throw e;
}
return true;
}
}
}
图形化客户端工作
Sqliteman-win32
该工具有个Bug:图形化操作时,在原表上添加新的字段时会把原来的PK主键弄掉,而且不能重新设置(使用SQL语句也不行,SQLite不支持设置主键约束的SQL指令)
解决办法:在工具中直接写SQL语句添加新字段。