下载SQLite的驱动jar包
JPA persistence.xml配置
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd "> <persistence-unit name="luckynew" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="<span style="color:#ff0000;">com.want.lucky.sqlitedialect.SQLiteDialect</span>" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.connection.driver_class" value="org.sqlite.JDBC" /> <property name="hibernate.connection.url" value="jdbc:sqlite://g:/sqlite/db/luckynew.db" /> <property name="hibernate.connection.username" value="" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> </persistence>
SQLite的方言实现
package com.want.lucky.sqlitedialect; import java.sql.Types; import org.hibernate.Hibernate; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.VarArgsSQLFunction; 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; } }
测试
工具类
package com.want.lucky.util; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.apache.log4j.Logger; public class DBUtil { private static Logger logger = Logger.getLogger(DBUtil.class); private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("luckynew"); private static EntityManager manager = null; public static EntityManagerFactory getEntityManagerFactory() { if (factory == null) { logger.info("实例化EntityManagerFactory!"); factory = Persistence.createEntityManagerFactory("luckynew"); } return factory; } public static EntityManager getEntityManager() { if (manager == null || !manager.isOpen()) { logger.info("实例化EntityManager!"); manager = getEntityManagerFactory().createEntityManager(); } return manager; } }
public void save() { EntityManager manager = DBUtil.getEntityManager(); manager.getTransaction().begin(); Item item = new Item(); item.setName("derek"); manager.persist(item); manager.getTransaction().commit(); manager.close(); } public void select() { EntityManager manager = DBUtil.getEntityManager(); Query query = manager.createQuery("from Item o where o.id = ?"); query.setParameter(1, 2); List<Item> list = query.getResultList(); for (Item item : list) { System.out.println(item.getName()); } manager.close(); }