Universal mapper integration, and code knowledge

Spring's configuration file configures what is generated by the scan (configured on the web side), generator.xml (configured in the core dependency project, and used with the core's pom.xml

This pom.xml to configure the injected plugin

) is how the configuration controls the generation (what the generation looks like (corresponding to Java column names, etc.))

The last two properties in generator.xml set the available generic example operation types, and the way to generate injection primary keys when automatically generating beans is also configured here

 

<table tableName="TB_PACT_SED"  enableUpdateByExample="true"   enableSelectByExample="true">

 

  <generatedKey column="SHIP_KEY" sqlStatement="SEQ_TB_PACT_SED" identity="false"  />

</table>

See generic mapper source code: MapperCommentGenerator

It can be seen that when the identity is false, consider the effect generated by sequence (default isSequenceColumn=ture) as follows:

 

 

 

 

There are two ways to generate entity id:

1,

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY,generator = "select SEQ_TB_BAS_BED.nextval from dual")//Inject with specific value (this value is generated by sequence)

@Column(name = "WARE_KEY")

private String ware_key;

 

 

 

2,

@Id

@SequenceGenerator(name="TB_BID_OBJ_ID_GENERATOR", sequenceName="SEQ_TB_BID_OBJ_ID",allocationSize=1)

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TB_BID_OBJ_ID_GENERATOR")//用sequence注入(由注入器生成注入值)

private Integer obj_key;

 

 

 

3,

@Id

@GeneratedValue(generator = "UUID")

    @Column(name = "PURPOSE_ID")

    private String purposeId;

 

 

4,

 

    @Id

    @Column(name = "SHIP_KEY")

    //@SequenceGenerator(name=\"\",sequenceName=\"" + introspectedTable.getTableConfiguration().getGeneratedKey().getRuntimeSqlStatement() + "\");注入方式有好多种源码只用了其中一种

    @SequenceGenerator(name="",sequenceName="SEQ_TB_PACT_SED")

    private BigDecimal shipKey;

 

 

生成时关于表,属性名称:

domainObjectName 数据库表对应的数据对象名称,默认使用表名作为对象名称。

属性名默认是去下划线,java驼峰语法的

 

之前在集成的时候时用于jar包冲突,web-inf/lib用了一个版本,maven又用了一个版本优先用lib中的导致失败

 

 

 

 

参考:

http://www.cnblogs.com/GaiDynasty/p/4088531.html

http://generator.sturgeon.mopaas.com/configreference/generatedKey.html

http://jadethao.iteye.com/blog/1725374

 

生成源码:

 public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

        if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {

            field.addJavaDocLine("/**");

            StringBuilder sb = new StringBuilder();

            sb.append(" * ");

            sb.append(introspectedColumn.getRemarks());

            field.addJavaDocLine(sb.toString());

            field.addJavaDocLine(" */");

        }

        //娣诲姞娉ㄨВ

        if (field.isTransient()) {

            //@Column

            field.addAnnotation("@Transient");

        }

        for (IntrospectedColumn column : introspectedTable.getPrimaryKeyColumns()) {

            if (introspectedColumn == column) {

                field.addAnnotation("@Id");

                break;

            }

        }

        String column = introspectedColumn.getActualColumnName();

        if (StringUtility.stringContainsSpace(column) || introspectedTable.getTableConfiguration().isAllColumnDelimitingEnabled()) {

            column = introspectedColumn.getContext().getBeginningDelimiter()

                        + column

                        + introspectedColumn.getContext().getEndingDelimiter();

        }

        if (!column.equals(introspectedColumn.getJavaProperty())) {

            //@Column

            field.addAnnotation("@Column(name = \"" + column + "\")");

        }

        if (introspectedColumn.isIdentity()) {

            if (introspectedTable.getTableConfiguration().getGeneratedKey().getRuntimeSqlStatement().equals("JDBC")) {

                field.addAnnotation("@GeneratedValue(generator = \"JDBC\")");

            } else {

                field.addAnnotation("@GeneratedValue(strategy = GenerationType.IDENTITY)");

            }

        } else if (introspectedColumn.isSequenceColumn()) {

            field.addAnnotation("@SequenceGenerator(name=\"\",sequenceName=\"" + introspectedTable.getTableConfiguration().getGeneratedKey().getRuntimeSqlStatement() + "\")");

        }

    }

 

 

 

//这段配置的解读:

 关于IDENTITY:

<bean class="com.github.abel533.mapperhelper.MapperInterceptor">

        <property name="properties">

          <value>

            mappers=com.github.abel533.mapper.Mapper//这个都可以省略

            IDENTITY=MYSQL/////和生成时注入的主键生成方式作用一样,只是为了保险起(实体没有申明注入方式(mysql可以,Oracle用sequence不好用因为sequence不同的

   表对应不同))见这里做一个第二方案

            notEmpty=true

          </value>

        </property>

      </bean>

 

Config.class

MapperHelper  

EntityHelper initEntityNameMap

MapperTemplate(这个类包含生成sql等是个关键类) newSelectKeyMappedStatement

