Skip to content

Commit

Permalink
EntityHandler add emptyStringEqualsNull option
Browse files Browse the repository at this point in the history
  • Loading branch information
HidekiSugimoto189 committed Mar 21, 2018
1 parent d4ca8ea commit d947949
Show file tree
Hide file tree
Showing 3 changed files with 184 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,57 +29,124 @@ public class DefaultEntityHandler implements EntityHandler<Object> {

private static Map<Class<?>, TableMetadata> CONTEXTS = new ConcurrentHashMap<>();
private final PropertyMapperManager propertyMapperManager = new PropertyMapperManager();
private boolean emptyStringEqualsNull = true;

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#isEmptyStringEqualsNull()
*/
@Override
public boolean isEmptyStringEqualsNull() {
return emptyStringEqualsNull;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#setEmptyStringEqualsNull(boolean)
*/
@Override
public EntityHandler<Object> setEmptyStringEqualsNull(final boolean emptyStringEqualsNull) {
this.emptyStringEqualsNull = emptyStringEqualsNull;
return this;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#createSelectContext(jp.co.future.uroborosql.SqlAgent, jp.co.future.uroborosql.mapping.TableMetadata, java.lang.Class)
*/
@Override
public SqlContext createSelectContext(final SqlAgent agent, final TableMetadata metadata,
final Class<? extends Object> entityType) {
return agent.contextWith(buildSelectSQL(metadata, entityType, agent.getSqlConfig().getSqlAgentFactory()
.getSqlIdKeyName())).setSqlId(createSqlId(metadata, entityType));
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#doSelect(jp.co.future.uroborosql.SqlAgent, jp.co.future.uroborosql.context.SqlContext, java.lang.Class)
*/
@Override
public <E> Stream<E> doSelect(final SqlAgent agent, final SqlContext context, final Class<? extends E> entityType)
throws SQLException {
return agent.query(context, new EntityResultSetConverter<>(entityType, new PropertyMapperManager(
propertyMapperManager)));
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#createInsertContext(jp.co.future.uroborosql.SqlAgent, jp.co.future.uroborosql.mapping.TableMetadata, java.lang.Class)
*/
@Override
public SqlContext createInsertContext(final SqlAgent agent, final TableMetadata metadata,
final Class<? extends Object> entityType) {
return agent.contextWith(buildInsertSQL(metadata, entityType, agent.getSqlConfig().getSqlAgentFactory()
.getSqlIdKeyName())).setSqlId(createSqlId(metadata, entityType));
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#createUpdateContext(jp.co.future.uroborosql.SqlAgent, jp.co.future.uroborosql.mapping.TableMetadata, java.lang.Class)
*/
@Override
public SqlContext createUpdateContext(final SqlAgent agent, final TableMetadata metadata,
final Class<? extends Object> entityType) {
return agent.contextWith(buildUpdateSQL(metadata, entityType, agent.getSqlConfig().getSqlAgentFactory()
.getSqlIdKeyName())).setSqlId(createSqlId(metadata, entityType));
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#createDeleteContext(jp.co.future.uroborosql.SqlAgent, jp.co.future.uroborosql.mapping.TableMetadata, java.lang.Class)
*/
@Override
public SqlContext createDeleteContext(final SqlAgent agent, final TableMetadata metadata,
final Class<? extends Object> entityType) {
return agent.contextWith(buildDeleteSQL(metadata, entityType, agent.getSqlConfig().getSqlAgentFactory()
.getSqlIdKeyName())).setSqlId(createSqlId(metadata, entityType));
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#setInsertParams(jp.co.future.uroborosql.context.SqlContext, java.lang.Object)
*/
@Override
public void setInsertParams(final SqlContext context, final Object entity) {
setFields(context, entity, SqlStatement.INSERT);
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#setUpdateParams(jp.co.future.uroborosql.context.SqlContext, java.lang.Object)
*/
@Override
public void setUpdateParams(final SqlContext context, final Object entity) {
setFields(context, entity, SqlStatement.UPDATE);
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#setDeleteParams(jp.co.future.uroborosql.context.SqlContext, java.lang.Object)
*/
@Override
public void setDeleteParams(final SqlContext context, final Object entity) {
setFields(context, entity, SqlStatement.DELETE);
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#getEntityType()
*/
@Override
public Class<Object> getEntityType() {
return Object.class;
Expand All @@ -96,12 +163,22 @@ public TableMetadata getMetadata(final ConnectionManager connectionManager, fina
return context;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#addPropertyMapper(jp.co.future.uroborosql.mapping.mapper.PropertyMapper)
*/
@Override
public EntityHandler<Object> addPropertyMapper(final PropertyMapper<?> propertyMapper) {
propertyMapperManager.addMapper(propertyMapper);
return this;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.mapping.EntityHandler#removePropertyMapper(jp.co.future.uroborosql.mapping.mapper.PropertyMapper)
*/
@Override
public EntityHandler<Object> removePropertyMapper(final PropertyMapper<?> propertyMapper) {
propertyMapperManager.removeMapper(propertyMapper);
Expand Down Expand Up @@ -438,10 +515,16 @@ private boolean isStringType(final JDBCType type) {
private StringBuilder wrapIfComment(final StringBuilder original, final StringBuilder addParts,
final TableMetadata.Column col) {
String camelColName = col.getCamelColumnName();
// フィールドがセットされていない場合はカラム自体を削る
if (isStringType(col.getDataType())) {
original.append("/*IF SF.isNotEmpty(").append(camelColName).append(") */").append(System.lineSeparator());// フィールドがセットされていない場合はカラム自体を削る
if (emptyStringEqualsNull) {
original.append("/*IF SF.isNotEmpty(").append(camelColName).append(") */")
.append(System.lineSeparator());
} else {
original.append("/*IF ").append(camelColName).append(" != null */").append(System.lineSeparator());
}
} else {
original.append("/*IF ").append(camelColName).append(" != null */").append(System.lineSeparator());// フィールドがセットされていない場合はカラム自体を削る
original.append("/*IF ").append(camelColName).append(" != null */").append(System.lineSeparator());
}
original.append(addParts);
original.append("/*END*/").append(System.lineSeparator());
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/jp/co/future/uroborosql/mapping/EntityHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,4 +164,19 @@ default int doDelete(final SqlAgent agent, final SqlContext context, final ENTIT
* @return EntityHandler
*/
EntityHandler<ENTITY> removePropertyMapper(PropertyMapper<?> propertyMapper);

/**
* 空文字とNULLを同じに扱うかどうかを取得する
*
* @return 空文字とNULLを同じに扱う場合<code>true</code>
*/
boolean isEmptyStringEqualsNull();

/**
* 空文字とNULLを同じに扱うかどうかを設定する
*
* @param emptyStringEqualsNull 空文字とNULLを同じに扱う場合に<code>true</code>を指定
* @return EntityHandler
*/
EntityHandler<ENTITY> setEmptyStringEqualsNull(boolean emptyStringEqualsNull);
}
Original file line number Diff line number Diff line change
Expand Up @@ -464,9 +464,39 @@ public void testCreateSelectContext() throws Exception {
TableMetadata metadata = TableMetadata.createTableEntityMetadata(agent,
MappingUtils.getTable(TestEntity.class));
SqlContext ctx = handler.createSelectContext(agent, metadata, null);

String sql = ctx.getSql();
assertThat(sql, containsString("SF.isNotEmpty"));

try (ResultSet rs = agent.query(ctx)) {
assertThat(rs.next(), is(true));
}
}
}

@Test
public void testCreateSelectContextEmptyNotEqualsNull() throws Exception {
try (SqlAgent agent = config.agent()) {
TestEntity test = new TestEntity(1, "name1", 20, LocalDate.of(1990, Month.APRIL, 1), Optional
.of("memo1"));
agent.insert(test);

agent.commit();

EntityHandler<?> handler = config.getEntityHandler();
handler.setEmptyStringEqualsNull(false);
TableMetadata metadata = TableMetadata.createTableEntityMetadata(agent,
MappingUtils.getTable(TestEntity.class));
SqlContext ctx = handler.createSelectContext(agent, metadata, null);

String sql = ctx.getSql();
assertThat(sql, not(containsString("SF.isNotEmpty")));

try (ResultSet rs = agent.query(ctx)) {
assertThat(rs.next(), is(true));
}

handler.setEmptyStringEqualsNull(true);
}
}

Expand All @@ -477,12 +507,36 @@ public void testCreateInsertContext() throws Exception {
TableMetadata metadata = TableMetadata.createTableEntityMetadata(agent,
MappingUtils.getTable(TestEntity.class));
SqlContext ctx = handler.createInsertContext(agent, metadata, null);

String sql = ctx.getSql();
assertThat(sql, containsString("SF.isNotEmpty"));

ctx.param("id", 1).param("name", "name1").param("age", 20)
.param("birthday", LocalDate.of(1990, Month.APRIL, 1)).param("memo", Optional.of("memo1"));
assertThat(agent.update(ctx), is(1));
}
}

@Test
public void testCreateInsertContextEmptyNotEqualsNull() throws Exception {
try (SqlAgent agent = config.agent()) {
EntityHandler<?> handler = config.getEntityHandler();
handler.setEmptyStringEqualsNull(false);
TableMetadata metadata = TableMetadata.createTableEntityMetadata(agent,
MappingUtils.getTable(TestEntity.class));
SqlContext ctx = handler.createInsertContext(agent, metadata, null);

String sql = ctx.getSql();
assertThat(sql, not(containsString("SF.isNotEmpty")));

ctx.param("id", 1).param("name", "name1").param("age", 20)
.param("birthday", LocalDate.of(1990, Month.APRIL, 1)).param("memo", Optional.of("memo1"));
assertThat(agent.update(ctx), is(1));

handler.setEmptyStringEqualsNull(true);
}
}

@Test
public void testCreateUpdateContext() throws Exception {
try (SqlAgent agent = config.agent()) {
Expand All @@ -496,12 +550,42 @@ public void testCreateUpdateContext() throws Exception {
TableMetadata metadata = TableMetadata.createTableEntityMetadata(agent,
MappingUtils.getTable(TestEntity.class));
SqlContext ctx = handler.createUpdateContext(agent, metadata, null);

String sql = ctx.getSql();
assertThat(sql, containsString("SF.isNotEmpty"));

ctx.param("id", 1).param("name", "updatename");
assertThat(agent.update(ctx), is(1));
assertThat(agent.query(TestEntity.class).param("id", 1).first().orElse(null).getName(), is("updatename"));
}
}

@Test
public void testCreateUpdateContextEmptyStringEqualsNull() throws Exception {
try (SqlAgent agent = config.agent()) {
TestEntity test = new TestEntity(1, "name1", 20, LocalDate.of(1990, Month.APRIL, 1), Optional
.of("memo1"));
agent.insert(test);

agent.commit();

EntityHandler<?> handler = config.getEntityHandler();
handler.setEmptyStringEqualsNull(false);
TableMetadata metadata = TableMetadata.createTableEntityMetadata(agent,
MappingUtils.getTable(TestEntity.class));
SqlContext ctx = handler.createUpdateContext(agent, metadata, null);

String sql = ctx.getSql();
assertThat(sql, not(containsString("SF.isNotEmpty")));

ctx.param("id", 1).param("name", "updatename");
assertThat(agent.update(ctx), is(1));
assertThat(agent.query(TestEntity.class).param("id", 1).first().orElse(null).getName(), is("updatename"));

handler.setEmptyStringEqualsNull(true);
}
}

@Test
public void testCreateDeleteContext() throws Exception {
try (SqlAgent agent = config.agent()) {
Expand Down

0 comments on commit d947949

Please sign in to comment.