下载地址(直接导入即可,不需要再下载sqlite):
http://mvnrepository.com/artifact/org.xerial/sqlite-jdbc
常用命令学习,请移步:
http://www.runoob.com/sqlite/sqlite-tutorial.html
一.先来说说INSERT 批量操作性能优化
(亲自测试,1万条数据在120毫秒左右,10万条在800毫秒左右)
SQLite> insert into user(id,name,gender,token)
values
(10001,'name1','male','s878988tthsxs'),
(10002,'name2','female','ztsbqzfty11211'),
.....
(90701,'name1','male','s878988tthsxs');
二.使用更加严格DDL建表语句,尽量避免不必要的操作和数据输入
UNIQUE,NOT NULL,CHECK,DEFAULT,PRIMAERY KEY,AUTOINCREMENT
三,尽量使用int,float,varchar存储数据,特别是将时间,ip地址保存成int
五,SQLite-JDBC的使用方式
关于SQLite-JDBC
连接器
jdbc:sqlite://dirA/dirB/dbfile
jdbc:sqlite://DRIVE:/dirA/dirB/dbfile
jdbc:sqlite://COMPUTERNAME/shareA/dirB/dbfile
使用方式
import java.sql.*;
import org.sqlite.JDBC;
public class SQLiteTest {
public static void main(String[] args) {
try {
String fileName = "c:/pmp.db";
l
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:"+fileName);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM pmp_countries ORDER BY country_name ASC");
while (rs.next()) {
String id = rs.getString("country_id"); // Column 1
String code = rs.getString("country_code"); // Column 2
String name = rs.getString("country_name"); // Column 3
System.out.println("ID: "+id+" Code: "+code+" Name: "+name);
}
conn.close();
}
catch (Exception e) {
// Print some generic debug info
System.out.println(e.getMessage());
System.out.println(e.toString());
}
}
}
插入数据
import java.sql.*;
import org.sqlite.JDBC;
/**
* 这是个非常简单的SQLite的Java程序,
* 程序中创建数据库、创建表、然后插入数据,
* 最后读出数据显示出来
* @author zieckey (http://zieckey.cublog.cn)
*/
public class TestSQLite{
public static void main(String[] args){
try{
//连接SQLite的JDBC
Class.forName("org.sqlite.JDBC");
//建立一个数据库名zieckey.db的连接,如果不存在就在当前目录下创建之
Connection conn = DriverManager.getConnection("jdbc:sqlite:zieckey.db");
Statement stat = conn.createStatement();
stat.executeUpdate( "create table tbl1(name varchar(20), salary int);" );//创建一个表,两列
stat.executeUpdate( "insert into tbl1 values('ZhangSan',8000);" ); //插入数据
stat.executeUpdate( "insert into tbl1 values('LiSi',7800);" );
stat.executeUpdate( "insert into tbl1 values('WangWu',5800);" );
stat.executeUpdate( "insert into tbl1 values('ZhaoLiu',9100);" );
ResultSet rs = stat.executeQuery("select * from tbl1;"); //查询数据
while (rs.next()) { //将查询到的数据打印出来
System.out.print("name = " + rs.getString("name") + " "); //列属性一
System.out.println("salary = " + rs.getString("salary")); //列属性二
}
rs.close();
conn.close(); //结束数据库的连接
}
catch( Exception e )
{
e.printStackTrace ( );
}
}
}
批量插入
package com.yytwt.uap.download;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLite3Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException
{
Class.forName("org.sqlite.JDBC");
Connection connection = null;
try
{
connection = DriverManager.getConnection("jdbc:sqlite:sample.db");
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
statement.setQueryTimeout(30); // set timeout to 30 sec.
statement.executeUpdate("drop table if exists person");
statement.executeUpdate("create table person (id integer, name varchar,token varchar)");
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("insert into person values");
int len = 500;
for(int i=0;i<len;i++)
{
if(i<len-1)
{
sb.append(" ("+(i+1)+",'leo','"+Math.random()+"'),");
}else{
sb.append(" ("+(i+1)+",'leo','"+Math.random()+"');");
}
}
statement.executeUpdate(sb.toString());
long end = System.currentTimeMillis();
System.out.println("start="+start+",end="+end+",耗时"+(end-start)+"ms");
//获取受影响的行数
ResultSet rs = statement.executeQuery("select changes();");
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
while(rs.next())
{
for (int i = 0; i < columnCount; i++) {
String columnName = metaData.getColumnName(i+1);
String value = rs.getString(i+1);
System.out.println(columnName +"="+ value);
}
}
statement.close();
rs.close();
}
catch(SQLException e)
{
connection.rollback();
e.printStackTrace();
}
finally
{
try
{
if(connection != null)
connection.close();
}
catch(SQLException e)
{
System.err.println(e);
}
}
}
}
二.一些常用的SQLite技巧
获取受影响的函数
select changes();
这里是一些常用SQLITE函数(Lang 和 JSON):
http://www.sqlite.org/lang_corefunc.html
http://www.sqlite.org/lang_aggfunc.html
http://www.sqlite.org/json1.html#jmini
打印表字段信息
PRAGMA TABLE_INFO('you_table_name')
这里是一下常用的PRAGMA 命令:
http://www.sqlite.org/pragma.html
使用Sqlite_master查询表信息,sqlite_master是用来记录所有表信息的数据表
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
查询数据库中指定名称的表是否存在
SELECT count(*) FROM sqlite_master WHERE type='table' and name='mytablename'
事务
BEGIN,COMMIT,ROLLBACK
批量替换
"ON DUPLICATE KEY UPDATE" 语法
如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。
例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果:
http://www.jb51.net/article/39255.htm
INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;
如果行作为新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2。
这个语法还可以这样用:
如果INSERT多行记录(假设 a 为主键或 a 是一个 UNIQUE索引列):
复制代码 代码如下:
INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1;
INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c);
INSERT INTO TABLE (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;
INSERT INTO TABLE (a,b,c) VALUES
(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c);
http://www.cnblogs.com/monian/archive/2014/10/09/4013784.html
REPLACE INTO
replace into table(id, update_time) values(1, now()),(5, now()-3600);
replace into User(id, name,age) values(1,'zhangsan',18),(4,'Jack',21),(5,'DL',32);