在Java中使用Sqlite数据库

一、安装

下载最新的 Sqlite Jdbc 驱动程序jar文件,并添加到Java工程的class路径下;

二、使用

以 sqlite Jdbc 驱动版本为 sqlitejdbc-v56.jar 为例

SqliteHelper.java 类

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * sqlite帮助类,直接创建该类示例,并调用相应的借口即可对sqlite数据库进行操作
 * 
 * 本类基于 sqlite jdbc v56
 * 
 * @author haoqipeng
 */
public class SqliteHelper {
	final static Logger logger = LoggerFactory.getLogger(SqliteHelper.class);
	
	private Connection connection;
	private Statement statement;
	private ResultSet resultSet;
	private String dbFilePath;
	
	/**
	 * 构造函数
	 * @param dbFilePath sqlite db 文件路径
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public SqliteHelper(String dbFilePath) throws ClassNotFoundException, SQLException {
		this.dbFilePath = dbFilePath;
		connection = getConnection(dbFilePath);
	}
	
	/**
	 * 获取数据库连接
	 * @param dbFilePath db文件路径
	 * @return 数据库连接
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public Connection getConnection(String dbFilePath) throws ClassNotFoundException, SQLException {
		Connection conn = null;
		Class.forName("org.sqlite.JDBC");
		conn = DriverManager.getConnection("jdbc:sqlite:" + dbFilePath);
		return conn;
	}
	
	/**
	 * 执行sql查询
	 * @param sql sql select 语句
	 * @param rse 结果集处理类对象
	 * @return 查询结果
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public <T> T executeQuery(String sql, ResultSetExtractor<T> rse) throws SQLException, ClassNotFoundException {
		try {
			resultSet = getStatement().executeQuery(sql);
			T rs = rse.extractData(resultSet);
			return rs;
		} finally {
			destroyed();
		}
	}
	
	/**
	 * 执行select查询,返回结果列表
	 * 
	 * @param sql sql select 语句
	 * @param rm 结果集的行数据处理类对象
	 * @return
	 * @throws SQLException
	 * @throws ClassNotFoundException 
	 */
	public <T> List<T> executeQuery(String sql, RowMapper<T> rm) throws SQLException, ClassNotFoundException {
		List<T> rsList = new ArrayList<T>();
		try {
			resultSet = getStatement().executeQuery(sql);
			while (resultSet.next()) {
				rsList.add(rm.mapRow(resultSet, resultSet.getRow()));
			}
		} finally {
			destroyed();
		}
		return rsList;
	}
	
	/**
	 * 执行数据库更新sql语句
	 * @param sql
	 * @return 更新行数
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public int executeUpdate(String sql) throws SQLException, ClassNotFoundException {
		try {
			int c = getStatement().executeUpdate(sql);
			return c;
		} finally {
			destroyed();
		}
		
	}

	/**
	 * 执行多个sql更新语句
	 * @param sqls
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public void executeUpdate(String...sqls) throws SQLException, ClassNotFoundException {
		try {
			for (String sql : sqls) {
				getStatement().executeUpdate(sql);
			}
		} finally {
			destroyed();
		}
	}
	
	/**
	 * 执行数据库更新 sql List
	 * @param sqls sql列表
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public void executeUpdate(List<String> sqls) throws SQLException, ClassNotFoundException {
		try {
			for (String sql : sqls) {
				getStatement().executeUpdate(sql);
			}
		} finally {
			destroyed();
		}
	}
	
	private Connection getConnection() throws ClassNotFoundException, SQLException {
		if (null == connection) connection = getConnection(dbFilePath);
		return connection;
	}
	
	private Statement getStatement() throws SQLException, ClassNotFoundException {
		if (null == statement) statement = getConnection().createStatement();
		return statement;
	}
	
	/**
	 * 数据库资源关闭和释放
	 */
	public void destroyed() {
		try {
			if (null != connection) {
				connection.close();
				connection = null;
			}
			
			if (null != statement) {
				statement.close();
				statement = null;
			}
			
			if (null != resultSet) {
				resultSet.close();
				resultSet = null;
			}
		} catch (SQLException e) {
			logger.error("Sqlite数据库关闭时异常", e);
		}
	}
}

ResltSetExtractor.java 结果集处理类

import java.sql.ResultSet;

public interface ResultSetExtractor<T> {
	
	public abstract T extractData(ResultSet rs);

}

RowMapper.java 结果集行数据处理类

import java.sql.ResultSet;
import java.sql.SQLException;

public interface RowMapper<T> {
	public abstract T mapRow(ResultSet rs, int index) throws SQLException;
}

SqliteTest.java 测试类

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.junit.Test;

public class SqliteTest {
	
	@Test
	public void testHelper() {
		try {
			SqliteHelper h = new SqliteHelper("testHelper.db");
			h.executeUpdate("drop table if exists test;");
			h.executeUpdate("create table test(name varchar(20));");
			h.executeUpdate("insert into test values('sqliteHelper test');");
			List<String> sList = h.executeQuery("select name from test", new RowMapper<String>() {
				@Override
				public String mapRow(ResultSet rs, int index)
						throws SQLException {
					return rs.getString("name");
				}
			});
			System.out.println(sList.get(0));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

测试输出结果
sqliteHelper test

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值