Jsp项目中使用SQLite免安装单文件数据库

零、需求

有的同学电脑上安装MySQL或者其他数据库时出现问题,无法安装相关数据库供JavaWeb项目使用,可以使用SQLite数据库解决相关问题。

壹、SQLite介绍

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。简单来讲就是不用安装,使用方便,可以随软件打包带走。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。

贰、使用方式

1. 程序包下载

新老版本都可以用,新版本(目前3.42.0.0)占用存储空间12.4M,老版本占用的存储空间更小(2M左右),选择合适的版本即可。新版本支持更多的函数,已知BUG更少,但是对于基本操作都差不多的。

我使用的是3.42.0.0版本

链接:

蓝奏云:https://minuhy.lanzout.com/b0c5yo69g 密码:dr3r

Maven官网:https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

镜像开源地址:https://gitcode.net/mirrors/xerial/sqlite-jdbc

2. 导入程序包

下载完成后得到一个jar文件,将其拖入WebContent\WEB-INF\lib目录即可。

3. 数据库封装代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /**
* SQLite數據庫封裝
*
* @author y17mm
* @time 2023-6-14 23:09:38
* @version 1.0
*/
public class DBUtil {
// 数据库文件存放位置
private static String dbFilePath = "D:\\sql.db"; // 单例模式
private static DBUtil db = null; private DBUtil() {
} public static DBUtil getDB() {
if (db == null) {
synchronized (new Object()) {
if (db == null) {
db = new DBUtil();
}
}
}
return db;
} Connection conn = null; // 連接對象
Statement stat = null; // 執行對象
ResultSet resu = null; // 結果集 static {
// 1. 加载驱动
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} /**
* 拿到數據庫連接
*
* @throws SQLException SQL錯誤異常
* @time 2023-6-14 23:08:09
*/
public void getConnection() throws SQLException {
// 2. 拿到连接
conn = DriverManager.getConnection("jdbc:sqlite:" + dbFilePath);
} /**
* 拿到Statement對象
*
* @throws SQLException SQL錯誤異常
* @time 2023-6-14 23:07:51
*/
public void getStatement() throws SQLException {
// 3. 拿到Statement对象
if (conn == null || conn.isClosed()) {
getConnection();
} stat = conn.createStatement();
} /**
* 執行SQL查詢語句
*
* @param sql SQL查詢語句
* @return 查詢結果對象
* @throws SQLException SQL錯誤異常
* @time 2023-6-14 23:07:23
*/
public ResultSet executeQuery(String sql) throws SQLException {
// 4. 执行SQL语句拿到结果
if (stat == null || stat.isClosed()) {
getStatement();
} System.out.println("执行的SQL语句:" + sql); resu = stat.executeQuery(sql);
return resu;
} /**
* 執行更改數據庫的語句(插入、更新、刪除、修改表等)
*
* @param sql SQL語句
* @return 影響的行數
* @throws SQLException SQL錯誤異常
* @time 2023-6-14 23:06:24
*/
public int executeUpdate(String sql) throws SQLException {
// 4. 执行SQL语句拿到结果
if (stat == null || stat.isClosed()) {
getStatement();
} System.out.println("执行的SQL语句:" + sql); return stat.executeUpdate(sql);
} /**
* 關閉連接
*
* @time 2023-6-14 23:06:00
*/
public void close() {
// 6.关掉连接
try {
if (resu != null && !resu.isClosed()) {
resu.close();
}
} catch (SQLException e) {
e.printStackTrace();
} try {
if (stat != null && !stat.isClosed()) {
stat.close();
}
} catch (SQLException e) {
e.printStackTrace();
} try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

4. 在Servlet中使用SQLite

以一个简单的登录业务为例:

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; @WebServlet("/login")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
HttpSession session = request.getSession();
PrintWriter out = response.getWriter(); // 1. 拿到数据
String phone = request.getParameter("phone");
String password = request.getParameter("password"); // 2. 校验数据
if (phone == null || password == null) {
out.print("账号和密码不能为空");
return;
} // 3. 查询数据库,给出结果
DBUtil db = DBUtil.getDB();
try {
// 拼接SQL語句
String sql = "SELECT * FROM `main`.`user` WHERE `phone`='" + phone + "' and `password`='" + password + "'";
ResultSet resu = db.executeQuery(sql); // 查詢
if (resu.next()) {
// 拿到結果
String id = resu.getString("id");
String nick = resu.getString("nick");
String role = resu.getString("role"); session.setAttribute("id", id);
session.setAttribute("nick", nick);
session.setAttribute("role", role);
session.setAttribute("phone", phone); out.print("登录成功");
return;
} else {
out.print("账号或密码错误");
return;
}
} catch (SQLException e) {
e.printStackTrace();
out.print("登录失败,数据库错误");
return;
} finally {
db.close();
}
}
}

