Javaエンコーディング方式による汎用Mapperの統合(Springプロジェクト以外)

45310 ワード

文書ディレクトリ
  • 前言
  • 一、依存を追加
  • 二、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を統合する方法を検討することを決意した.
    一、依存を追加する
    
    <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のSqlSessionFactorytk.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が作成されると、私たちのプロジェクトで構成されたMapperMapperRegistryオブジェクトに登録されます.このMapperRegistryオブジェクトは、Configurationの構成クラスのメンバー変数であるため、ConfigurationMapperメソッドを呼び出すことなく、SqlSessionオブジェクトを直接取得できます.
    注:実際には、getMapperの実装クラスSqlSessionDefaultSqlSessionによって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;
        }
    
    }