【Java】JavaWeb项目中使用SQLite免安装单文件数据库
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文件也一并打包发过去,同时告诉对方要把这个文件放在哪里才能正常运行。当然这一部分也可以让程序自动完成,检测文件是否存在,不存在则执行建表语句。
叁、参考资料
【Java】JavaWeb项目中使用SQLite免安装单文件数据库的更多相关文章
- java web项目中 获取resource路径下的文件路径
public GetResource{ String path = GetResource.class.getClassLoader().getResource("xx/xx.txt&quo ...
- javaWeb项目中如何实现在线查看pdf文件
最近有需求要实现在网页直接查看pdf,word,excel文件.但是实际当中并没有很好的开源插件供我们使用,确实有一些付费的插件不错,也很好用,但是对于我来说都不适合. 现在只是单纯的找到了围魏救赵的 ...
- javaweb项目中jsp的from表单提交action内容与web.xml的servlet-mapping对应
login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...
- 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 ...
- ElasticSearch搜索引擎在JavaWeb项目中的应用
近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...
- log4j在javaWeb项目中的使用
在前边的文章中对log4j的配置文件进行了说明,今天介绍如何在普通的javaWeb项目中使用log4j. 在日常的开发过程中,日志使用的很频繁,我们可以利用日志来跟踪程序的错误,程序运行时的输出参数等 ...
- 在项目中使用SQLite数据库小结
------------------------------------------------------------------------推荐: - VS2012 使用 1.0.84 版的库 - ...
- 如何在Eclipse中配置Tomcat(免安装版)
如何在Eclipse中配置Tomcat(免安装版) 2013-10-09 23:19wgelgrsh | 分类:JAVA相关 | 浏览642次 分享到: 2013-10-10 17:10提问者采纳 ...
- linux 下用renameTo方法修改java web项目中文件夹名称问题
经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...
随机推荐
- 再制作个WCH-LINK下载器
用CH549可以制作成支持两种模式的WCH-LINK下载器,两种模式指的是RISC-V和DAPLINK模式. 如果用于沁恒的CH32V203等芯片,我们可以将这个下载器设置成RISC-V下载模式. 如 ...
- Linux 检查磁盘空间命令合集
1. DF df 是检查Linux安装程序上可用分区空间的最常用的命令之一.可以使用"df -TH"以直观易读的格式打印分区类型和分区大小.此命令将显示每个部分的总可用空间.已用空 ...
- biancheng-Python教程
目录http://c.biancheng.net/python/ 1Python编程基础2Python编程环境搭建3变量类型和运算符4列表.元组.字典和集合5Python字符串常用方法6Python流 ...
- Qml 中实现任意角为圆角的矩形
[写在前面] 在 Qml 中,矩形(Rectangle)是最常用的元素之一. 然而,标准的矩形元素仅允许设置统一的圆角半径. 在实际开发中,我们经常需要更灵活的圆角设置,例如只对某些角进行圆角处理,或 ...
- [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(05):svg图片转为png格式(暨svg部件的使用)
前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发. iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动. 本合集是基于新版本的关于分 ...
- ORACLE存储过程编程应用实例-门诊药房发药
最近两个整理了门诊药房发药的业务逻辑,准备通过存储过程实现数据处理.耗费两天时间验证终于完成,对存储过程的了解又深入了一些,总结如下: 1.游标的遍历使用了FOR IN语句进行循环,比FETCH与方便 ...
- 调试存储过程中出现 [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
调试存储时如果有日期类型的参数,传入格式为:2020-07-13 12:00:00 ,无需用引号括起来. 否则会提示[Microsoft][ODBC SQL Server Driver]对于造型说明无 ...
- 0425-字节输入流FileInputStream
package A10_IOStream; import java.io.FileInputStream; import java.io.IOException; /* java.io.InputSt ...
- 【忍者算法】从图书馆编目到数组搜索:探索缺失的第一个正整数|LeetCode 41 缺失的第一个正整数
从图书馆编目到数组搜索:探索缺失的第一个正整数 生活中的算法 想象你是一位图书馆管理员,正在整理一排连续编号的图书.这些书应该从1号开始按顺序排列,但是有些编号的书不见了.你的任务是找出第一个缺失的编 ...
- 解决tsc编译器版本过低问题
我们知道,tsc是TypeScript的编译器,可以将TypeScript脚本(.ts文件)编译为JavaScript脚本(.js文件).根据约定,TypeScript脚本文件使用.ts后缀名,Jav ...