https://www.cnblogs.com/kanyun/p/9298163.html

工作中遇到一个需求,就是需要把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生成excel文件并下载

    在网上随手一搜,可以搜到很多java生成excel文件相关的博客,但每个都有不同,核心点说清楚了,但具体运用的时候,相信大家或多或少都没法一次直接运用,这样每次去找并且运用的时候很费时间,所以这也是我 ...

  2. java 导出mdb文件_Java中Java生成mdb文件工具类

    package com.util; /**  * Java生成mdb文件[MS Access文件]  * 1. 在ClassPath下存一个空的blank.mdb. (也就是在你的项目中包含一个空白的 ...

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

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

  4. zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题

    java生成压缩文件 ZipEntry出现乱码的问题 在项目中,一次导出的文件有好几个,而且文件内容比较大,最后考虑到把文件进行压缩在下载,开始试用JDK自带的ZIP压缩包时,ZipEntry ze ...

  5. java流与文件——java生成解压缩文件(夹)

    [0]README 0.1) 本文描述转自 http://blog.csdn.net/chenssy/article/details/9622171 , 旨在理解 java流与文件--java生成解压 ...

  6. java 生成csv文件_Java生成CSV文件实例详解

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

  7. Java生成ics文件

    java生成ICS文件,这玩意好象是个什么日程表类的东西.可以导入到outlook里面用. public void exportActivityDates(HttpServletRequest req ...

  8. iText5实现Java生成PDF文件完整版,二维码

    iText5实现Java生成PDF文件完整版 vue 项目中分别使用 vue-pdf 插件和内嵌 iframe 实现 PDF 文件预览,缩放,旋转,下载,保存等功能 ? Vue打印文件(v-print ...

  9. java生成sql文件

    java生成sql文件 场景 场景 用于清理数据库数据,生成sql语句脚本,方便DBA执行 @RequestMapping("/cleanQuestion")@ResponseBo ...

最新文章

  1. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-附录-LMI工具箱介绍
  2. 考研 | 手把手教你打赢考研情报战,巧用有关考研的三大网站
  3. Banana PI 开源硬件项目启动
  4. Perforce-Server迁移
  5. tensorflow 计算梯度: tf.gradient() 与 tf.GradientTape()
  6. 泰语翻译软件隐私政策
  7. 陈纪修老师《数学分析》 第05章:微分中值定理及其应用 笔记
  8. EastFax USB SERVER推动天润集团U盾管理提效升级
  9. 手把手教你如何删除病毒木马(转)
  10. python调用IP摄像头
  11. PS CC2018安装及破解方法
  12. 利用MeGUI实现批量转换视频
  13. Linux普通用户执行root权限脚本且没有读写权限
  14. 基于Cubieboard2的静电测试仪开发
  15. 2021年山东省安全员C证考试及山东省安全员C证模拟考试
  16. 孙子兵法之36计详解
  17. 惠普1005打印机自检页_hp1005打印机自检报告.docx
  18. c语言编程p0端口使灯一亮一灭,【单片机学习】第六课:单片机控制第一个外设-LED灯...
  19. 如何做好rebuttal
  20. error: resource android:style/TextAppearance.Material.Widget.Button.Colored not found. 解决办法

热门文章

  1. oracle数据库恢复aul_Oracle数据库恢复dmp
  2. 超人学院二期学员分享hadoop工作经验
  3. egg extend ts_王者荣耀KPL秋季赛赛果预测: 重庆QGhappy对阵WB.TS 小胖野区迎战暖阳...
  4. 计算机应用课程设计样式大全,计算机应用课程设计样本.doc
  5. SpringBoot从入门到精通教程(七):集成Redis
  6. js 数组的every() 方法
  7. 讨论 | AR 远程协同和传统音视频通话有什么区别?
  8. 陕西省计算机考研学校,陕西省有哪些考研院校?哪些高校考研比较容易,性价比高?...
  9. pwnable.kr---leg
  10. 161. 相隔为 1 的编辑距离