spring的配置文件配置的是扫面生成的东西(配置在web端),generator.xml(配置在core依赖项目里,配合该core的pom.xml使用
这个pom.xml中要配置注入的插件
)是配置控制生成如何生成(生成什么样子(对应Java列名等))
(一)生成代码:
在generator.xml中 后面两个属性设置了可用的通用example操作类型,自动生成bean时生成注入主键方式也是在这里配置
<table tableName="TB_PACT_SED" enableUpdateByExample="true" enableSelectByExample="true">
<generatedKey column="SHIP_KEY" sqlStatement="SEQ_TB_PACT_SED" identity="false" />
</table>
参见通用mapper源码:MapperCommentGenerator
可知identity为false的时候考虑用sequence(默认的isSequenceColumn=ture)生成的效果如下第4
实体id两种生成方式:
1,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY,generator = "select SEQ_TB_BAS_BED.nextval from dual")//用具体值注入(此值由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不同的(MYSQL自动生成主键)
表对应不同))见这里做一个第二方案
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");
}
}
相关推荐
通用Mapper逆向工程代码是基于MyBatis框架的一个强大工具,它可以帮助开发者自动根据数据库表结构生成对应的Mapper接口、XML配置文件以及实体类,极大地提高了开发效率,减轻了手动编写这些重复性工作的负担。...
最后,通用Mapper通过Java反射机制和MyBatis框架的特点,实现了动态生成XML风格的SQL代码。这种方式可以使开发人员更方便地使用MyBatis框架,提高开发效率。 知识点: 1. MyBatis通用Mapper的实现原理 2. Java反射...
TkMybatis通用Mapper逆向工程代码生成工具是Java开发中的一个高效实用的工具,它基于Maven项目构建,主要用于简化数据库表与Java实体类、Mapper接口及XML映射文件之间的同步工作。通过此工具,开发者可以自动生成...
- 了解通用Mapper插件的工作原理及优势。 2. **映射文件的使用**: - 掌握如何编写有效的SQL语句。 - 学会如何将查询结果映射到Java对象上。 - 理解动态SQL的配置方式及其应用场景。 3. **通用Mapper插件的...
这个"ssm整合通用mapper"的项目,适合新手学习,因为它包含了完整的SSM集成过程,同时通用Mapper的使用降低了SQL编写的工作量,让新手能更快地上手Java Web开发。在实际开发中,理解并掌握这些知识点,能够提高开发...
在本示例中,我们可能看到如何配置MBG与通用Mapper结合,使得在数据库表结构改变时,能够自动化地更新我们的Mapper代码。 `Pro03MapperOfMine`可能是开发者根据自己的需求扩展通用Mapper的一个实例。有时候,通用...
本篇文章主要介绍了MyBatis通用Mapper的基本概念、集成配置以及如何通过纯代码方式加载XML文件。通过这种方式,开发者可以更加灵活地管理和操作数据库,同时也能有效提高开发效率。希望本文能帮助读者更好地理解和...
本文将深入探讨如何将MyBatis与通用Dao(Data Access Object)和通用Mapper进行整合,以提高开发效率和代码复用性。我们将以"Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用Mapper3.5.x"为主题,...
其中应该包含了Spring Boot的配置文件(如`application.yml`或`application.properties`)、MyBatis的相关配置(如`mybatis-config.xml`)、Mapper接口及对应的XML映射文件、Service层和Controller层的代码。...
通用Mapper是一款非常好用的MyBatis插件,它能够帮助我们自动生成常用增删改查操作的SQL语句,克服MyBatis开发过程中需要大量编写SQL语句的弊端。由于通用Mapper是根据实体类的属性自动生成对应的SQL语句,所以可以...
4. **易于集成**:通用Mapper与Spring Boot框架集成非常方便,只需要添加相应的依赖即可使用。 5. **性能优化**:通过合理的缓存策略和高效的SQL执行机制,确保了应用在处理大量数据时依然能够保持良好的性能表现。 ...
通用Mapper是一款非常好用的MyBatis插件,它能够帮助我们自动生成常用增删改查操作的SQL语句,克服MyBatis开发过程中需要大量编写SQL语句的弊端。由于通用Mapper是根据实体类的属性自动生成对应的SQL语句,所以可以...
下载后,是一个文本,里面会有我百度网盘的分享链接,下载即可,绝对真实无儿戏。
3.通用Mapper在这之后开始处理 4.判断接口方法和ProviderSqlSource,如果是通用方法 5.将ProviderSqlSource替换为真正的方法. ================================ 1.修改ms中的sqlSource为真正的方法 2.首先获取接口...
在这个“通用Mapper-4.0详解代码以及MBG工具代码生成优化”的主题中,我们将深入探讨通用Mapper的核心特性、MBG(MyBatis Generator)工具的使用以及如何通过它们优化代码。 首先,通用Mapper通过提供一系列预定义...
通过以上步骤,我们已经成功地将Spring Boot与Mybatis通用Mapper集成,实现了对MySQL数据库的增删改查操作。这个例子展示了Spring Boot的自动配置能力以及Mybatis通用Mapper的便利性,让开发者可以专注于业务逻辑,...
通用Mapper是MyBatis框架中的一个实用工具,它极大地简化了数据库操作的代码编写工作,尤其是在处理CRUD(创建、读取、更新、删除)操作时。MyBatis-通用Mapper通过逆向工程(Reverse Engineering)和代码生成工具,...
在压缩包的笔记部分,可能包含了作者在学习和使用通用Mapper过程中的一些心得、遇到的问题及解决方案。这部分内容可以帮助你避免常见错误,快速掌握通用Mapper的使用技巧。 至于源码部分,深入研究通用Mapper的源码...
MyBatis 通用 Mapper 实现原理及相关内容 抓下来打包成了HTML文件, 方便离线观看