[转自] http://my.oschina.net/u/237078/blog/69934

Sqlite 的单文件便携性、高性能在开发中方便性无与伦比,即使部署在中小型应用中也胜任有余。

在JFinal中添加对 Sqlite 的支持 Step by Step:

1、点击 http://www.xerial.org/maven/repository/artifact/org/xerial/sqlite-jdbc/3.7.2/sqlite-jdbc-3.7.2.jar 下载
sqlite JDBC驱动,并将其放入 Jfinal_app/WEB-INF/lib ;

2、下载一个Sqlite的数据库管理工具,推荐 Navicate Premium,在此下载:http://www.navicat.com/en/products/navicat_premium/premium_overview.html ;或者你也可以到
Sqlite 官网下载Sqlite Shell ,当前版本是 3.7.13: http://www.sqlite.org/sqlite-shell-win32-x86-3071300.zip ;

3、使用数据库管理工具创建一个数据库,存放路径为 Jfinal_app/WEB-INF/data.db ;创建必要的表,插入测试记录,等等;

4、在 a_little_config.txt (或你自己的配置文件) 中设置:

jdbcUrl = jdbc:sqlite:D:/webs/Jfinal_app/WEB-INF/data.db 

user = 

password = 

devMode = true

5、新建一个类 Sqlite3Dialect.java :(注:也可以等待JFinal 1.1.1版Jar将增加此类)

package com.jfinal.plugin.activerecord.dialect;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.jfinal.plugin.activerecord.ActiveRecordException;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.TableInfo; /**
* Sqlite3Dialect. Try to use Sqlite3 SQL dialect with ActiveRecordPlugin.
* <p>
* A clever person solves a problem. A wise person avoids it.
*/
public class Sqlite3SqlDialect implements IDialect { public String forTableInfoBuilderDoBuildTableInfo(String tableName) {
return "select * from " + tableName + " where 1 = 2";
} public void forModelSave(TableInfo tableInfo, Map<String, Object> attrs, StringBuilder sql, List<Object> paras) {
sql.append("insert into ").append(tableInfo.getTableName()).append("(");
StringBuilder temp = new StringBuilder(") values(");
for (Entry<String, Object> e: attrs.entrySet()) {
String colName = e.getKey();
if (tableInfo.hasColumnLabel(colName)) {
if (paras.size() > 0) {
sql.append(", ");
temp.append(", ");
}
sql.append(colName);
temp.append("?");
paras.add(e.getValue());
}
}
sql.append(temp.toString()).append(")");
} public String forModelDeleteById(TableInfo tInfo) {
String pKey = tInfo.getPrimaryKey();
StringBuilder sql = new StringBuilder(45);
sql.append("delete from ");
sql.append(tInfo.getTableName());
sql.append(" where ").append(pKey).append(" = ?");
return sql.toString();
} public void forModelUpdate(TableInfo tableInfo, Map<String, Object> attrs, Set<String> modifyFlag, String pKey, Object id, StringBuilder sql, List<Object> paras) {
sql.append("update ").append(tableInfo.getTableName()).append(" set ");
for (Entry<String, Object> e : attrs.entrySet()) {
String colName = e.getKey();
if (!pKey.equalsIgnoreCase(colName) && modifyFlag.contains(colName) && tableInfo.hasColumnLabel(colName)) {
if (paras.size() > 0)
sql.append(", ");
sql.append(colName).append(" = ? ");
paras.add(e.getValue());
}
}
sql.append(" where ").append(pKey).append(" = ?");
paras.add(id);
} public String forModelFindById(TableInfo tInfo, String columns) {
StringBuilder sql = new StringBuilder("select ");
if (columns.trim().equals("*")) {
sql.append(columns);
}
else {
String[] columnsArray = columns.split(",");
for (int i=0; i<columnsArray.length; i++) {
if (i > 0)
sql.append(", ");
sql.append(columnsArray[i].trim());
}
}
sql.append(" from ");
sql.append(tInfo.getTableName());
sql.append(" where ").append(tInfo.getPrimaryKey()).append(" = ?");
return sql.toString();
} public String forDbFindById(String tableName, String primaryKey, String columns) {
StringBuilder sql = new StringBuilder("select ");
if (columns.trim().equals("*")) {
sql.append(columns);
}
else {
String[] columnsArray = columns.split(",");
for (int i=0; i<columnsArray.length; i++) {
if (i > 0)
sql.append(", ");
sql.append(columnsArray[i].trim());
}
}
sql.append(" from ");
sql.append(tableName.trim());
sql.append(" where ").append(primaryKey).append(" = ?");
return sql.toString();
} public String forDbDeleteById(String tableName, String primaryKey) {
StringBuilder sql = new StringBuilder("delete from ");
sql.append(tableName.trim());
sql.append(" where ").append(primaryKey).append(" = ?");
return sql.toString();
} public void forDbSave(StringBuilder sql, List<Object> paras, String tableName, Record record) {
sql.append("insert into ");
sql.append(tableName.trim()).append("(");
StringBuilder temp = new StringBuilder();
temp.append(") values("); for (Entry<String, Object> e: record.getColumns().entrySet()) {
if (paras.size() > 0) {
sql.append(", ");
temp.append(", ");
}
sql.append(e.getKey());
temp.append("?");
paras.add(e.getValue());
}
sql.append(temp.toString()).append(")");
} public void forDbUpdate(String tableName, String primaryKey, Object id, Record record, StringBuilder sql, List<Object> paras) {
sql.append("update ").append(tableName.trim()).append(" set ");
for (Entry<String, Object> e: record.getColumns().entrySet()) {
String colName = e.getKey();
if (!primaryKey.equalsIgnoreCase(colName)) {
if (paras.size() > 0) {
sql.append(", ");
}
sql.append(colName).append(" = ? ");
paras.add(e.getValue());
}
}
sql.append(" where ").append(primaryKey).append(" = ?");
paras.add(id);
} public void forPaginate(StringBuilder sql, int pageNumber, int pageSize, String select, String sqlExceptSelect) {
int offset = pageSize * (pageNumber - 1);
sql.append(select).append(" ");
sql.append(sqlExceptSelect);
sql.append(" limit ").append(offset).append(", ").append(pageSize); // limit can use one or two '?' to pass paras
}
}

