Hibernate-Sqlite嘗試

今天在網上下載了Hibernate-Sqlite項目進行了嘗試,爲了幫助之後複習,記到這裏了 
 1、項目結構及引用包


2.主要代碼
其實整個項目最主要的就是定義了Sqlite方言

SQLiteDialect.java
java

package main.java.dialect; /* * The author disclaims copyright to this source code. In place of * a legal notice, here is a blessing: * * May you do good and not evil. * May you find forgiveness for yourself and forgive others. * May you share freely, never taking more than you give. * */ import java.sql.Types; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.dialect.function.VarArgsSQLFunction; import org.hibernate.Hibernate; public class SQLiteDialect extends Dialect { public SQLiteDialect() { super(); registerColumnType(Types.BIT, "integer"); registerColumnType(Types.TINYINT, "tinyint"); registerColumnType(Types.SMALLINT, "smallint"); registerColumnType(Types.INTEGER, "integer"); registerColumnType(Types.BIGINT, "bigint"); registerColumnType(Types.FLOAT, "float"); registerColumnType(Types.REAL, "real"); registerColumnType(Types.DOUBLE, "double"); registerColumnType(Types.NUMERIC, "numeric"); registerColumnType(Types.DECIMAL, "decimal"); registerColumnType(Types.CHAR, "char"); registerColumnType(Types.VARCHAR, "varchar"); registerColumnType(Types.LONGVARCHAR, "longvarchar"); registerColumnType(Types.DATE, "date"); registerColumnType(Types.TIME, "time"); registerColumnType(Types.TIMESTAMP, "timestamp"); registerColumnType(Types.BINARY, "blob"); registerColumnType(Types.VARBINARY, "blob"); registerColumnType(Types.LONGVARBINARY, "blob"); // registerColumnType(Types.NULL, "null"); registerColumnType(Types.BLOB, "blob"); registerColumnType(Types.CLOB, "clob"); registerColumnType(Types.BOOLEAN, "integer"); registerFunction("concat", new VarArgsSQLFunction(Hibernate.STRING, "", "||", "")); registerFunction("mod", new SQLFunctionTemplate(Hibernate.INTEGER, "?1 % ?2")); registerFunction("substr", new StandardSQLFunction("substr", Hibernate.STRING)); registerFunction("substring", new StandardSQLFunction("substr", Hibernate.STRING)); } public boolean supportsIdentityColumns() { return true; } /* public boolean supportsInsertSelectIdentity() { return true; // As specify in NHibernate dialect } */ public boolean hasDataTypeInIdentityColumn() { return false; // As specify in NHibernate dialect } /* public String appendIdentitySelectToInsert(String insertString) { return new StringBuffer(insertString.length()+30). // As specify in NHibernate dialect append(insertString). append("; ").append(getIdentitySelectString()). toString(); } */ public String getIdentityColumnString() { // return "integer primary key autoincrement"; return "integer"; } public String getIdentitySelectString() { return "select last_insert_rowid()"; } public boolean supportsLimit() { return true; } public String getLimitString(String query, boolean hasOffset) { return new StringBuffer(query.length() + 20).append(query).append( hasOffset ? " limit ? offset ?" : " limit ?").toString(); } public boolean supportsTemporaryTables() { return true; } public String getCreateTemporaryTableString() { return "create temporary table if not exists"; } public boolean dropTemporaryTableAfterUse() { return false; } public boolean supportsCurrentTimestampSelection() { return true; } public boolean isCurrentTimestampSelectStringCallable() { return false; } public String getCurrentTimestampSelectString() { return "select current_timestamp"; } public boolean supportsUnionAll() { return true; } public boolean hasAlterTable() { return false; // As specify in NHibernate dialect } public boolean dropConstraints() { return false; } public String getAddColumnString() { return "add column"; } public String getForUpdateString() { return ""; } public boolean supportsOuterJoinForUpdate() { return false; } public String getDropForeignKeyString() { throw new UnsupportedOperationException( "No drop foreign key syntax supported by SQLiteDialect"); } public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) { throw new UnsupportedOperationException( "No add foreign key syntax supported by SQLiteDialect"); } public String getAddPrimaryKeyConstraintString(String constraintName) { throw new UnsupportedOperationException( "No add primary key syntax supported by SQLiteDialect"); } public boolean supportsIfExistsBeforeTableName() { return true; } public boolean supportsCascadeDelete() { return false; } }


hibernate.cfg.xml:開啓了hbm2ddl,自動建立表
sql

<hibernate-configuration> <session-factory> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="dialect">main.java.dialect.SQLiteDialect</property> <property name="connection.driver_class">org.sqlite.JDBC</property> <property name="connection.url">jdbc:sqlite://e:/4.db</property> <property name="connection.username"></property> <property name="connection.password"></property> <property name="hbm2ddl.auto">update</property> <!-- --> <mapping resource="main/java/model/User.hbm.xml"/> <!-- --> <!-- <mapping class="main.java.model.User"></mapping> --> </session-factory> </hibernate-configuration>


user.hbm.xml
session

<class name="main.java.model.User" table="users"> <id name="id" column="id" type="long"> <generator class="native"></generator> </id> <property name="name" column="name" type="string"></property> <property name="password" column="password" type="string"></property> </class>


使用sqlite驅動:sqlite-jdbc-3.6.0.jar 
app



測試正常,不過在第二次運行時開始報schema update--not supported yet 數據卻是存入

測試代碼:
less

public class TestSaveUser extends TestCase{ public void testSave(){ User user = new main.java.model.User(); user.setName("apple"); user.setPassword("123456"); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); session.save(user); tx.commit(); session.close(); HibernateUtil.shutdown(); } }

而後又嘗試下使用註解【須要添加註解相關的jar】

修改hibernate.cfg.xml:更換了sqlite驅動爲sqlitelwqs-2.1.9.jar進行測試
測試

<hibernate-configuration> <session-factory> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="dialect">main.java.dialect.SQLiteDialect</property> <property name="connection.driver_class">org.sqlite.Driver</property> <property name="connection.url">jdbc:sqlite:file:e:/4.db</property> <property name="connection.username"></property> <property name="connection.password"></property> <property name="hbm2ddl.auto">update</property> <!-- <mapping resource="main/java/model/User.hbm.xml"/> --> <mapping class="main.java.model.User"></mapping> </session-factory> </hibernate-configuration>

User.java:這裏的id要使用Integer 
大數據

package main.java.model; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="user") public class User implements Serializable{ /** * */ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "ID") private Integer id; @Column(name="name") private String name; @Column(name="password") private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }


測試正常,而且INFO  org.hibernate.tool.hbm2ddl.SchemaUpdate  - schema update complete
this

= =!不過我沒找到這個方法..
url


整個項目添加一條數據測試,兩種方法都是1.080s左右,差異不大。大數據量的插入測試比較沒作。
spa

相關文章
相關標籤/搜索