工作中遇到一个需求,就是需要把mysql里的一些表数据生成db文件,给客户端使用,客户端使用sqlite数据库;

首先我们需要在项目中添加Sqlite JDBC 依赖

<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.23.1</version>
</dependency>

生成DB文件工具类

package cn.kayun.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; /**
* Created by root on 2018/7/2 0002.
*/
public class DBUtil { private static final Logger logger = LoggerFactory.getLogger(DBUtil.class);
private static Connection connection = null;
private static Statement statement = null; 
private static String username = "kanyun";
private static String password = "kanyun"; /**
* @describe: 设置连接 * @params: * @Author: Kanyun * @Date: 2018/7/12 9:54
*/
public static void setConnection() {
try {
// 声明驱动类型
Class.forName("org.sqlite.JDBC");
// 设置sqlite db文件存放基本目录
String path = DBUtil.class.getClassLoader().getResource("").getPath();
// 设置 sqlite文件路径,等同于mysql连接地址(jdbc:mysql://127.0.0.1:3306/test)
String url = "jdbc:sqlite:" + path + "data.db";
// 获取连接
connection = DriverManager.getConnection(url, username, password);
// 声明
statement = connection.createStatement();
} catch (Exception e) {
throw new RuntimeException("建立Sqlite连接失败");
} } /**
* @describe: 创建表
* @params: tableName: 要创建的表的名称 className:项目中Pojo的类名(需要注意的是该类名需要加上包名 如 com.xxx.xxx.pojo.xxx)
* @Author: Kanyun
* @Date: 2018/7/12 9:56
*/
public synchronized static void create(String tableName, String className) {
try {
statement.executeUpdate("DROP TABLE IF EXISTS " + tableName + ";");
// 通过反射,获取传入类名的字段信息
Field[] fields = Class.forName(className).getDeclaredFields();
StringBuffer sb = new StringBuffer();
String reg = " ";
sb.append("create table " + tableName + " (");
for (Field field : fields) {
// 设置使用反射时,可以访问私有变量,当pojo的变量设置为private修饰时,isAccessible()得到的值是false,必须要改成true才可以访问
field.setAccessible(true);
// 通过获得的字段,获取字段类型,和字段名,来定义创建表的字段名和字段类型
if (field.getType().getName().equals(java.lang.Long.class.getName())) {
sb.append(reg + field.getName() + " bigint(20) ");
} else if (field.getType().getName().equals(java.lang.String.class.getName())) {
sb.append(reg + field.getName() + " varchar(255) ");
} else if (field.getType().getName().equals(java.util.Date.class.getName())) {
sb.append(reg + field.getName() + " datetime ");
} else {
sb.append(reg + field.getName() + " int(11) ");
}
reg = ",";
}
sb.append(") ;");
statement.executeUpdate(sb.toString());
} catch (Exception e) {
logger.error("建表失败:" + e);
throw new RuntimeException("建表失败,表名称:" + tableName);
}
} /**
* @describe: 表中插入数据
* @params: tableName:表名 list:待插入的对象集合 需要注意的是插入的对象要跟表名对应
* @Author: Kanyun
* @Date: 2018/7/12 10:03
*/
public synchronized static <T> int insert(String tableName, List<T> list) {
StringBuffer declaration = new StringBuffer();
List<String> dataSqlArray = new ArrayList<>();
int count = 0;
try {
list.stream().map(t -> {
if (dataSqlArray.size() < 1) {
logger.info("定义语句");
Field[] fields = t.getClass().getDeclaredFields();
declaration.append(" (");
String reg = "";
for (Field field : fields) {
field.setAccessible(true);
declaration.append(reg + field.getName());
reg = ",";
}
declaration.append(")");
}
return t;
}).forEach((t) -> {
Field[] fields = t.getClass().getDeclaredFields();
StringBuffer oneData = new StringBuffer();
String reg = "";
oneData.append(" ("); for (Field field : fields) {
try {
field.setAccessible(true);
if (null == field.get(t) || "".equals(field.get(t))) {
oneData.append(reg + null);
} else if (field.getType().getName().equals(java.lang.String.class.getName())) {
// 传入的对象中字段是字符串时,插入数据库需要转义单引号
oneData.append(reg + "\'" + field.get(t) + "\'");
// 传入的对象中字段是日期类型时,先将日期转换为 yyyy-MM-dd 的形式(我这里,传入对象的日期对象格式为:Wed Jul 11 14:34:07 CST 2018),在将其转换成字符串,注意转义单引号
} else if (field.getType().getName().equals(java.util.Date.class.getName())) {
String dd = field.get(t).toString();
SimpleDateFormat sdf1 = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf2.format(sdf1.parse(dd));
oneData.append(reg + "\'" + date + "\'");
} else {
oneData.append(reg + field.get(t));
}
reg = ",";
} catch (Exception e) {
e.printStackTrace();
}
}
oneData.append(")");
dataSqlArray.add(oneData.toString());
});
String dataSql = StringUtils.join(dataSqlArray, ",");
String retSQL = "INSERT INTO " + tableName + declaration.toString()
+ " VALUES " + dataSql + ";";
System.out.println(retSQL);
PreparedStatement prep = connection.prepareStatement(retSQL);
// 设置自动提交
connection.setAutoCommit(true);
count = prep.executeUpdate();
} catch (Exception e) {
logger.error("插入失败:" + e);
e.printStackTrace();
}
return count;
} /**
* @describe: 关闭链接
* @params:
* @Author: Kanyun
* @Date: 2018/7/12 10:11
*/
public static void endConnection() {
try { connection.close(); } catch (Exception e) {
e.printStackTrace();
}
} }