6、在DemoConfig.java (或你自己的 Config 类)中:

import com.jfinal.plugin.activerecord.dialect.Sqlite3Dialect;

public void configPlugin(Plugins me) {
// 配置C3p0数据库连接池插件
C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"));
c3p0Plugin.setDriverClass("org.sqlite.JDBC"); //指定驱动程序
me.add(c3p0Plugin);
// 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
me.add(arp);
arp.setDialect(new Sqlite3Dialect()); //指定 Dialect
arp.addMapping("blog", Blog.class); // 映射blog 表到 Blog模型
}

7、至此大功告成!启动,服务器,在浏览器中查看效果吧!

给JFinal添加 Sqlite 数据库支持的更多相关文章

  1. 让PDF.NET支持最新的SQLite数据库

    最近项目中用到了SQLite,之前项目中用的是PDF.NET+MySQL的组合,已经写了不少代码,如果能把写好的代码直接用在SQLite上就好了,PDF.NET支持大部分主流的数据库,这个当然可以,只 ...

  2. Android之SQLite数据库篇

    一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大. 二.SQLite的特点 1.轻量级使用 SQLit ...

  3. Android开发-之SQLite数据库

    之前我们讲了如何将数据存储在文件中,那么除了这种方式呢,就是我们常见的大家都知道的将数据存储在数据库当中了. 将数据存储在数据库中的优势: 1)存储在数据库中的数据更加方便操作,比如增.删.改.查等 ...

  4. android开发--sqlite数据库

    一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQL ...

  5. 安卓数据存储(3):SQLite数据库存储

    SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLit ...

  6. Android 开发中使用 SQLite 数据库

    SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能. 此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP ...

  7. Android 之数据存储(sdCard,sharedPreference,sqlite数据库)

    sdCard:默认路径在 /storage/sdcard/... Android支持OpenFileOutput和openFileInput方式访问手机存储器上的文件. Context提供了如下两个方 ...

  8. 【Android 应用开发】Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

  9. Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

随机推荐

  1. 1.sql简介

    在总结sql语句前,说点无聊的哈哈 SQL 是用于访问和处理数据库的标准的计算机语言. SQL 能做什么? SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可在数据库中插入新的记录 S ...

  2. js-修改url中某个指定的参数的值

    /* * url 目标url * arg 需要替换的参数名称 * arg_val 替换后的参数的值 * return url 参数替换后的url */ function changeURLArg(ur ...

  3. 7. Smali基础语法总结

    最近在学习Android 移动安全逆向方面,逆向首先要看懂代码,Android4.4之前一直使用的是 Dalivk虚拟机,而Smali是用于Dalivk的反汇编程序的实现. Smali 支持注解,调试 ...

  4. Jmeter接口测试-新用户注册API

    新用户注册 新用户注册的接口是POST /register username/password/password_confirmation 该接口需要提供3个参数,分别是 username 用户名 p ...

  5. LightOJ 1284 Lights inside 3D Grid (数学期望)

    题意:在一个三维的空间,每个点都有一盏灯,开始全是关的.现在每次随机选两个点,把两个点之间的全部点,开关都按一遍,问k次过后开着的灯的期望数量: 析:很容易知道,如果一盏灯被按了奇数次,那么它肯定是开 ...

  6. CSS3的2D与3D转换

    2D和3D转换涉及到数学中的知识,作为一个数学专业的毕业生,不研究一下岂不是对不起自己的专业? 首先来看几个参数: 1.transform-origin:origin(起源,起点),也即变形的起点,在 ...

  7. android 百度天气接口

    百度天气接口 之前有篇随笔是说中国气象的天气接口的,但那个接口不是很稳定,用一段时间过后就会获取不到数据了. 随笔地址:http://www.cnblogs.com/liangstudyhome/p/ ...

  8. Windows + python + pywinauto 搭建自动化测试环境

    最近公司在搞测试, 单纯的人工去测试需要花费太多的人力物力以及时间, 所以准备用Python做一套自动化测试来使用. 本文中使用的是Python3.6.8  和 pywin32-224.win-amd ...

  9. Task 回调

    前正无生意,且记录Task回调之用法. using System; using System.Collections.Generic; using System.Diagnostics; using ...

  10. NSSize 尺寸

    前言 结构体,这个结构体用来表示事物的宽度和高度. typedef CGSize NSSize; struct CGSize { CGFloat width; CGFloat height; }; t ...