com.itfsw.mybatis.generator.plugins.SelectSelectivePluginTest.java Source code

Java tutorial

Introduction

Here is the source code for com.itfsw.mybatis.generator.plugins.SelectSelectivePluginTest.java

Source

/*
 * Copyright (c) 2017.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.itfsw.mybatis.generator.plugins;

import com.itfsw.mybatis.generator.plugins.tools.*;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mybatis.generator.api.GeneratedJavaFile;
import org.mybatis.generator.api.MyBatisGenerator;

import java.lang.reflect.Array;
import java.util.List;

/**
 * ---------------------------------------------------------------------------
 *
 * ---------------------------------------------------------------------------
 * 
 * @author: hewei
 * @time:2017/6/29 13:34
 *                 -------------------------------------------------------------
 *                 --------------
 */
public class SelectSelectivePluginTest {

    @BeforeClass
    public static void init() throws Exception {
        DBHelper.createDB("scripts/SelectSelectivePlugin/init.sql");
    }

    /**
     * selectByExampleSelective
     * 
     * @throws Exception
     */
    @Test
    public void testSelectByExampleSelective() throws Exception {
        // 
        MyBatisGeneratorTool tool = MyBatisGeneratorTool
                .create("scripts/SelectSelectivePlugin/mybatis-generator.xml");
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                // 1. sql
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
                ObjectUtil criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
                criteria.invoke("andIdLessThan", 100l);
                tbExample.set("orderByClause", "field2 asc");

                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".Tb$Column#field1");
                // java
                // ???????Array!!!???invoke????
                Object columns1 = Array.newInstance(columnField1.getCls(), 1);
                Array.set(columns1, 0, columnField1.getObject());

                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject(), columns1);
                Assert.assertEquals(sql, "select field1 from tb WHERE ( id < '100' ) order by field2 asc");

                ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".Tb$Column#field2");
                Object columns2 = Array.newInstance(columnField1.getCls(), 2);
                Array.set(columns2, 0, columnField1.getObject());
                Array.set(columns2, 1, columnField2.getObject());

                sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject(), columns2);
                Assert.assertEquals(sql, "select field1 , field2 from tb WHERE ( id < '100' ) order by field2 asc");

                // 2. sql
                List list = (List) tbMapper.invoke("selectByExampleSelective", tbExample.getObject(), columns1);
                Assert.assertEquals(list.size(), 4);
                int index = 0;
                for (Object obj : list) {
                    if (index == 1) {
                        Assert.assertNull(obj);
                    } else {
                        ObjectUtil objectUtil = new ObjectUtil(obj);
                        // 
                        if (objectUtil.get("id") != null || objectUtil.get("field2") != null) {
                            Assert.assertTrue(false);
                        }
                        if (index == 0) {
                            Assert.assertEquals(objectUtil.get("field1"), "fd1");
                        } else {
                            Assert.assertEquals(objectUtil.get("field1"), "fd3");
                        }
                    }

                    index++;
                }

                // 3.  distinct
                tbExample.invoke("setDistinct", true);
                tbExample.set("orderByClause", "field1 asc");
                String sql1 = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject(), columns1);
                Assert.assertEquals(sql1,
                        "select distinct field1 from tb WHERE ( id < '100' ) order by field1 asc");
                List list1 = (List) tbMapper.invoke("selectByExampleSelective", tbExample.getObject(), columns1);
                Assert.assertEquals(list1.size(), 3);
            }
        });
        // Selective?
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
                ObjectUtil criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
                criteria.invoke("andIdLessThan", 100l);

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject());
                Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id < '100' )");

                // 
                List list = (List) tbMapper.invoke("selectByExampleSelective", tbExample.getObject(), null);
                // ????
                ObjectUtil result = new ObjectUtil(list.get(3));
                Assert.assertEquals(result.get("id"), 4L);
                Assert.assertEquals(result.get("field1"), "fd3");
                Assert.assertEquals(result.get("field2"), 4);
            }
        });
        // WithBLOBs
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbBlobsMapper = new ObjectUtil(
                        sqlSession.getMapper(loader.loadClass(packagz + ".TbBlobsMapper")));

                ObjectUtil tbBlobsExample = new ObjectUtil(loader, packagz + ".TbBlobsExample");
                ObjectUtil criteria = new ObjectUtil(tbBlobsExample.invoke("createCriteria"));
                criteria.invoke("andIdLessThan", 100l);

                // selective
                // base model  WithBLOBs??
                ObjectUtil columnId = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Column#id");
                ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Column#field2");

                Object columns = Array.newInstance(columnId.getCls(), 2);
                Array.set(columns, 0, columnId.getObject());
                Array.set(columns, 1, columnField2.getObject());

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbBlobsMapper.getObject(), "selectByExampleSelective",
                        tbBlobsExample.getObject(), columns);
                Assert.assertEquals(sql, "select id , field2 from tb_blobs WHERE ( id < '100' )");

                // 
                List list = (List) tbBlobsMapper.invoke("selectByExampleSelective", tbBlobsExample.getObject(),
                        columns);
                // ????(??)
                ObjectUtil result = new ObjectUtil(list.get(3));
                Assert.assertEquals(result.get("id"), 4L);
                Assert.assertNull(result.get("field1"));
                Assert.assertEquals(result.get("field2"), "L4");
                Assert.assertNull(result.get("field3"));
            }
        });
        // Key
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbKeysMapper = new ObjectUtil(
                        sqlSession.getMapper(loader.loadClass(packagz + ".TbKeysMapper")));

                ObjectUtil tbKeysExample = new ObjectUtil(loader, packagz + ".TbKeysExample");
                ObjectUtil criteria = new ObjectUtil(tbKeysExample.invoke("createCriteria"));
                criteria.invoke("andKey1LessThan", 100l);

                // selective
                // base model  key model??
                ObjectUtil columnKey1 = new ObjectUtil(loader, packagz + ".TbKeys$Column#key1");
                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".TbKeys$Column#field1");

                Object columns = Array.newInstance(columnKey1.getCls(), 2);
                Array.set(columns, 0, columnKey1.getObject());
                Array.set(columns, 1, columnField1.getObject());

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbKeysMapper.getObject(), "selectByExampleSelective",
                        tbKeysExample.getObject(), columns);
                Assert.assertEquals(sql, "select key1 , field1 from tb_keys WHERE ( key1 < '100' )");

                // 
                List list = (List) tbKeysMapper.invoke("selectByExampleSelective", tbKeysExample.getObject(),
                        columns);
                // ????(??)
                ObjectUtil result = new ObjectUtil(list.get(2));
                Assert.assertEquals(result.get("key1"), 3L);
                Assert.assertNull(result.get("key2"));
                Assert.assertEquals(result.get("field1"), "fd2");
                Assert.assertNull(result.get("field2"));
            }
        });
    }

    /**
     * ?
     * 
     * @throws Exception
     */
    @Test
    public void testSelectByPrimaryKeySelective() throws Exception {
        MyBatisGeneratorTool tool = MyBatisGeneratorTool
                .create("scripts/SelectSelectivePlugin/mybatis-generator.xml");
        // 
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                // 1. sql
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".TbKeys$Column#field1");
                // java
                // ???????Array!!!???invoke????
                Object columns1 = Array.newInstance(columnField1.getCls(), 1);
                Array.set(columns1, 0, columnField1.getObject());

                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByPrimaryKeySelective", 1,
                        columns1);
                Assert.assertEquals(sql, "select field1 from tb where id = 1");

                // 2. xxxKey
                ObjectUtil tbKeysMapper = new ObjectUtil(
                        sqlSession.getMapper(loader.loadClass(packagz + ".TbKeysMapper")));
                ObjectUtil tbKeysKey = new ObjectUtil(loader, packagz + ".TbKeysKey");
                tbKeysKey.set("key1", 1l);
                tbKeysKey.set("key2", "2");

                ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".TbKeys$Column#field2");
                // java
                // ???????Array!!!???invoke????
                Object columns2 = Array.newInstance(columnField2.getCls(), 1);
                Array.set(columns2, 0, columnField2.getObject());

                sql = SqlHelper.getFormatMapperSql(tbKeysMapper.getObject(), "selectByPrimaryKeySelective",
                        tbKeysKey.getObject(), columns2);
                Assert.assertEquals(sql, "select field2 from tb_keys where key1 = 1 and key2 = '2'");

                // 3. sql
                Object tbKeys = tbKeysMapper.invoke("selectByPrimaryKeySelective", tbKeysKey.getObject(), columns1);
                Assert.assertEquals(new ObjectUtil(tbKeys).get("field1"), "fd1");
            }
        });
        // Selective?
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByPrimaryKeySelective", 4L);
                Assert.assertEquals(sql, "select id, field1, field2 from tb where id = 4");

                // 
                ObjectUtil result = new ObjectUtil(tbMapper.invoke("selectByPrimaryKeySelective", 4L, null));
                // ???
                Assert.assertEquals(result.get("id"), 4L);
                Assert.assertEquals(result.get("field1"), "fd3");
                Assert.assertEquals(result.get("field2"), 4);
            }
        });
        // WithBLOBs
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbBlobsMapper = new ObjectUtil(
                        sqlSession.getMapper(loader.loadClass(packagz + ".TbBlobsMapper")));

                // selective
                // base model  WithBLOBs??
                ObjectUtil columnId = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Column#id");
                ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Column#field2");

                Object columns = Array.newInstance(columnId.getCls(), 2);
                Array.set(columns, 0, columnId.getObject());
                Array.set(columns, 1, columnField2.getObject());

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbBlobsMapper.getObject(), "selectByPrimaryKeySelective",
                        4L, columns);
                Assert.assertEquals(sql, "select id , field2 from tb_blobs where id = 4");

                // 
                ObjectUtil result = new ObjectUtil(
                        tbBlobsMapper.invoke("selectByPrimaryKeySelective", 4L, columns));
                // ???(??)
                Assert.assertEquals(result.get("id"), 4L);
                Assert.assertNull(result.get("field1"));
                Assert.assertEquals(result.get("field2"), "L4");
                Assert.assertNull(result.get("field3"));
            }
        });
        // Key
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbKeysMapper = new ObjectUtil(
                        sqlSession.getMapper(loader.loadClass(packagz + ".TbKeysMapper")));

                // selective
                // base model  key model??
                ObjectUtil columnKey1 = new ObjectUtil(loader, packagz + ".TbKeys$Column#key1");
                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".TbKeys$Column#field1");

                Object columns = Array.newInstance(columnKey1.getCls(), 2);
                Array.set(columns, 0, columnKey1.getObject());
                Array.set(columns, 1, columnField1.getObject());

                ObjectUtil tbKeysKey = new ObjectUtil(loader, packagz + ".TbKeysKey");
                tbKeysKey.set("key1", 3L);
                tbKeysKey.set("key2", "4");

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbKeysMapper.getObject(), "selectByPrimaryKeySelective",
                        tbKeysKey.getObject(), columns);
                Assert.assertEquals(sql, "select key1 , field1 from tb_keys where key1 = 3 and key2 = '4'");

                // 
                ObjectUtil result = new ObjectUtil(
                        tbKeysMapper.invoke("selectByPrimaryKeySelective", tbKeysKey.getObject(), columns));
                // ????(??)
                Assert.assertEquals(result.get("key1"), 3L);
                Assert.assertNull(result.get("key2"));
                Assert.assertEquals(result.get("field1"), "fd2");
                Assert.assertNull(result.get("field2"));
            }
        });
    }

    /**
     * ?
     * 
     * @throws Exception
     */
    @Test
    public void testSelectOneByExampleSelective() throws Exception {
        // ?SelectOneByExamplePlugin???
        MyBatisGeneratorTool tool = MyBatisGeneratorTool
                .create("scripts/SelectSelectivePlugin/mybatis-generator.xml");
        MyBatisGenerator myBatisGenerator = tool.generate();
        List<GeneratedJavaFile> list = myBatisGenerator.getGeneratedJavaFiles();
        for (GeneratedJavaFile file : list) {
            if (file.getFileName().equals("TbMapper.java")) {
                Assert.assertFalse(file.getFormattedContent().matches(".*selectByExampleSelective.*"));
            }
        }

        // ?SelectOneByExamplePlugin
        tool = MyBatisGeneratorTool
                .create("scripts/SelectSelectivePlugin/mybatis-generator-with-SelectOneByExamplePlugin.xml");
        tool.generate(new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                // 1. sql
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
                ObjectUtil criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
                criteria.invoke("andIdEqualTo", 3l);
                tbExample.set("orderByClause", "field2 asc");

                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".Tb$Column#field1");
                // java
                // ???????Array!!!???invoke????
                Object columns1 = Array.newInstance(columnField1.getCls(), 1);
                Array.set(columns1, 0, columnField1.getObject());

                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectOneByExampleSelective",
                        tbExample.getObject(), columns1);
                Assert.assertEquals(sql, "select field1 from tb WHERE ( id = '3' ) order by field2 asc limit 1");

                // 2. sql
                Object result = tbMapper.invoke("selectOneByExampleSelective", tbExample.getObject(), columns1);
                ObjectUtil tb = new ObjectUtil(result);
                Assert.assertEquals(tb.get("field1"), "fd3");
                Assert.assertNull(tb.get("field2"));
            }
        });

        // Selective?
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
                ObjectUtil criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
                criteria.invoke("andIdEqualTo", 4L);

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectOneByExampleSelective",
                        tbExample.getObject());
                Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id = '4' ) limit 1");

                // 
                ObjectUtil result = new ObjectUtil(
                        tbMapper.invoke("selectOneByExampleSelective", tbExample.getObject(), null));
                // ????
                Assert.assertEquals(result.get("id"), 4L);
                Assert.assertEquals(result.get("field1"), "fd3");
                Assert.assertEquals(result.get("field2"), 4);
            }
        });
        // WithBLOBs
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbBlobsMapper = new ObjectUtil(
                        sqlSession.getMapper(loader.loadClass(packagz + ".TbBlobsMapper")));

                ObjectUtil tbBlobsExample = new ObjectUtil(loader, packagz + ".TbBlobsExample");
                ObjectUtil criteria = new ObjectUtil(tbBlobsExample.invoke("createCriteria"));
                criteria.invoke("andIdEqualTo", 4L);

                // selective
                // base model  WithBLOBs??
                ObjectUtil columnId = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Column#id");
                ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Column#field2");

                Object columns = Array.newInstance(columnId.getCls(), 2);
                Array.set(columns, 0, columnId.getObject());
                Array.set(columns, 1, columnField2.getObject());

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbBlobsMapper.getObject(), "selectOneByExampleSelective",
                        tbBlobsExample.getObject(), columns);
                Assert.assertEquals(sql, "select id , field2 from tb_blobs WHERE ( id = '4' ) limit 1");

                // 
                ObjectUtil result = new ObjectUtil(
                        tbBlobsMapper.invoke("selectOneByExampleSelective", tbBlobsExample.getObject(), columns));
                // ???(??)
                Assert.assertEquals(result.get("id"), 4L);
                Assert.assertNull(result.get("field1"));
                Assert.assertEquals(result.get("field2"), "L4");
                Assert.assertNull(result.get("field3"));
            }
        });
        // Key
        tool.generate(new IBeforeCallback() {
            @Override
            public void run() throws Exception {
                DBHelper.resetDB("scripts/SelectSelectivePlugin/init.sql");
            }
        }, new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                ObjectUtil tbKeysMapper = new ObjectUtil(
                        sqlSession.getMapper(loader.loadClass(packagz + ".TbKeysMapper")));

                ObjectUtil tbKeysExample = new ObjectUtil(loader, packagz + ".TbKeysExample");
                ObjectUtil criteria = new ObjectUtil(tbKeysExample.invoke("createCriteria"));
                criteria.invoke("andKey1EqualTo", 3L);
                criteria.invoke("andKey2EqualTo", "4");

                // selective
                // base model  key model??
                ObjectUtil columnKey1 = new ObjectUtil(loader, packagz + ".TbKeys$Column#key1");
                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".TbKeys$Column#field1");

                Object columns = Array.newInstance(columnKey1.getCls(), 2);
                Array.set(columns, 0, columnKey1.getObject());
                Array.set(columns, 1, columnField1.getObject());

                // sql
                String sql = SqlHelper.getFormatMapperSql(tbKeysMapper.getObject(), "selectOneByExampleSelective",
                        tbKeysExample.getObject(), columns);
                Assert.assertEquals(sql,
                        "select key1 , field1 from tb_keys WHERE ( key1 = '3' and key2 = '4' ) limit 1");

                // 
                ObjectUtil result = new ObjectUtil(
                        tbKeysMapper.invoke("selectOneByExampleSelective", tbKeysExample.getObject(), columns));
                // ????(??)
                Assert.assertEquals(result.get("key1"), 3L);
                Assert.assertNull(result.get("key2"));
                Assert.assertEquals(result.get("field1"), "fd2");
                Assert.assertNull(result.get("field2"));
            }
        });
    }

    /**
     * ?
     * 
     * @throws Exception
     */
    @Test
    public void testSelectiveWithOrWithoutConstructorBased() throws Exception {
        MyBatisGeneratorTool tool = MyBatisGeneratorTool
                .create("scripts/SelectSelectivePlugin/mybatis-generator-with-constructorBased-false.xml");
        tool.generate(new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                // 1. sql
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
                ObjectUtil criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
                criteria.invoke("andIdLessThan", 100l);
                tbExample.set("orderByClause", "field1 asc");

                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".Tb$Column#tsF1");
                // java
                // ???????Array!!!???invoke????
                Object columns1 = Array.newInstance(columnField1.getCls(), 1);
                Array.set(columns1, 0, columnField1.getObject());

                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject(), columns1);
                Assert.assertEquals(sql, "select field1 from tb WHERE ( id < '100' ) order by field1 asc");

                ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".Tb$Column#field2");
                Object columns2 = Array.newInstance(columnField1.getCls(), 2);
                Array.set(columns2, 0, columnField1.getObject());
                Array.set(columns2, 1, columnField2.getObject());

                sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject(), columns2);
                Assert.assertEquals(sql, "select field1 , field2 from tb WHERE ( id < '100' ) order by field1 asc");

                // 2. sql
                List list = (List) tbMapper.invoke("selectByExampleSelective", tbExample.getObject(), columns1);
                Assert.assertEquals(list.size(), 4);
                int index = 0;
                for (Object obj : list) {
                    if (index == 0) {
                        Assert.assertNull(obj);
                    } else {
                        ObjectUtil objectUtil = new ObjectUtil(obj);
                        // 
                        if (objectUtil.get("id") != null || objectUtil.get("field2") != null) {
                            Assert.assertTrue(false);
                        }
                        if (index == 1) {
                            Assert.assertEquals(objectUtil.get("tsF1"), "fd1");
                        } else {
                            Assert.assertEquals(objectUtil.get("tsF1"), "fd3");
                        }
                    }

                    index++;
                }
            }
        });

        tool = MyBatisGeneratorTool
                .create("scripts/SelectSelectivePlugin/mybatis-generator-with-constructorBased-true.xml");
        tool.generate(new AbstractShellCallback() {
            @Override
            public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
                // 1. sql
                ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));

                ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
                ObjectUtil criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
                criteria.invoke("andIdLessThan", 100l);
                tbExample.set("orderByClause", "field1 asc");

                ObjectUtil columnField1 = new ObjectUtil(loader, packagz + ".Tb$Column#tsF1");
                // java
                // ???????Array!!!???invoke????
                Object columns1 = Array.newInstance(columnField1.getCls(), 1);
                Array.set(columns1, 0, columnField1.getObject());

                String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject(), columns1);
                Assert.assertEquals(sql, "select field1 from tb WHERE ( id < '100' ) order by field1 asc");

                ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".Tb$Column#field2");
                Object columns2 = Array.newInstance(columnField1.getCls(), 2);
                Array.set(columns2, 0, columnField1.getObject());
                Array.set(columns2, 1, columnField2.getObject());

                sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleSelective",
                        tbExample.getObject(), columns2);
                Assert.assertEquals(sql, "select field1 , field2 from tb WHERE ( id < '100' ) order by field1 asc");

                // 2. sql
                List list = (List) tbMapper.invoke("selectByExampleSelective", tbExample.getObject(), columns1);
                Assert.assertEquals(list.size(), 4);
                int index = 0;
                for (Object obj : list) {
                    if (index == 0) {
                        Assert.assertNull(obj);
                    } else {
                        ObjectUtil objectUtil = new ObjectUtil(obj);
                        // 
                        if (objectUtil.get("id") != null || objectUtil.get("field2") != null) {
                            Assert.assertTrue(false);
                        }
                        if (index == 1) {
                            Assert.assertEquals(objectUtil.get("tsF1"), "fd1");
                        } else {
                            Assert.assertEquals(objectUtil.get("tsF1"), "fd3");
                        }
                    }

                    index++;
                }
            }
        });
    }
}