Java SQLite使用方式和常用函数

原创
2016/04/23 11:51
阅读数 1.2K

下载地址(直接导入即可,不需要再下载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);


 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
3 收藏
1
分享
返回顶部
顶部