不一樣的數據庫,其sql語句也有不一樣的差別,Jfinal中,數據庫方言是根據不一樣的數據庫類型,生成對應數據庫的sql語句,全部的方言類都必需要繼承自抽象類com.jfinal.plugin.activerecord.dialect.Dialect,而且重寫抽象方法,java
如下爲H2Database 數據庫方言類sql
package com.cpy.jfinal.plugin.activerecord.dialect; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import com.jfinal.plugin.activerecord.Record; import com.jfinal.plugin.activerecord.Table; import com.jfinal.plugin.activerecord.dialect.Dialect; /** * H2Dialect. */ public class H2Dialect extends Dialect { public String forTableBuilderDoBuild(String tableName) { return "select * from " + tableName + " where rownum < 1"; } public String forPaginate(int pageNumber, int pageSize, String select, String sqlExceptSelect) { int start = (pageNumber - 1) * pageSize; int end = pageNumber * pageSize; StringBuilder ret = new StringBuilder(); ret.append("select * from ( select row_.*, rownum rownum_ from ( "); ret.append(select).append(" ").append(sqlExceptSelect); ret.append(" ) row_ where rownum <= ").append(end).append(") table_alias"); ret.append(" where table_alias.rownum_ > ").append(start); return ret.toString(); } public String forModelFindById(Table table, String columns) { StringBuilder sql = new StringBuilder("select ").append(columns).append(" from "); sql.append(table.getName()); sql.append(" where "); String[] pKeys = table.getPrimaryKey(); for (int i=0; i<pKeys.length; i++) { if (i > 0) { sql.append(" and "); } sql.append(pKeys[i]).append(" = ?"); } return sql.toString(); } public String forModelDeleteById(Table table) { String[] pKeys = table.getPrimaryKey(); StringBuilder sql = new StringBuilder(45); sql.append("delete from "); sql.append(table.getName()); sql.append(" where "); for (int i=0; i<pKeys.length; i++) { if (i > 0) { sql.append(" and "); } sql.append(pKeys[i]).append(" = ?"); } return sql.toString(); } // insert into table (id,name) values(seq.nextval, name) public void forModelSave(Table table, Map<String, Object> attrs, StringBuilder sql, List<Object> paras) { sql.append("insert into ").append(table.getName()).append("("); StringBuilder temp = new StringBuilder(") values("); String[] pKeys = table.getPrimaryKey(); int count = 0; for (Entry<String, Object> e: attrs.entrySet()) { String colName = e.getKey(); if (table.hasColumnLabel(colName)) { if (count++ > 0) { sql.append(", "); temp.append(", "); } sql.append(colName); Object value = e.getValue(); if (value instanceof String && isPrimaryKey(colName, pKeys) && ((String)value).endsWith(".nextval")) { temp.append(value); } else { temp.append("?"); paras.add(value); } } } sql.append(temp.toString()).append(")"); } public void forModelUpdate(Table table, Map<String, Object> attrs, Set<String> modifyFlag, StringBuilder sql, List<Object> paras) { sql.append("update ").append(table.getName()).append(" set "); String[] pKeys = table.getPrimaryKey(); for (Entry<String, Object> e : attrs.entrySet()) { String colName = e.getKey(); if (modifyFlag.contains(colName) && !isPrimaryKey(colName, pKeys) && table.hasColumnLabel(colName)) { if (paras.size() > 0) { sql.append(", "); } sql.append(colName).append(" = ? "); paras.add(e.getValue()); } } sql.append(" where "); for (int i=0; i<pKeys.length; i++) { if (i > 0) { sql.append(" and "); } sql.append(pKeys[i]).append(" = ?"); paras.add(attrs.get(pKeys[i])); } } public String forDbFindById(String tableName, String[] pKeys) { tableName = tableName.trim(); trimPrimaryKeys(pKeys); StringBuilder sql = new StringBuilder("select * from ").append(tableName).append(" where "); for (int i=0; i<pKeys.length; i++) { if (i > 0) { sql.append(" and "); } sql.append(pKeys[i]).append(" = ?"); } return sql.toString(); } public String forDbDeleteById(String tableName, String[] pKeys) { tableName = tableName.trim(); trimPrimaryKeys(pKeys); StringBuilder sql = new StringBuilder("delete from ").append(tableName).append(" where "); for (int i=0; i<pKeys.length; i++) { if (i > 0) { sql.append(" and "); } sql.append(pKeys[i]).append(" = ?"); } return sql.toString(); } public void forDbSave(String tableName, String[] pKeys, Record record, StringBuilder sql, List<Object> paras) { tableName = tableName.trim(); trimPrimaryKeys(pKeys); sql.append("insert into "); sql.append(tableName).append("("); StringBuilder temp = new StringBuilder(); temp.append(") values("); int count = 0; for (Entry<String, Object> e: record.getColumns().entrySet()) { String colName = e.getKey(); if (count++ > 0) { sql.append(", "); temp.append(", "); } sql.append(colName); Object value = e.getValue(); if (value instanceof String && isPrimaryKey(colName, pKeys) && ((String)value).endsWith(".nextval")) { temp.append(value); } else { temp.append("?"); paras.add(value); } } sql.append(temp.toString()).append(")"); } public void forDbUpdate(String tableName, String[] pKeys, Object[] ids, Record record, StringBuilder sql, List<Object> paras) { tableName = tableName.trim(); trimPrimaryKeys(pKeys); sql.append("update ").append(tableName).append(" set "); for (Entry<String, Object> e: record.getColumns().entrySet()) { String colName = e.getKey(); if (!isPrimaryKey(colName, pKeys)) { if (paras.size() > 0) { sql.append(", "); } sql.append(colName).append(" = ? "); paras.add(e.getValue()); } } sql.append(" where "); for (int i=0; i<pKeys.length; i++) { if (i > 0) { sql.append(" and "); } sql.append(pKeys[i]).append(" = ?"); paras.add(ids[i]); } } public boolean isH2() { return true; } public void fillStatement(PreparedStatement pst, List<Object> paras) throws SQLException { for (int i=0, size=paras.size(); i<size; i++) { Object value = paras.get(i); if (value instanceof java.sql.Date) { pst.setDate(i + 1, (java.sql.Date)value); } else if (value instanceof java.sql.Timestamp) { pst.setTimestamp(i + 1, (java.sql.Timestamp)value); } else { pst.setObject(i + 1, value); } } } public void fillStatement(PreparedStatement pst, Object... paras) throws SQLException { for (int i=0; i<paras.length; i++) { Object value = paras[i]; if (value instanceof java.sql.Date) { pst.setDate(i + 1, (java.sql.Date)value); } else if (value instanceof java.sql.Timestamp) { pst.setTimestamp(i + 1, (java.sql.Timestamp)value); } else { pst.setObject(i + 1, value); } } } public String getDefaultPrimaryKey() { return "ID"; } }