Spring、struts、mybatis、Postgresql統合
28179 ワード
これまでMybatisのページングはメモリに基づいて行われてきたが,このようなページングは実際のプロジェクトではほとんど役に立たず,ネットワーク上ではMybatisの物理ページングについてもいくつかの方法があり,本人は以前よくストレージプロセスを用いてページングを行っていたため,ここで議論する.まず、私の実験プロジェクトで使用した製品:Postgresql、DBPP、Mybatis、Spring、Struts 2、JUnit、Sitemeshについて説明します.これらの製品の統合プロセスについては、後で機会があれば、DBP構成ファイルを変更し、次の属性を追加する必要があります.
次はMybatisマッピングファイル(SqlMapのxmlファイル)の準備です.
<property name="defaultAutoCommit" value="false"></property>
Postgresqlストレージプロセスの作成は,ネット上の資料が多く,本稿ではこれ以上述べない.ページング・ストレージ・プロシージャについては、PostgresqlとOralceの差も大きくありません.基本的にはpl/sqlからpl/pgsqlです.本明細書で使用するテーブルとストレージ・プロシージャは次のとおりです.CREATE TABLE t0_sys_model
(
id character(36) NOT NULL,
code character varying(30),
name character varying(50),
parentid character(36),
"isLeaf" boolean,
url character varying(255),
level integer,
"isSys" boolean,
des text,
state smallint,
creator character(36),
"createTime" date,
"lastOperator" character(36),
"lastUpdateTime" date,
CONSTRAINT pk_t0_sys_model PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE t0_sys_model
OWNER TO postgres;
プライマリ・キーはcharacter(36)を使用しており、GUIDを格納するために使用されています.Postgresqlでは、プライマリ・キーとしてより良い方法がありますか.また、アドバイスをお願いします(本人は自己増加タイプが好きではありません.さまざまな弊害があります).CREATE OR REPLACE FUNCTION p0_sys_model_search(IN pageindex integer, IN recordcountperpage integer, OUT allrecordcount integer, OUT curresult refcursor)
RETURNS record AS
$BODY$
DECLARE
vSQL varchar;
BEGIN
vSQL:='select count(*) from t0_sys_model';
execute vSQL into allRecordCount;
vSQL:='select * from t0_sys_model limit ' ||recordCountPerPage || ' offset ' ||recordCountPerPage*(pageIndex-1);
OPEN curResult FOR EXECUTE vSQL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION p0_sys_model_search(integer, integer)
OWNER TO postgres;
ストレージ・プロシージャには、現在のページと各ページに表示されるレコードの2つの入力パラメータがあります.2つの出力パラメータ:合計レコード数とレコードセット.次はMybatisマッピングファイル(SqlMapのxmlファイル)の準備です.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mycompany.dao.base.ModelDao">
<resultMap id="modelResultMap" type="mycompany.domain.base.Model">
<id property="id" column="ID"/>
<result property="code" column="code"/>
<result property="name" column="name"/>
<result property="parentId" column="parentId"/>
<result property="isLeaf" column="isLeaf"/>
<result property="url" column="url"/>
<result property="level" column="level"/>
<result property="isSys" column="isSys"/>
<result property="des" column="des"/>
<result property="state" column="state"/>
<result property="creator" column="creator"/>
<result property="createTime" column="createTime"/>
<result property="lastOperator" column="lastOperator"/>
<result property="lastUpdateTime" column="lastUpdateTime"/>
</resultMap>
<cache />
<select id="getPage" statementType="CALLABLE" parameterType="HashMap">
<![CDATA[
{call p0_sys_model_search(
#{pageIndex,mode=IN,jdbcType=INTEGER},
#{recordCountPerPage,mode=IN,jdbcType=INTEGER},
#{allRecordCount,mode=OUT,jdbcType=INTEGER},
#{curResult,mode=OUT,jdbcType=OTHER, javaType=ResultSet, resultMap=modelResultMap}
)}
]]>
</select>
</mapper>
コンフィギュレーション・ファイルで注意しなければならないのは、カーソルに対応するjdbcTypeがCURSORではなくOTHERであることです. MyBatisの仕様に従って、対応するエンティティとアクセスインタフェースを作成する必要があります.package mycompany.domain.base;
/**
* @function ***
* @author ***
* @date ***
* @memo
*/
public class Model{
private static final long serialVersionUID = 1L;
protected String id;//***
protected String creator;//***
protected Date createTime;//***
protected String lastOperator;//***
protected Date lastUpdateTime;//***
private String code;//***
private String name;//***
private String parentId;//***
private boolean isLeaf;//***
private String url;//***
private int level;//***
private boolean isSys;//***
private String des;//***
private int state;//***
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getLastOperator() {
return lastOperator;
}
public void setLastOperator(String lastOperator) {
this.lastOperator = lastOperator;
}
public Date getLastUpdateTime() {
return lastUpdateTime;
}
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public boolean isLeaf() {
return isLeaf;
}
public void setLeaf(boolean isLeaf) {
this.isLeaf = isLeaf;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public boolean isSys() {
return isSys;
}
public void setSys(boolean isSys) {
this.isSys = isSys;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
package mycompany.dao.base;
import java.util.List;
import java.util.Map;
import mycompany.domain.base.Model;
/**
* @function **
* @author **
* @date **
* @memo
*/
public interface ModelDao {
void getPage(Map<String, Object> params);
}
最後にクライアントで呼び出されます.package mycompany.test.base;
import java.util.HashMap;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import mycompany.domain.base.Model;
import mycompany.dao.base.ModeldDao;
/**
* @function ***
* @author ***
* @date ***
* @memo
*/
public class ModelDaoTest {
@Test
public void testGetPage() {
ApplicationContext context = new ClassPathXmlApplicationContext("configFiles/spring/applicationContext*.xml");
ModelDao modelDao = (ModelDao)context.getBean("modelDao");
HashMap<String, Object> paras = new HashMap<String, Object>();
paras.put("pageIndex", 1);
paras.put("recordCountPerPage", 10);
modelService.getPage(paras);
List<Model> models=(List<Model>)paras.get("curResult");
//int allRecordCount = (Integer)(paras.get("allRecordCount"));
System.out.println(models.get(0).getName());
}
}
さて、最終的な結果は完璧な緑の線です.本稿では,各種プロファイル(つまりSpringプロファイル)をすべて書き出していないが,コアオペレーションも上記の内容にほかならない.