なになれ

IT系のことを記録していきます

Spring MVC + MirageSQL 環境構築とサンプルづくり

仕事でSeasar2を主に使用してきましたが、Seasar2コミュニティの衰退から今後Seasar2を使っていくのは難しいと判断しました。Seasar2に変わるフレームワークを模索する必要があるなと。
 
フレームワークを選定するに当たって、Seasar2の良さである2WaySQLは継続して利用したいと考えました。
Javaで業務システムを構築する場合にSQLのチューニングは不可欠だと思います。Seasar2に備わる2WaySQLはSQLのメンテナンスをより良く行える手段と考えています。
 
2WaySQLを前提に考えた場合に対象になったライブラリがMirage-SQLです。

GitHub - mirage-sql/mirage: The SQL Centric Database Access Library for Java

ここでは、Spring MVC + MirageSQLという構成で検証してみます。データベースからデータを取得し、画面に表示するという単純なサンプルを作成します。
 
なお、筆者はSpring framework自体使うのが始めてなので、間違いがあるかもしれません。
 
Spring MVCのプロジェクトを作成します。
以下を参考に作成しました。非常に分かりやすくまとめられています。
 
Spring MVCを使用する準備ができたので、Spring MVC + MirageSQLの構成を作っていきます。
 
mavenへの依存ライブラリ定義追加
ポイントとしてはspring-jdbcを追加することです。詳細は後ほど。
jstlは画面表示のために使いたかっただけなので、本質的には不要です。
 
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>3.2.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>3.2.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>jp.sf.amateras</groupId>
  <artifactId>mirage</artifactId>
  <version>1.2.2</version>
</dependency>
<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
DispatcherServletの設定
dispatcher-servlet.xmlを編集します。
Springのトランザクション管理を使用する必要が有るため、<tx:annotation-driven />が必要です。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

  <mvc:annotation-driven />
  <tx:annotation-driven />

  <context:component-scan base-package="sample.controller" />
  <context:component-scan base-package="sample.service" />

  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp" />

</beans>
 
以下は、MirageSQL向けの設定内容です。データベースへの設定は適宜変更して下さい。
本内容では、MySQLを使用しています。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/test" />
  <property name="username" value="mysql_user" />
  <property name="password" value="password" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="connectionProvider" class="jp.sf.amateras.mirage.integration.spring.SpringConnectionProvider">
  <property name="transactionManager" ref="transactionManager" />
</bean>

<bean id="dialect" class="jp.sf.amateras.mirage.dialect.MySQLDialect" />

<bean id="sqlManager" class="jp.sf.amateras.mirage.SqlManagerImpl">
  <property name="connectionProvider" ref="connectionProvider" />
  <property name="dialect" ref="dialect" />
</bean>
 
Controllerクラス
@RequestMapiingアノテーションによって、「/users」というURLからusersメソッドを実行するという設定が行われています。
データベースから取得した値をViewに渡すためにModelクラスを介する必要があります。
データベースへの問い合わせを行う処理はServiceクラスに持つことにしています。
@Controller
public class UserController {

     @Autowired
     UserService userService;

     @RequestMapping(value="/users", method=RequestMethod.GET)
     public String users(Model model) {
          model.addAttribute("userList",userService.findAll());
          return "users";
     }
}
 
Serviceクラス
データベースへの問い合わせを行う処理をしています。MirageSQLが関係する部分です。
SqlManagerクラスがMirageSQLで用意されているクラスです。このクラスを介して、データベースへの問い合わせを行うことが可能です。
 
「dispatcher-servlet.xml」に記述した設定によって、SqlManagerをDIすることが可能になっています。@AutowiredアノテーションでSqlManagerを利用することが可能です。
 
@Transactionalアノテーションを指定することで、指定されたメソッドの単位でトランザクション管理がなされます。SqlManagerクラスを使用するためにはトランザクション管理内である必要があります。
mavenへspring-jdbcを追加することで、@Transactionalアノテーションを使用できます。
@Component
public class UserService {
     @Autowired
     SqlManager sqlManager;

     @Transactional
     public List<Map> findAll() {
          return sqlManager.getResultList(Map.class, new ClasspathSqlResource("select-user.sql"));
     }

}
 
View(JSP
データベースから取得したデータをそのまま一覧表示しています。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>サンプル</title>
</head>
<body>
<div>ユーザ一覧</div>
<table border="1">
  <tr>
    <th>ユーザ名</th>
    <th>メールアドレス</th>
    <th></th>
  </tr>
  <c:forEach var="user" items="${userList}">
  <tr>
    <td>${user.username}</td>
    <td>${user.mailaddress}</td>
    <td><a href="<c:url value="/user" ><c:param name="username" value="${user.username}" /></c:url>">表示</a></td>
  </tr>
  </c:forEach>
</table>
</body>
</html>
 
補足
SQLファイル
SELECT
  *
FROM
  users

/*BEGIN*/
WHERE

  /*IF username != null */
  username = /*username*/'satou'
  /*END*/

/*END*/
ORDER BY username
 
・テーブル構造
テーブル名 users
カラム名 属性
username VARCHAR(32) 主キー
mailaddress VARCHAR(30)  
 
所感
簡単なサンプルですが、Seasar2と遜色ない形で作れるフレームワークだと思います。DBへの問い合わせ部分についてはS2JDBCの2WaySQLの考え方を踏襲しているようなので、ほぼ違和感なく使えそうです。今回のサンプルを作るにあたってはむしろSpringの部分で苦労しました。
値を画面に渡すやり方がしばらくわかりませんでした。。。
Springも使いこなせれば、楽に書けそうな気がします。基本から勉強してみたいと思います。
 
今回のサンプルはGitHub上に挙げています。
 
参考