由这个句话可以看出:

 String IDENTITY = (column.getGenerator() == null) || (column.getGenerator().equals("")) ? getIDENTITY() : column.getGenerator();//getIDENTITY()从扫描的配置文件中获取的

 

 在扫描器中配置的IDENTITY,和generator.xml中配置的:<generatedKey column="SHIP_KEY" sqlStatement="SEQ_TB_PACT_SED" identity="false"  />即实体中的主键生成那段时同样的效果

 在实体列中有用@GeneratedValue或@SequenceGenerator标签指明生成方式的情况下优先使用实体列中的,没有的话就用扫描中配置的

 

  protected void newSelectKeyMappedStatement(MappedStatement ms, EntityColumn column) {

        String keyId = ms.getId() + SelectKeyGenerator.SELECT_KEY_SUFFIX;

        if (ms.getConfiguration().hasKeyGenerator(keyId)) {

            return;

        }

        Class<?> entityClass = getEntityClass(ms);

        //defaults

        Configuration configuration = ms.getConfiguration();

        KeyGenerator keyGenerator;

        Boolean executeBefore = isBEFORE();

        String IDENTITY = (column.getGenerator() == null || column.getGenerator().equals("")) ? getIDENTITY() : column.getGenerator();

        if (IDENTITY.equalsIgnoreCase("JDBC")) {

            keyGenerator = new Jdbc3KeyGenerator();

        } else {

            SqlSource sqlSource = new RawSqlSource(configuration, IDENTITY, entityClass);

 

            MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, keyId, sqlSource, SqlCommandType.SELECT);

            statementBuilder.resource(ms.getResource());

            statementBuilder.fetchSize(null);

            statementBuilder.statementType(StatementType.STATEMENT);

            statementBuilder.keyGenerator(new NoKeyGenerator());

            statementBuilder.keyProperty(column.getProperty());

            statementBuilder.keyColumn(null);

            statementBuilder.databaseId(null);

            statementBuilder.lang(configuration.getDefaultScriptingLanuageInstance());

            statementBuilder.resultOrdered(false);

            statementBuilder.resulSets(null);

            statementBuilder.timeout(configuration.getDefaultStatementTimeout());

 

            List<ParameterMapping> parameterMappings = new ArrayList<ParameterMapping>();

            ParameterMap.Builder inlineParameterMapBuilder = new ParameterMap.Builder(

                    configuration,

                    statementBuilder.id() + "-Inline",

                    entityClass,

                    parameterMappings);

            statementBuilder.parameterMap(inlineParameterMapBuilder.build());

 

            List<ResultMap> resultMaps = new ArrayList<ResultMap>();

            ResultMap.Builder inlineResultMapBuilder = new ResultMap.Builder(

                    configuration,

                    statementBuilder.id() + "-Inline",

                    column.getJavaType(),

                    new ArrayList<ResultMapping>(),

                    null);

            resultMaps.add(inlineResultMapBuilder.build());

            statementBuilder.resultMaps(resultMaps);

            statementBuilder.resultSetType(null);

 

            statementBuilder.flushCacheRequired(false);

            statementBuilder.useCache(false);

            statementBuilder.cache(null);

 

            MappedStatement statement = statementBuilder.build();

            try {

                configuration.addMappedStatement(statement);

            } catch (Exception e) {

                //ignore

            }

            MappedStatement keyStatement = configuration.getMappedStatement(keyId, false);

            keyGenerator = new SelectKeyGenerator(keyStatement, executeBefore);

            try {

                configuration.addKeyGenerator(keyId, keyGenerator);

            } catch (Exception e) {

                //ignore

            }

        }

        //keyGenerator

        try {

            MetaObject msObject = SystemMetaObject.forObject(ms);

            msObject.setValue("keyGenerator", keyGenerator);

            msObject.setValue("keyProperties", column.getTable().getKeyProperties());

            msObject.setValue("keyColumns", column.getTable().getKeyColumns());

        } catch (Exception e) {

            //ignore

        }

    }

 关于mappers:

 

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.isea533.mybatis.mapper"/>

    <property name="properties">

        <value>

            mappers=tk.mybatis.mapper.common.Mapper//这个都可以省略

            IDENTITY=select uuid()//对于使用可变的序列的序列号的值时,这个在配置文件配置不了

            ORDER=BEFORE

        </value>

    </property>

</bean>

 

 

MapperScannerConfigurer.class

 

 

 

 

@Override

    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {

        super.postProcessBeanDefinitionRegistry(registry);

        //濡傛灉娌℃湁娉ㄥ唽杩囨帴鍙o紝灏辨敞鍐岄粯璁ょ殑Mapper鎺ュ彛

        this.mapperHelper.ifEmptyRegisterDefaultInterface();///MapperScannerConfigurer中可以省略 mappers=tk.mybatis.mapper.common.Mapper配置

。。。

 

 

 

 

 public void ifEmptyRegisterDefaultInterface() {

        if (registerClass.size() == 0) {

            registerMapper("tk.mybatis.mapper.common.Mapper");

        }

    }

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326376107&siteId=291194637