Javaエンコーディング方式による汎用Mapperの統合(Springプロジェクト以外)
文書ディレクトリ前言 一、依存を追加 二、SqlSessionFactory の作成三、SqlSession を取得四、取得Mapper 五、使用例 添付:コードリスト 1.mybatis-conf.xml 2.MySqlSessionFactory 3.MapperFactory
前言
単一テーブル操作では、汎用Mapperが強力な役割を果たしています.汎用Mapperの支援のもと、開発者は煩雑なxmlファイルを書く必要がなく、削除・変更機能を実現することができます.したがって,我々のプロジェクトが単純な単一テーブル操作のみを必要とする場合,汎用Mapperは間違いなく上位の選択である.
現在、ネット上では汎用Mapper統合に関するケースが広がっているが、ほとんどはSpringまたはSpringBootに基づいている.フレームワークをよく使う学生にとって、これはもちろん素晴らしいです.しかし、フレームワークを使用していない場合や、私たちのプロジェクトが簡単すぎてフレームワークを必要としない場合は、どうすればいいですか?幸いなことに、汎用MapperはオリジナルJava符号化方式の統合をサポートしており、開発フレームワークを使用することなく、汎用Mapperをプロジェクトに統合することができます.
残念なことに、Java符号化に基づく統合例は現在ネット上では珍しく、公式説明ドキュメントでもJava符号化の統合方式は一言で省略されている.そこで,筆者はJava符号化方式を用いて汎用Mapperを統合する方法を検討することを決意した.
一、依存を追加する
以上のバージョン番号はMySQL 5.6で親測で使用できますが、他のバージョンに使用する必要がある場合は、公式ドキュメントを参照することをお勧めします.
二、SqlSessionFactoryの作成
通常、MyBatisを使用して
汎用Mapperの構成を追加する必要があります.
以上の構成により、汎用Mapperが有効になります.
さらに、公式文書は、MyBatisの
三、SqlSessionを取得する
通常、MyBatisを使用する場合、
上記のように従来の方法で
Javaエージェントメカニズムにより、
コードから分かるように、
四、取得Mapper
同様に、MyBatisでは、通常、次のコードを使用して
しかし、今の方法は不可能です.上記では
注:実際には、
五、使用例
これで、ビジネス・レベルでデータベースの削除を直接確認できます.
添付:コードリスト
1.mybatis-conf.xml
2.MySqlSessionFactory
3.MapperFactory
前言
単一テーブル操作では、汎用Mapperが強力な役割を果たしています.汎用Mapperの支援のもと、開発者は煩雑なxmlファイルを書く必要がなく、削除・変更機能を実現することができます.したがって,我々のプロジェクトが単純な単一テーブル操作のみを必要とする場合,汎用Mapperは間違いなく上位の選択である.
現在、ネット上では汎用Mapper統合に関するケースが広がっているが、ほとんどはSpringまたはSpringBootに基づいている.フレームワークをよく使う学生にとって、これはもちろん素晴らしいです.しかし、フレームワークを使用していない場合や、私たちのプロジェクトが簡単すぎてフレームワークを必要としない場合は、どうすればいいですか?幸いなことに、汎用MapperはオリジナルJava符号化方式の統合をサポートしており、開発フレームワークを使用することなく、汎用Mapperをプロジェクトに統合することができます.
残念なことに、Java符号化に基づく統合例は現在ネット上では珍しく、公式説明ドキュメントでもJava符号化の統合方式は一言で省略されている.そこで,筆者はJava符号化方式を用いて汎用Mapperを統合する方法を検討することを決意した.
一、依存を追加する
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.38version>
dependency>
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapperartifactId>
<version>4.0.4version>
dependency>
以上のバージョン番号はMySQL 5.6で親測で使用できますが、他のバージョンに使用する必要がある場合は、公式ドキュメントを参照することをお勧めします.
二、SqlSessionFactoryの作成
通常、MyBatisを使用して
SqlSessionFactory
オブジェクトを作成する場合、次のコードが使用されます.//
InputStream in = MySqlSessionFactory.class.getClassLoader().getResourceAsStream(resource);
// SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
汎用Mapperの構成を追加する必要があります.
//
InputStream in = MySqlSessionFactory.class.getClassLoader().getResourceAsStream(resource);
// SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// MapperHelper
MapperHelper mapperHelper = new MapperHelper();
//
Config config = new Config();
// , MYSQL,
config.setIDENTITY("MYSQL");
// getter setter
config.setEnableMethodAnnotation(true);
// insert update , !=''
config.setNotEmpty(true);
// Example Mapper
config.setCheckExampleEntityClass(true);
//
config.setUseSimpleType(true);
//
config.setEnumAsSimpleType(true);
// - mysql
config.setWrapKeyword("`{0}`");
//
mapperHelper.setConfig(config);
// mapperHelper ,
mapperHelper.processConfiguration(sqlSessionFactory.getConfiguration());
以上の構成により、汎用Mapperが有効になります.
さらに、公式文書は、MyBatisの
SqlSessionFactory
をtk.mybatis.mapper.session.Configuration
に置き換え、org.apache.ibatis.session.Configuration
を使用してnew SqlSessionFactoryBuilder().build(configuration)
を作成することによって、SqlSessionFactory
を作成する前に共通のMapperを構成する方法を提供している.残念なことに、mybatis-config.xml
ファイルの解析クラスが欠けているため、完全なConfiguration
オブジェクトを構成することは難しいため、この方法は推奨されません.(公式にもこの方法は推奨されていません)三、SqlSessionを取得する
通常、MyBatisを使用する場合、
SqlSession
は次のコードで取得されます.SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession
オブジェクトは、使用後すぐにclose
を削除し、接続数が多すぎることを避けることを知っています.フレームワークを使用する場合、この問題を考慮する必要はありません.これらの作業はSqlSessionTemplate
によって完了しました.今、この仕事は私たち自身に任せるしかありません.上記のように従来の方法で
SqlSession
を取得すると、取得するたびに手動で閉じる必要があり、私たちのプロジェクトには多くの重複コードがあるので、今はそうしません.Javaエージェントメカニズムにより、
SqlSession
のエージェントオブジェクトを取得し、エージェントオブジェクトが重複した作業を完了します.実装コードは次のとおりです.public static SqlSession getSqlSessionProxy() {
return (SqlSession) Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(),
new Class[]{SqlSession.class},
new SqlSessionInterceptor());
}
private static class SqlSessionInterceptor implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
Object object = null;
try {
object = method.invoke(sqlSession, args);
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
sqlSession.close();
}
return object;
}
}
コードから分かるように、
SqlSession
エージェントオブジェクトが呼び出されるたびに、SqlSession
オブジェクトがインスタンス化され、対応するデータベース操作方法が実行され、最後にSqlSession
が閉じられる.これに基づいて、私たちのプロジェクトはデータベースの操作に注目するだけで、接続がタイムリーに閉じられたかどうかを心配する必要はありません.四、取得Mapper
同様に、MyBatisでは、通常、次のコードを使用して
Mapper
オブジェクトを取得します.Mapper mapper = sqlSession.getMapper(TaskMapper.class);
しかし、今の方法は不可能です.上記では
SqlSession
をフェース処理したので、SqlSession
オブジェクトのメソッドが呼び出されると、この接続は閉じられます.では、次の案に変更します.public static <T> T createMapper(Class<? extends Mapper> clazz) {
SqlSession sqlSessionProxy = MySqlSessionFactory.getSqlSessionProxy();
Mapper mapper = MySqlSessionFactory.getConfiguration().getMapper(clazz, sqlSessionProxy);
return (T) mapper;
}
SqlSessionFactory
が作成されると、私たちのプロジェクトで構成されたMapper
がMapperRegistry
オブジェクトに登録されます.このMapperRegistry
オブジェクトは、Configuration
の構成クラスのメンバー変数であるため、Configuration
のMapper
メソッドを呼び出すことなく、SqlSession
オブジェクトを直接取得できます.注:実際には、
getMapper
の実装クラスSqlSession
もDefaultSqlSession
によってConfiguration
を取得する.五、使用例
これで、ビジネス・レベルでデータベースの削除を直接確認できます.
public TaskDO selectOneById(int id) {
TaskMapper mapper = MapperFactory.createMapper(TaskMapper.class);
Example example = new Example(TaskDO.class);
example.and().andEqualTo("id", id);
return mapper.selectOneByExample(example);
}
添付:コードリスト
1.mybatis-conf.xml
<configuration>
<properties resource="database.properties">properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
<mappers>
<mapper class="com.panda.dao.common.mapper.TaskMapper"/>
mappers>
configuration>
2.MySqlSessionFactory
package com.panda.dao;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tk.mybatis.mapper.entity.Config;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* sqlsessionFactory
*
* @author panda
* @date 2018/12/10
*/
public class MySqlSessionFactory {
private static final Logger logger = LoggerFactory.getLogger(MySqlSessionFactory.class);
private static final String resource = "mybatis-conf.xml";
private static SqlSessionFactory sqlSessionFactory;
static {
//
InputStream in = MySqlSessionFactory.class.getClassLoader().getResourceAsStream(resource);
// SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// MapperHelper
MapperHelper mapperHelper = new MapperHelper();
//
Config config = new Config();
// , MYSQL,
config.setIDENTITY("MYSQL");
// getter setter
config.setEnableMethodAnnotation(true);
// insert update , !=''
config.setNotEmpty(true);
// Example Mapper
config.setCheckExampleEntityClass(true);
//
config.setUseSimpleType(true);
//
config.setEnumAsSimpleType(true);
// - mysql
config.setWrapKeyword("`{0}`");
//
mapperHelper.setConfig(config);
// mapperHelper ,
mapperHelper.processConfiguration(sqlSessionFactory.getConfiguration());
}
public static Configuration getConfiguration() {
return sqlSessionFactory.getConfiguration();
}
public static SqlSession getSqlSessionProxy() {
return (SqlSession) Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(),
new Class[]{SqlSession.class},
new SqlSessionInterceptor());
}
private static class SqlSessionInterceptor implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
Object object = null;
try {
object = method.invoke(sqlSession, args);
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
sqlSession.close();
}
return object;
}
}
}
3.MapperFactory
package com.panda.dao;
import org.apache.ibatis.session.SqlSession;
import tk.mybatis.mapper.common.Mapper;
/**
* mapperFactory
*
* @author panda
* @date 2018/12/10
*/
public class MapperFactory {
/**
* mapper
*
* @param clazz
* @param
* @return
*/
public static <T> T createMapper(Class<? extends Mapper> clazz) {
SqlSession sqlSessionProxy = MySqlSessionFactory.getSqlSessionProxy();
Mapper mapper = MySqlSessionFactory.getConfiguration().getMapper(clazz, sqlSessionProxy);
return (T) mapper;
}
}