使用过程与使用MySQL一致。

5. 图形化管理工具

可以使用Navicat管理SQLite数据库文件,连接时选择SQLite,然后选择打开现有文件,选择D:\sql.db(我是D盘下的sql.db文件,根据你自己在上面数据库封装代码中设置的路径选择),确定后双击打开就能使用数据库。

6. 打包带走

因为SQLite是单文件的,所以你在把代码给别人时,应该把对应的SQLite的.db文件也一并打包发过去,同时告诉对方要把这个文件放在哪里才能正常运行。当然这一部分也可以让程序自动完成,检测文件是否存在,不存在则执行建表语句。

叁、参考资料

  1. https://www.sqlite.org/index.html
  2. https://gitcode.net/mirrors/xerial/sqlite-jdbc

【Java】JavaWeb项目中使用SQLite免安装单文件数据库的更多相关文章

  1. java web项目中 获取resource路径下的文件路径

    public GetResource{ String path = GetResource.class.getClassLoader().getResource("xx/xx.txt&quo ...

  2. javaWeb项目中如何实现在线查看pdf文件

    最近有需求要实现在网页直接查看pdf,word,excel文件.但是实际当中并没有很好的开源插件供我们使用,确实有一些付费的插件不错,也很好用,但是对于我来说都不适合. 现在只是单纯的找到了围魏救赵的 ...

  3. javaweb项目中jsp的from表单提交action内容与web.xml的servlet-mapping对应

    login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...

  4. Javaweb项目中出现java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.异常

    javaweb项目中java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represent ...

  5. ElasticSearch搜索引擎在JavaWeb项目中的应用

    近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...

  6. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  7. log4j在javaWeb项目中的使用

    在前边的文章中对log4j的配置文件进行了说明,今天介绍如何在普通的javaWeb项目中使用log4j. 在日常的开发过程中,日志使用的很频繁,我们可以利用日志来跟踪程序的错误,程序运行时的输出参数等 ...

  8. 在项目中使用SQLite数据库小结

    ------------------------------------------------------------------------推荐: - VS2012 使用 1.0.84 版的库 - ...

  9. 如何在Eclipse中配置Tomcat(免安装版)

    如何在Eclipse中配置Tomcat(免安装版) 2013-10-09 23:19wgelgrsh | 分类:JAVA相关 | 浏览642次 分享到:   2013-10-10 17:10提问者采纳 ...

  10. linux 下用renameTo方法修改java web项目中文件夹名称问题

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...

随机推荐

  1. C Primer Plus 第6版 第八章 编程练习参考答案

    编译环境VS Code+WSL GCC 源码请到文末下载 . 我给第一题写了Linux shell脚本,感兴趣的同学可以尝试修改并运行一下. /*第1题************************ ...

  2. Mybatis-Plus 多租户模式忽略某个方法

    Mapper 类方法添加注解: @InterceptorIgnore(tenantLine = "true") 亲测有效.

  3. Linux 压缩命令集合

    01. tar格式 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!) 02. gz格式 解压1:gunzi ...

  4. 还不会 Cert Manager 自动签发证书?一文掌握

    相信很多小伙伴对于 Cert Manager 不陌生,Cert Manager 是 Kubernetes 上的证书管理工具,基于 ACME 协议与 Let's Encrypt 签发免费证书并为证书自动 ...

  5. H5移动端开发注意事项

    1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显 ...

  6. HashMap的底层实现原理? HashMap 和 Hashtable的异同? 负载因子值的大小,对HashMap有什么影响?

     1. HashMap的底层实现原理 HashMap的底层:数组+链表 (jdk7及之前) 数组+链表+红黑树 (jdk 8)HashMap的底层实现原理?以jdk7为例说明: HashMap map ...

  7. linux实现人脸识别锁定解锁

    环境 archlinux 桌面管理器i3wm 登录管理器 slim python 3.10.4 dlib pip install --user -i https://pypi.tuna.tsinghu ...

  8. .NET Core GC压缩(compact_phase)底层原理浅谈

    简介 终于来到了GC的最后一个步骤,在此之间,大量预备工作已经完成.万事俱备,只欠东风 清除 如果GC决定不压缩,它将仅执行清除操作.清除操作非常简单,把所有不可到达对象(gap),转换成Free.也 ...

  9. 小程序之按钮你不知道的v2

    <button type="primary">提交</button> <button type="primary" loading ...

  10. 共促国产AI生态繁荣,天翼云重磅发布魔乐开发者社区

    8月29日,以"聚数乘云,天翼赋能数字经济新生态"为主题的天翼云中国行·贵州站活动顺利举办.会上,天翼云与华为联合打造的魔乐(Modelers)开发者社区正式上线发布.通过建设社区 ...