生成的DB文件在classess目录下.

需要注意的是,在创建链接的过程中,虽然可以传入用户名,密码,但是使用一些工具(比如Navicat)还是可以查看db文件的内容的,因为免费版的SQLite有一个致命缺点:不支持加密

如果需要使用sqlite加密,一是数据本身进行加密,也就是往表中插入的数据进行加密,二是可以加密db文件本身

更多加密方式,参考:https://www.cnblogs.com/ligun123/p/5206942.html

java生成db文件的更多相关文章

  1. Java生成CSV文件实例详解

    本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  2. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  3. Java生成XML文件

    我们在数据库中的数据可以将其提取出来生成XML文件,方便传输.例如数据库中有Admin这张表: 我们写一个java类表示admin数据: package xmlDom.vo; import java. ...

  4. java生成压缩文件

    在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...

  5. JAVA生成PDF文件

    生成PDF文件是主要应用的是ITEXT插件 import java.awt.Color; import java.io.File; import java.io.FileOutputStream; i ...

  6. Java生成CSV文件

    1.新CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils; import java.io.BufferedWriter; im ...

  7. Java生成PDF文件(转)

    原文地址:https://www.cnblogs.com/shuilangyizu/p/5760928.html 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iT ...

  8. [itext]Java生成PDF文件

    一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...

  9. Java生成压缩文件(zip、rar 格式)

    jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...

随机推荐

  1. firefox、chrome的DNS缓存清除方法

    通过设置hosts文件可以强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后重新开启:如果不想重启浏览器,只需要清空浏览器的DNS缓存即可. 清空DNS缓存在chr ...

  2. [shiro] - 怎样使用shiro?

    shiro是什么? Shiro是apache旗下的一个开源框架, 它将软件系统的安全认证相关的功能抽取出来, 实现用户身份认证, 权限授权, 加密, 会话管理等功能, 组成一个通用的安全认证框架. 为 ...

  3. 切换tab页时,tab页中的echart变形问题

    本文为博主原创,未经允许,不得转载: 在两个tab页中,分别展现了两个echart图表,同样的格式与写法,但只有在默认选中的tab页中的图表显示的是正常的, 但进入另一个tab页中时,图表则产生了变形 ...

  4. 软件测试&安全测试高峰论坛

    Nubia测试以及介绍 基于Cucumber的自动化测试平台 常见Web漏洞之XSS,主要HTML与JS基础.XSS的基础知识与挖掘方法.XSS的利用 自动化测试框架以及测试思路

  5. C# 集合-并发处理-锁OR线程 (转载)

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  6. json字符串在javascript和java代码中的表示方式

    最近在使用js写json形式的字符串的时候,当我把json形式的字符串放到函数JSON.parse()的时候,总是报错Uncaught SyntaxError: Unexpected token ' ...

  7. C++中int、string等常见类型转换

    1.int型与string型的互相转换 最佳实践: int型转string型 void int2str(const int &int_temp,string &string_temp) ...

  8. English trip -- VC(情景课) 7 B Clothing 服装

    xu言: 不要使用中式的思维去思考西方的语义!!!切记切记 words a tie   领带 a blouse  女士衬衣 a sweater  毛衣 a skirt  短裙 a jacket   夹 ...

  9. android--------动画之进度条

    Android开发中在处理耗时工作的时候,例如:列表加载,大多数会有一个精度条加载的框,里面有一个像gif的图片在旋转一样. 效果图:   <!--     根标签为animation-list ...

  10. Java 本地环境设置

    如果你希望在你的本地环境中设置 Java 程序环境,下面的这部分将会指导你在你的本地计算机上下载和设置 Java 环境.你可以按照下面的步骤进行. Java SE 目前是免费下载的,你可以通过单击下面 ...