Javaで業務システムを構築する場合に
SQLのチューニングは不可欠だと思います。
Seasar2に備わる2WaySQLは
SQLのメンテナンスをより良く行える手段と考えています。
ここでは、Spring
MVC + MirageSQLという構成で検証してみます。データベースからデータを取得し、画面に表示するという単純なサンプルを作成します。
以下を参考に作成しました。非常に分かりやすくまとめられています。
Spring
MVCを使用する準備ができたので、Spring
MVC + MirageSQLの構成を作っていきます。
ポイントとしては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の設定
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:
<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向けの設定内容です。データベースへの設定は適宜変更して下さい。
<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を利用することが可能です。
@Component
public class UserService {
@Autowired
SqlManager sqlManager;
@Transactional
public List<Map> findAll() {
return sqlManager.getResultList(Map.class, new ClasspathSqlResource("select-user.sql"));
}
}
データベースから取得したデータをそのまま一覧表示しています。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<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>
補足
SELECT
*
FROM
users
WHERE
username = 'satou'
ORDER BY username
・テーブル構造
テーブル名 users
カラム名 |
型 |
属性 |
username |
VARCHAR(32) |
主キー |
mailaddress |
VARCHAR(30) |
|
所感
簡単なサンプルですが、
Seasar2と遜色ない形で作れる
フレームワークだと思います。DBへの問い合わせ部分については
S2JDBCの2WaySQLの考え方を踏襲しているようなので、ほぼ違和感なく使えそうです。今回のサンプルを作るにあたってはむしろSpringの部分で苦労しました。
値を画面に渡すやり方がしばらくわかりませんでした。。。
Springも使いこなせれば、楽に書けそうな気がします。基本から勉強してみたいと思います。
参考