Hibernate-Sqlite尝试

本文详细介绍了在Hibernate框架中通过自定义SQLite方言类实现与SQLiteDatabase的交互,包括项目结构、代码实现、配置文件设置以及性能测试。通过实例展示了如何将Hibernate与SQLite数据库无缝对接,提供了一种灵活的持久化解决方案。

今天在网上下载了Hibernate-Sqlite项目进行了尝试,为了帮助以后复习,记到这里了 
 一、项目结构及引用包


2.主要代码
其实整个项目最主要的就是定义了Sqlite方言

SQLiteDialect.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,自动创建表

<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

<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 



测试正常,不过在第二次运行时开始报schema update--not supported yet 数据倒是存入

测试代码:

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

= =!不过我没找到这个方法..


整个项目添加一条数据测试,两种方法都是1.080s左右,差别不大。大数据量的插入测试比较没做。

转载于:https://my.oschina.net/lldy/blog/39058

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值