【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服 ...
随机推荐
- Linux 检查磁盘空间命令合集
1. DF df 是检查Linux安装程序上可用分区空间的最常用的命令之一.可以使用"df -TH"以直观易读的格式打印分区类型和分区大小.此命令将显示每个部分的总可用空间.已用空 ...
- linux 手动释放内存
在 Linux 系统中,内存管理通常由系统自动处理,但在某些情况下,手动释放内存可能是必要的.例如,当业务应用比较繁忙时会频繁存取文件,物理内存会被缓存大量占用,有时会出现内存不足的情况发生,甚至会导 ...
- 节点和IP节点和IP
先说一下我们的IP分配和服务的规划信息 节点和IP 节点 IP ha01 11.53.103.50 ha02 11.53.103.49 ha03 11.53.103.48 ha04 11.53.103 ...
- neo4j存储数据-图数据库
1. 简介 本文主要介绍neo4j是如何将图数据保存在磁盘上的,采用的是什么存储方式.分析这种存储方式对进行图查询/遍历的影响. 2. 图数据库简介 生产环境中使用的图数据库主要有2种,分别是带标签的 ...
- biancheng-HBase
目录http://c.biancheng.net/view/6509.html 1HBase是什么?2HBase的优势有哪些?3Hadoop与HBase的关系4HDFS5HDFS的特点与使用场景6HB ...
- MySQL如果数据存在则更新,不存在则插入
如果数据存在则更新,不存在则插入,MySQL有duplicate.replace into.replace三种方式如何更新数据? insert ignore into 又是如何插入数据的呢? 准备表和 ...
- python 控制流程
条件语句 if语法 if True: print("hello") print("world!") 输出: helloworld! 举例: "&quo ...
- JVM:方法区、堆
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6.2
- Zino pg walkthrough Intermediate
nmap 扫描 发现smba共享文件 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.167.64 Starting Nmap 7.94SVN ( https:/ ...
- RabbitMQ(三)——简单模式
RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...