在Java中使用Sqlite数据库

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 19:16   941   0

一、安装

下载最新的 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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP