1. SqlSessionインスタンス取得のためのユーティリティクラス実装
MyBatis操作ではSqlSessionインスタンスの取得処理が繰り返し発生します。以下の実装では各操作ごとに設定ファイル読み込みが行われ、リソース効率が低下します:
public class StudentDaoImpl implements IStudentDao {
private SqlSession session;
public void addStudent(Student student) {
try {
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
session = factory.openSession();
session.insert("studentMapper.insert", student);
session.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(session != null) {
session.close();
}
}
}
}
この問題を解決するため、SqlSessionインスタンスを提供するユーティリティクラスを作成します:
public class SessionProvider {
public SqlSession createSession() {
try {
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
return new SqlSessionFactoryBuilder().build(config).openSession();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
ただしこの実装ではインスタンス生成が重複する可能性があります。SqlSessionFactoryはスレッドセーフなため、シングルトンパターンで最適化します:
public class SessionProvider {
private static SqlSessionFactory sessionFactory;
public static SqlSession createSession() {
try {
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
if(sessionFactory == null) {
sessionFactory = new SqlSessionFactoryBuilder().build(config);
}
return sessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
使用例:
SqlSession session = SessionProvider.createSession();
2. プロパティファイルを使用したデータベース設定管理
データベース接続情報をプロパティファイルで管理すると、環境固有の設定変更が容易になります。従来のXML設定:
<configuration>
<environments default="dbEnv">
<environment id="dbEnv">
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/appDB"/>
<property name="username" value="admin"/>
<property name="password" value="securePass123"/>
</dataSource>
</environment>
</environments>
</configuration>
接続情報を分離した設定ファイル(db.properties):
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://dbserver:3306/productionDB
db.user=prodUser
db.password=productionPass
MyBatis設定ファイルをプロパティ連携用に更新:
<configuration>
<properties resource="db.properties"/>
<environments default="prodEnv">
<environment id="prodEnv">
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.user}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
</configuration>