diff --git a/src/main/java/org/mybatis/dynamic/sql/select/UnionQuery.java b/src/main/java/org/mybatis/dynamic/sql/select/UnionQuery.java index 9beb85b46..6806d4791 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/UnionQuery.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/UnionQuery.java @@ -17,20 +17,9 @@ import java.util.Objects; -public class UnionQuery { - private final String connector; - private final SelectModel selectModel; - +public record UnionQuery(String connector, SelectModel selectModel) { public UnionQuery(String connector, SelectModel selectModel) { this.connector = Objects.requireNonNull(connector); this.selectModel = Objects.requireNonNull(selectModel); } - - public String connector() { - return connector; - } - - public SelectModel selectModel() { - return selectModel; - } } diff --git a/src/main/java/org/mybatis/dynamic/sql/util/spring/BatchInsertUtility.java b/src/main/java/org/mybatis/dynamic/sql/util/spring/BatchInsertUtility.java index 81f5a5ed6..8672e98ea 100644 --- a/src/main/java/org/mybatis/dynamic/sql/util/spring/BatchInsertUtility.java +++ b/src/main/java/org/mybatis/dynamic/sql/util/spring/BatchInsertUtility.java @@ -39,15 +39,5 @@ public static SqlParameterSource[] createBatch(List rows) { return SqlParameterSourceUtils.createBatch(tt); } - public static class RowHolder { - private final T row; - - public RowHolder(T row) { - this.row = row; - } - - public T getRow() { - return row; - } - } + public record RowHolder (T row) {} } diff --git a/src/test/java/examples/animal/data/AnimalData.java b/src/test/java/examples/animal/data/AnimalData.java index aff740d2f..0c4a49321 100644 --- a/src/test/java/examples/animal/data/AnimalData.java +++ b/src/test/java/examples/animal/data/AnimalData.java @@ -15,41 +15,4 @@ */ package examples.animal.data; -public class AnimalData { - private int id; - private String animalName; - private double brainWeight; - private double bodyWeight; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getAnimalName() { - return animalName; - } - - public void setAnimalName(String animalName) { - this.animalName = animalName; - } - - public double getBrainWeight() { - return brainWeight; - } - - public void setBrainWeight(double brainWeight) { - this.brainWeight = brainWeight; - } - - public double getBodyWeight() { - return bodyWeight; - } - - public void setBodyWeight(double bodyWeight) { - this.bodyWeight = bodyWeight; - } -} +public record AnimalData(int id, String animalName, double brainWeight, double bodyWeight) {} diff --git a/src/test/java/examples/animal/data/AnimalDataMapper.java b/src/test/java/examples/animal/data/AnimalDataMapper.java index 39fcd1875..26a2cbac2 100644 --- a/src/test/java/examples/animal/data/AnimalDataMapper.java +++ b/src/test/java/examples/animal/data/AnimalDataMapper.java @@ -17,10 +17,8 @@ import java.util.List; +import org.apache.ibatis.annotations.Arg; import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Result; -import org.apache.ibatis.annotations.ResultMap; -import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.session.RowBounds; @@ -34,20 +32,24 @@ public interface AnimalDataMapper extends CommonDeleteMapper, CommonInsertMapper, CommonUpdateMapper { @SelectProvider(type=SqlProviderAdapter.class, method="select") - @Results(id="AnimalDataResult", value={ - @Result(column="id", property="id", id=true), - @Result(column="animal_name", property="animalName"), - @Result(column="brain_weight", property="brainWeight"), - @Result(column="body_weight", property="bodyWeight") - }) + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) List selectMany(SelectStatementProvider selectStatement); @SelectProvider(type = SqlProviderAdapter.class, method = "select") - @ResultMap("AnimalDataResult") + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) List selectManyWithRowBounds(SelectStatementProvider selectStatement, RowBounds rowBounds); @SelectProvider(type = SqlProviderAdapter.class, method = "select") - @ResultMap("AnimalDataResult") + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) AnimalData selectOne(SelectStatementProvider selectStatement); @Select({ @@ -55,7 +57,10 @@ public interface AnimalDataMapper extends CommonDeleteMapper, CommonInsertMapper "from AnimalData", "${whereClause}" }) - @ResultMap("AnimalDataResult") + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) List selectWithWhereClause(WhereClauseProvider whereClause); @Select({ @@ -63,7 +68,10 @@ public interface AnimalDataMapper extends CommonDeleteMapper, CommonInsertMapper "from AnimalData a", "${whereClause}" }) - @ResultMap("AnimalDataResult") + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) List selectWithWhereClauseAndAlias(WhereClauseProvider whereClause); @Select({ @@ -73,7 +81,10 @@ public interface AnimalDataMapper extends CommonDeleteMapper, CommonInsertMapper "order by id", "OFFSET #{offset,jdbcType=INTEGER} LIMIT #{limit,jdbcType=INTEGER}" }) - @ResultMap("AnimalDataResult") + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) List selectWithWhereClauseLimitAndOffset(@Param("whereClauseProvider") WhereClauseProvider whereClause, @Param("limit") int limit, @Param("offset") int offset); @@ -84,7 +95,10 @@ List selectWithWhereClauseLimitAndOffset(@Param("whereClauseProvider "order by id", "OFFSET #{offset,jdbcType=INTEGER} LIMIT #{limit,jdbcType=INTEGER}" }) - @ResultMap("AnimalDataResult") + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) List selectWithWhereClauseAliasLimitAndOffset(@Param("whereClauseProvider") WhereClauseProvider whereClause, @Param("limit") int limit, @Param("offset") int offset); } diff --git a/src/test/java/examples/animal/data/AnimalDataTest.java b/src/test/java/examples/animal/data/AnimalDataTest.java index 1ea44184c..efedc0aea 100644 --- a/src/test/java/examples/animal/data/AnimalDataTest.java +++ b/src/test/java/examples/animal/data/AnimalDataTest.java @@ -45,6 +45,7 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.BasicColumn; @@ -102,7 +103,7 @@ void testSelectAllRows() { assertAll( () -> assertThat(animals).hasSize(65), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -120,7 +121,7 @@ void testSelectAllRowsWithNullLimit() { assertAll( () -> assertThat(animals).hasSize(65), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -139,7 +140,7 @@ void testSelectAllRowsWithRowBounds() { List animals = mapper.selectManyWithRowBounds(selectStatement, rowBounds); assertAll( () -> assertThat(animals).hasSize(6), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(5) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(5) ); } } @@ -156,7 +157,7 @@ void testSelectAllRowsWithOrder() { List animals = mapper.selectMany(selectStatement); assertAll( () -> assertThat(animals).hasSize(65), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(65) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(65) ); } } @@ -195,7 +196,7 @@ void testSelectAllRowsAllColumnsWithOrder() { () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData order by id DESC"), () -> assertThat(animals).hasSize(65), () -> assertThat(animals).first().isNotNull() - .extracting(AnimalData::getId).isEqualTo(65) + .extracting(AnimalData::id).isEqualTo(65) ); } } @@ -213,7 +214,7 @@ void testSelectAllRowsAllColumnsWithOrderAndAlias() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select ad.* from AnimalData ad order by id DESC"), () -> assertThat(animals).hasSize(65), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(65) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(65) ); } } @@ -379,7 +380,7 @@ void testSelectRowsNotBetweenWithStandaloneWhereClauseLimitAndOffset() { assertThat(whereClause).hasValueSatisfying(wc -> { List animals = mapper.selectWithWhereClauseLimitAndOffset(wc, 5, 15); assertThat(animals).hasSize(5); - assertThat(animals.get(0).getId()).isEqualTo(16); + assertThat(animals.get(0).id()).isEqualTo(16); }); } } @@ -397,7 +398,7 @@ void testSelectRowsNotBetweenWithStandaloneWhereClauseAliasLimitAndOffset() { assertThat(whereClause).hasValueSatisfying(wc -> { List animals = mapper.selectWithWhereClauseAliasLimitAndOffset(wc, 3, 24); assertThat(animals).hasSize(3); - assertThat(animals.get(0).getId()).isEqualTo(25); + assertThat(animals.get(0).id()).isEqualTo(25); }); } @@ -709,7 +710,7 @@ void testInConditionWithEventuallyEmptyList() { @Test void testInConditionWithEventuallyEmptyListForceRendering() { - List inValues = new ArrayList<>(); + List<@Nullable Integer> inValues = new ArrayList<>(); inValues.add(null); inValues.add(22); inValues.add(null); @@ -792,8 +793,7 @@ void testNotInCaseSensitiveConditionWithNull() { SelectStatementProvider selectStatement = select(id, animalName, bodyWeight, brainWeight) .from(animalData) .where(animalName, isNotInCaseInsensitiveWhenPresent((String) null)) - .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true)) - .build() + .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true)) .build() .render(RenderingStrategies.MYBATIS3); List animals = mapper.selectMany(selectStatement); @@ -864,8 +864,8 @@ void testLikeCaseInsensitive() { assertAll( () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).element(0).isNotNull().extracting(AnimalData::getAnimalName).isEqualTo("Ground squirrel"), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getAnimalName).isEqualTo("Artic ground squirrel") + () -> assertThat(animals).element(0).isNotNull().extracting(AnimalData::animalName).isEqualTo("Ground squirrel"), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::animalName).isEqualTo("Artic ground squirrel") ); } } @@ -1587,11 +1587,9 @@ void testComplexCondition() { void testUpdate() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { AnimalDataMapper mapper = sqlSession.getMapper(AnimalDataMapper.class); - AnimalData row = new AnimalData(); - row.setBodyWeight(2.6); UpdateStatementProvider updateStatement = update(animalData) - .set(bodyWeight).equalTo(row.getBodyWeight()) + .set(bodyWeight).equalTo(2.6) .set(animalName).equalToNull() .where(id, isIn(1, 5, 7)) .or(id, isIn(2, 6, 8), and(animalName, isLike("%bat"))) @@ -1645,11 +1643,7 @@ void testUpdateValueOrNullWithNull() { void testInsert() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { AnimalDataMapper mapper = sqlSession.getMapper(AnimalDataMapper.class); - AnimalData row = new AnimalData(); - row.setId(100); - row.setAnimalName("Old Shep"); - row.setBodyWeight(22.5); - row.setBrainWeight(1.2); + AnimalData row = new AnimalData(100, "Old Shep", 22.5, 1.2); InsertStatementProvider insertStatement = insert(row) .into(animalData) @@ -1669,11 +1663,7 @@ void testInsert() { void testInsertNull() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { AnimalDataMapper mapper = sqlSession.getMapper(AnimalDataMapper.class); - AnimalData row = new AnimalData(); - row.setId(100); - row.setAnimalName("Old Shep"); - row.setBodyWeight(22.5); - row.setBrainWeight(1.2); + AnimalData row = new AnimalData(100, "Old Shep", 22.5, 1.2); InsertStatementProvider insertStatement = insert(row) .into(animalData) @@ -1693,18 +1683,10 @@ void testInsertNull() { void testBulkInsert() { try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) { AnimalDataMapper mapper = sqlSession.getMapper(AnimalDataMapper.class); - List records = new ArrayList<>(); - AnimalData row = new AnimalData(); - row.setId(100); - row.setAnimalName("Old Shep"); - row.setBodyWeight(22.5); - records.add(row); - - row = new AnimalData(); - row.setId(101); - row.setAnimalName("Old Dan"); - row.setBodyWeight(22.5); - records.add(row); + List records = List.of( + new AnimalData(100, "Old Shep", 0.0, 22.5), + new AnimalData(101, "Old Dan", 0.0, 22.5) + ); BatchInsert batchInsert = insertBatch(records) .into(animalData) @@ -1730,10 +1712,10 @@ void testBulkInsert() { assertAll( () -> assertThat(animals).hasSize(2), () -> assertThat(animals).element(0).isNotNull() - .extracting(AnimalData::getId, AnimalData::getBrainWeight, AnimalData::getAnimalName) + .extracting(AnimalData::id, AnimalData::brainWeight, AnimalData::animalName) .containsExactly(100, 1.2, null), () -> assertThat(animals).element(1).isNotNull() - .extracting(AnimalData::getId, AnimalData::getBrainWeight, AnimalData::getAnimalName) + .extracting(AnimalData::id, AnimalData::brainWeight, AnimalData::animalName) .containsExactly(101, 1.2, null) ); } @@ -1743,18 +1725,10 @@ void testBulkInsert() { void testBulkInsert2() { try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) { AnimalDataMapper mapper = sqlSession.getMapper(AnimalDataMapper.class); - List records = new ArrayList<>(); - AnimalData row = new AnimalData(); - row.setId(100); - row.setAnimalName("Old Shep"); - row.setBodyWeight(22.5); - records.add(row); - - row = new AnimalData(); - row.setId(101); - row.setAnimalName("Old Dan"); - row.setBodyWeight(22.5); - records.add(row); + List records = List.of( + new AnimalData(100, "Old Shep", 0.0, 22.5), + new AnimalData(101, "Old Dan", 0.0, 22.5) + ); BatchInsert batchInsert = insertBatch(records) .into(animalData) @@ -1780,10 +1754,10 @@ void testBulkInsert2() { assertAll( () -> assertThat(animals).hasSize(2), () -> assertThat(animals).element(0).isNotNull() - .extracting(AnimalData::getId, AnimalData::getBrainWeight, AnimalData::getAnimalName) + .extracting(AnimalData::id, AnimalData::brainWeight, AnimalData::animalName) .containsExactly(100, 1.2, "Old Fred"), () -> assertThat(animals).element(1).isNotNull() - .extracting(AnimalData::getId, AnimalData::getBrainWeight, AnimalData::getAnimalName) + .extracting(AnimalData::id, AnimalData::brainWeight, AnimalData::animalName) .containsExactly(101, 1.2, "Old Fred") ); } @@ -1806,7 +1780,7 @@ void testOrderByAndDistinct() { assertAll( () -> assertThat(rows).hasSize(14), - () -> assertThat(rows).first().isNotNull().extracting(AnimalData::getId).isEqualTo(65) + () -> assertThat(rows).first().isNotNull().extracting(AnimalData::id).isEqualTo(65) ); } } @@ -1828,7 +1802,7 @@ void testOrderByWithFullClause() { assertAll( () -> assertThat(rows).hasSize(14), - () -> assertThat(rows).first().isNotNull().extracting(AnimalData::getId).isEqualTo(65) + () -> assertThat(rows).first().isNotNull().extracting(AnimalData::id).isEqualTo(65) ); } } @@ -1944,7 +1918,7 @@ void testMaxSubselect() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select a.id, a.animal_name, a.body_weight, a.brain_weight from AnimalData a where a.brain_weight = (select max(b.brain_weight) from AnimalData b)"), () -> assertThat(records).hasSize(1), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getAnimalName).isEqualTo("Brachiosaurus") + () -> assertThat(records).first().isNotNull().extracting(AnimalData::animalName).isEqualTo("Brachiosaurus") ); } } @@ -2004,7 +1978,7 @@ void testMinSubselect() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select a.id, a.animal_name, a.body_weight, a.brain_weight from AnimalData a where a.brain_weight <> (select min(b.brain_weight) from AnimalData b) order by animal_name"), () -> assertThat(records).hasSize(64), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getAnimalName).isEqualTo("African elephant") + () -> assertThat(records).first().isNotNull().extracting(AnimalData::animalName).isEqualTo("African elephant") ); } } @@ -2026,7 +2000,7 @@ void testMinSubselectNoAlias() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where brain_weight <> (select min(brain_weight) from AnimalData) order by animal_name"), () -> assertThat(records).hasSize(64), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getAnimalName).isEqualTo("African elephant") + () -> assertThat(records).first().isNotNull().extracting(AnimalData::animalName).isEqualTo("African elephant") ); } } @@ -2335,13 +2309,13 @@ void testUpdateWithAddAndSubtract() { assertThat(rows).isEqualTo(1); AnimalData row = MyBatis3Utils.selectOne(mapper::selectOne, - BasicColumn.columnList(id, bodyWeight, brainWeight), + BasicColumn.columnList(id, animalName, bodyWeight, brainWeight), animalData, c -> c.where(id, isEqualTo(1)) ); - assertThat(row.getBodyWeight()).isEqualTo(-2.86); - assertThat(row.getBrainWeight()).isEqualTo(2.005); + assertThat(row.bodyWeight()).isEqualTo(-2.86); + assertThat(row.brainWeight()).isEqualTo(2.005); } } @@ -2368,13 +2342,13 @@ void testUpdateWithMultiplyAndDivide() { assertThat(rows).isEqualTo(1); AnimalData row = MyBatis3Utils.selectOne(mapper::selectOne, - BasicColumn.columnList(id, bodyWeight, brainWeight), + BasicColumn.columnList(id, animalName, bodyWeight, brainWeight), animalData, c -> c.where(id, isEqualTo(1)) ); - assertThat(row.getBodyWeight()).isEqualTo(0.42, within(.001)); - assertThat(row.getBrainWeight()).isEqualTo(.0025); + assertThat(row.bodyWeight()).isEqualTo(0.42, within(.001)); + assertThat(row.brainWeight()).isEqualTo(.0025); } } } diff --git a/src/test/java/examples/animal/data/CommonSelectMapperTest.java b/src/test/java/examples/animal/data/CommonSelectMapperTest.java index 380d888f7..f201d963f 100644 --- a/src/test/java/examples/animal/data/CommonSelectMapperTest.java +++ b/src/test/java/examples/animal/data/CommonSelectMapperTest.java @@ -69,14 +69,11 @@ void setup() throws Exception { sqlSessionFactory = new SqlSessionFactoryBuilder().build(config); } - private final Function, AnimalData> rowMapper = map -> { - AnimalData ad = new AnimalData(); - ad.setId((Integer) map.get("ID")); - ad.setAnimalName((String) map.get("ANIMAL_NAME")); - ad.setBodyWeight((Double) map.get("BODY_WEIGHT")); - ad.setBrainWeight((Double) map.get("BRAIN_WEIGHT")); - return ad; - }; + private final Function, AnimalData> rowMapper = map -> new AnimalData( + (Integer) map.get("ID"), + (String) map.get("ANIMAL_NAME"), + (Double) map.get("BRAIN_WEIGHT"), + (Double) map.get("BODY_WEIGHT")); @Test void testGeneralSelectOne() { @@ -107,10 +104,10 @@ void testGeneralSelectOneWithRowMapper() { AnimalData animal = mapper.selectOne(selectStatement, rowMapper); assertThat(animal).isNotNull(); - assertThat(animal.getId()).isEqualTo(1); - assertThat(animal.getAnimalName()).isEqualTo("Lesser short-tailed shrew"); - assertThat(animal.getBodyWeight()).isEqualTo(0.14); - assertThat(animal.getBrainWeight()).isEqualTo(0.005); + assertThat(animal.id()).isEqualTo(1); + assertThat(animal.animalName()).isEqualTo("Lesser short-tailed shrew"); + assertThat(animal.bodyWeight()).isEqualTo(0.14); + assertThat(animal.brainWeight()).isEqualTo(0.005); } } @@ -164,14 +161,14 @@ void testGeneralSelectManyWithRowMapper() { assertThat(rows).hasSize(2); - assertThat(rows.get(0).getId()).isEqualTo(1); - assertThat(rows.get(0).getAnimalName()).isEqualTo("Lesser short-tailed shrew"); - assertThat(rows.get(0).getBodyWeight()).isEqualTo(0.14); - assertThat(rows.get(0).getBrainWeight()).isEqualTo(0.005); - assertThat(rows.get(1).getId()).isEqualTo(2); - assertThat(rows.get(1).getAnimalName()).isEqualTo("Little brown bat"); - assertThat(rows.get(1).getBodyWeight()).isEqualTo(0.25); - assertThat(rows.get(1).getBrainWeight()).isEqualTo(0.01); + assertThat(rows.get(0).id()).isEqualTo(1); + assertThat(rows.get(0).animalName()).isEqualTo("Lesser short-tailed shrew"); + assertThat(rows.get(0).bodyWeight()).isEqualTo(0.14); + assertThat(rows.get(0).brainWeight()).isEqualTo(0.005); + assertThat(rows.get(1).id()).isEqualTo(2); + assertThat(rows.get(1).animalName()).isEqualTo("Little brown bat"); + assertThat(rows.get(1).bodyWeight()).isEqualTo(0.25); + assertThat(rows.get(1).brainWeight()).isEqualTo(0.01); } } diff --git a/src/test/java/examples/animal/data/FetchFirstTest.java b/src/test/java/examples/animal/data/FetchFirstTest.java index 1c73532f1..9a1a10c00 100644 --- a/src/test/java/examples/animal/data/FetchFirstTest.java +++ b/src/test/java/examples/animal/data/FetchFirstTest.java @@ -80,7 +80,7 @@ void testOffsetAndFetchFirstAfterFrom() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(23), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(23), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData offset #{parameters.p1} rows fetch first #{parameters.p2} rows only"), () -> assertThat(selectStatement.getParameters()).containsEntry("p2", 3L), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 22L) @@ -102,7 +102,7 @@ void testFetchFirstOnlyAfterFrom() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData fetch first #{parameters.p1} rows only"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 3L) ); @@ -126,7 +126,7 @@ void testOffsetAndFetchFirstAfterWhere() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(45), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(45), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData where id < #{parameters.p1,jdbcType=INTEGER} and id > #{parameters.p2,jdbcType=INTEGER} offset #{parameters.p3} rows fetch first #{parameters.p4} rows only"), () -> assertThat(selectStatement.getParameters()).contains(entry("p4", 3L), entry("p3", 22L)) ); @@ -148,7 +148,7 @@ void testFetchFirstOnlyAfterWhere() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData where id < #{parameters.p1,jdbcType=INTEGER} fetch first #{parameters.p2} rows only"), () -> assertThat(selectStatement.getParameters()).containsEntry("p2", 3L) ); @@ -171,7 +171,7 @@ void testOffsetAndFetchFirstAfterOrderBy() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(23), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(23), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData order by id offset #{parameters.p1} rows fetch first #{parameters.p2} rows only"), () -> assertThat(selectStatement) .extracting(SelectStatementProvider::getParameters) @@ -196,7 +196,7 @@ void testLimitOnlyAfterOrderBy() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData order by id fetch first #{parameters.p1} rows only"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 3L) ); diff --git a/src/test/java/examples/animal/data/LimitAndOffsetTest.java b/src/test/java/examples/animal/data/LimitAndOffsetTest.java index a5ffc67e5..9569d0751 100644 --- a/src/test/java/examples/animal/data/LimitAndOffsetTest.java +++ b/src/test/java/examples/animal/data/LimitAndOffsetTest.java @@ -79,7 +79,7 @@ void testLimitAndOffsetAfterFrom() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(23), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(23), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData limit #{parameters.p1} offset #{parameters.p2}"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 3L), () -> assertThat(selectStatement.getParameters()).containsEntry("p2", 22L) @@ -101,7 +101,7 @@ void testLimitOnlyAfterFrom() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData limit #{parameters.p1}"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 3L) ); @@ -122,7 +122,7 @@ void testOffsetOnlyAfterFrom() { assertAll( () -> assertThat(records).hasSize(43), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(23), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(23), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData offset #{parameters.p1} rows"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 22L) ); @@ -146,7 +146,7 @@ void testLimitAndOffsetAfterWhere() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(45), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(45), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData where id < #{parameters.p1,jdbcType=INTEGER} and id > #{parameters.p2,jdbcType=INTEGER} limit #{parameters.p3} offset #{parameters.p4}"), () -> assertThat(selectStatement.getParameters()).containsEntry("p3", 3L), () -> assertThat(selectStatement.getParameters()).containsEntry("p4", 22L) @@ -169,7 +169,7 @@ void testLimitOnlyAfterWhere() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData where id < #{parameters.p1,jdbcType=INTEGER} limit #{parameters.p2}"), () -> assertThat(selectStatement.getParameters()).containsEntry("p2", 3L) ); @@ -191,7 +191,7 @@ void testOffsetOnlyAfterWhere() { assertAll( () -> assertThat(records).hasSize(27), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(23), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(23), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData where id < #{parameters.p1,jdbcType=INTEGER} offset #{parameters.p2} rows"), () -> assertThat(selectStatement.getParameters()).containsEntry("p2", 22L) ); @@ -214,7 +214,7 @@ void testLimitAndOffsetAfterOrderBy() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(23), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(23), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData order by id limit #{parameters.p1} offset #{parameters.p2}"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 3L), () -> assertThat(selectStatement.getParameters()).containsEntry("p2", 22L) @@ -237,7 +237,7 @@ void testLimitOnlyAfterOrderBy() { assertAll( () -> assertThat(records).hasSize(3), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData order by id limit #{parameters.p1}"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 3L) ); @@ -259,7 +259,7 @@ void testOffsetOnlyAfterOrderBy() { assertAll( () -> assertThat(records).hasSize(43), - () -> assertThat(records).first().isNotNull().extracting(AnimalData::getId).isEqualTo(23), + () -> assertThat(records).first().isNotNull().extracting(AnimalData::id).isEqualTo(23), () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select * from AnimalData order by id offset #{parameters.p1} rows"), () -> assertThat(selectStatement.getParameters()).containsEntry("p1", 22L) ); diff --git a/src/test/java/examples/animal/data/MyInCondition.java b/src/test/java/examples/animal/data/MyInCondition.java index e31782dbc..13f076331 100644 --- a/src/test/java/examples/animal/data/MyInCondition.java +++ b/src/test/java/examples/animal/data/MyInCondition.java @@ -17,16 +17,14 @@ import static java.util.function.Predicate.not; -import java.util.Objects; - +import org.jspecify.annotations.Nullable; import org.mybatis.dynamic.sql.SqlBuilder; -import org.mybatis.dynamic.sql.where.condition.IsIn; +import org.mybatis.dynamic.sql.where.condition.IsInWhenPresent; public class MyInCondition { - public static IsIn isIn(String...values) { - return SqlBuilder.isIn(values) - .filter(Objects::nonNull) - .map((String::trim)) + public static IsInWhenPresent isIn(@Nullable String...values) { + return SqlBuilder.isInWhenPresent(values) + .map(String::trim) .filter(not(String::isEmpty)); } } diff --git a/src/test/java/examples/animal/data/OptionalConditionsAnimalDataTest.java b/src/test/java/examples/animal/data/OptionalConditionsAnimalDataTest.java index f09c2544e..0917160a0 100644 --- a/src/test/java/examples/animal/data/OptionalConditionsAnimalDataTest.java +++ b/src/test/java/examples/animal/data/OptionalConditionsAnimalDataTest.java @@ -34,6 +34,7 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.render.RenderingStrategies; @@ -43,7 +44,7 @@ class OptionalConditionsAnimalDataTest { private static final String JDBC_URL = "jdbc:hsqldb:mem:aname"; private static final String JDBC_DRIVER = "org.hsqldb.jdbcDriver"; - private static final Integer NULL_INTEGER = null; + private static final @Nullable Integer NULL_INTEGER = null; private SqlSessionFactory sqlSessionFactory; @@ -80,8 +81,8 @@ void testAllIgnored() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData order by id"), () -> assertThat(animals).hasSize(65), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(2) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(2) ); } } @@ -102,8 +103,8 @@ void testIgnoredBetweenRendered() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -124,8 +125,8 @@ void testIgnoredInWhere() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -147,8 +148,8 @@ void testManyIgnored() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -168,8 +169,8 @@ void testIgnoredInitialWhere() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -188,7 +189,7 @@ void testEqualWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(1), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -208,7 +209,7 @@ void testEqualWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -228,7 +229,7 @@ void testNotEqualWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <> #{parameters.p1,jdbcType=INTEGER} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(9), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -248,7 +249,7 @@ void testNotEqualWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -268,7 +269,7 @@ void testGreaterThanWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id > #{parameters.p1,jdbcType=INTEGER} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(6), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(5) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(5) ); } } @@ -288,7 +289,7 @@ void testGreaterThanWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -308,7 +309,7 @@ void testGreaterThanOrEqualToWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id >= #{parameters.p1,jdbcType=INTEGER} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(7), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -328,7 +329,7 @@ void testGreaterThanOrEqualToWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -347,7 +348,7 @@ void testLessThanWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id < #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(3), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -367,7 +368,7 @@ void testLessThanWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -386,7 +387,7 @@ void testLessThanOrEqualToWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(4), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -406,7 +407,7 @@ void testLessThanOrEqualToWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -425,7 +426,7 @@ void testIsInWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER},#{parameters.p3,jdbcType=INTEGER}) order by id"), () -> assertThat(animals).hasSize(3), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -444,7 +445,7 @@ void testIsInWhenPresentWithSomeValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER}) order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3) ); } } @@ -464,7 +465,7 @@ void testIsInWhenPresentWithNoValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -483,7 +484,7 @@ void testIsInCaseInsensitiveWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -502,7 +503,7 @@ void testIsInCaseInsensitiveWhenPresentWithSomeValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -522,7 +523,7 @@ void testIsInCaseInsensitiveWhenPresentWithNoValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -542,7 +543,7 @@ void testIsNotInWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id not in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER},#{parameters.p3,jdbcType=INTEGER}) and id <= #{parameters.p4,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(7), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -562,7 +563,7 @@ void testIsNotInWhenPresentWithSomeValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id not in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER}) and id <= #{parameters.p3,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -582,7 +583,7 @@ void testIsNotInWhenPresentWithNoValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -602,7 +603,7 @@ void testIsNotInCaseInsensitiveWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) not in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) and id <= #{parameters.p3,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -622,7 +623,7 @@ void testIsNotInCaseInsensitiveWhenPresentWithSomeValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) not in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) and id <= #{parameters.p3,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -642,7 +643,7 @@ void testIsNotInCaseInsensitiveWhenPresentWithNoValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -661,7 +662,7 @@ void testIsBetweenWhenPresentWithValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id between #{parameters.p1,jdbcType=INTEGER} and #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(4), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3) ); } } @@ -681,7 +682,7 @@ void testIsBetweenWhenPresentWithFirstMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -701,7 +702,7 @@ void testIsBetweenWhenPresentWithSecondMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -721,7 +722,7 @@ void testIsBetweenWhenPresentWithBothMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -741,7 +742,7 @@ void testIsNotBetweenWhenPresentWithValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id not between #{parameters.p1,jdbcType=INTEGER} and #{parameters.p2,jdbcType=INTEGER} and id <= #{parameters.p3,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(6), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -761,7 +762,7 @@ void testIsNotBetweenWhenPresentWithFirstMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -781,7 +782,7 @@ void testIsNotBetweenWhenPresentWithSecondMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -801,7 +802,7 @@ void testIsNotBetweenWhenPresentWithBothMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -821,7 +822,7 @@ void testIsLikeWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where animal_name like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(6) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(6) ); } } @@ -841,7 +842,7 @@ void testIsLikeWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -861,7 +862,7 @@ void testIsLikeCaseInsensitiveWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(6) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(6) ); } } @@ -881,7 +882,7 @@ void testIsLikeCaseInsensitiveWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -901,7 +902,7 @@ void testIsNotLikeWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where animal_name not like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -921,7 +922,7 @@ void testIsNotLikeWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -941,7 +942,7 @@ void testIsNotLikeCaseInsensitiveWhenPresentWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) not like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -961,7 +962,7 @@ void testIsNotLikeCaseInsensitiveWhenPresentWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } diff --git a/src/test/java/examples/animal/data/OptionalConditionsWithPredicatesAnimalDataTest.java b/src/test/java/examples/animal/data/OptionalConditionsWithPredicatesAnimalDataTest.java index 89d349825..4c65708cd 100644 --- a/src/test/java/examples/animal/data/OptionalConditionsWithPredicatesAnimalDataTest.java +++ b/src/test/java/examples/animal/data/OptionalConditionsWithPredicatesAnimalDataTest.java @@ -39,16 +39,18 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.render.RenderingStrategies; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.util.Predicates; class OptionalConditionsWithPredicatesAnimalDataTest { private static final String JDBC_URL = "jdbc:hsqldb:mem:aname"; private static final String JDBC_DRIVER = "org.hsqldb.jdbcDriver"; - private static final Integer NULL_INTEGER = null; + private static final @Nullable Integer NULL_INTEGER = null; private SqlSessionFactory sqlSessionFactory; @@ -85,8 +87,8 @@ void testAllIgnored() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData order by id"), () -> assertThat(animals).hasSize(65), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(2) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(2) ); } } @@ -107,8 +109,8 @@ void testIgnoredBetweenRendered() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -129,8 +131,8 @@ void testIgnoredInWhere() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -143,7 +145,7 @@ void testManyIgnored() { .from(animalData) .where(id, isLessThanWhenPresent(NULL_INTEGER), and(id, isGreaterThanOrEqualToWhenPresent(NULL_INTEGER))) .and(id, isEqualToWhenPresent(NULL_INTEGER), or(id, isEqualTo(3), and(id, isLessThanWhenPresent(NULL_INTEGER)))) - .or(id, isEqualTo(4), and(id, isGreaterThanOrEqualToWhenPresent(NULL_INTEGER))) + .or(id, isEqualToWhenPresent(4), and(id, isGreaterThanOrEqualToWhenPresent(NULL_INTEGER))) .and(id, isNotEqualToWhenPresent(NULL_INTEGER)) .orderBy(id) .build() @@ -152,8 +154,8 @@ void testManyIgnored() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -173,8 +175,8 @@ void testIgnoredInitialWhere() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} or id = #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -193,7 +195,7 @@ void testEqualWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id = #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(1), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -213,7 +215,7 @@ void testEqualWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -233,7 +235,7 @@ void testNotEqualWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <> #{parameters.p1,jdbcType=INTEGER} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(9), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -253,7 +255,7 @@ void testNotEqualWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -273,7 +275,7 @@ void testGreaterThanWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id > #{parameters.p1,jdbcType=INTEGER} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(6), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(5) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(5) ); } } @@ -293,7 +295,7 @@ void testGreaterThanWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -313,7 +315,7 @@ void testGreaterThanOrEqualToWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id >= #{parameters.p1,jdbcType=INTEGER} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(7), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -333,7 +335,7 @@ void testGreaterThanOrEqualToWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -352,7 +354,7 @@ void testLessThanWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id < #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(3), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -372,7 +374,7 @@ void testLessThanWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -391,7 +393,7 @@ void testLessThanOrEqualToWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(4), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -411,7 +413,7 @@ void testLessThanOrEqualToWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -430,7 +432,7 @@ void testIsInWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER},#{parameters.p3,jdbcType=INTEGER}) order by id"), () -> assertThat(animals).hasSize(3), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -449,8 +451,8 @@ void testIsInWhenWithSomeValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER}) order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(6), - () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::getId).isEqualTo(8) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(6), + () -> assertThat(animals).element(1).isNotNull().extracting(AnimalData::id).isEqualTo(8) ); } } @@ -469,7 +471,7 @@ void testIsInCaseInsensitiveWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -490,7 +492,7 @@ void testValueStreamTransformer() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where animal_name in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -509,7 +511,7 @@ void testValueStreamTransformerWithCustomCondition() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where animal_name in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(4) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(4) ); } } @@ -529,7 +531,7 @@ void testIsInCaseInsensitiveWhenWithNoValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -549,7 +551,7 @@ void testIsNotInWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id not in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER},#{parameters.p3,jdbcType=INTEGER}) and id <= #{parameters.p4,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(7), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -569,7 +571,7 @@ void testIsNotInWhenWithSomeValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id not in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER}) and id <= #{parameters.p3,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -589,7 +591,7 @@ void testIsNotInCaseInsensitiveWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) not in (#{parameters.p1,jdbcType=VARCHAR},#{parameters.p2,jdbcType=VARCHAR}) and id <= #{parameters.p3,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -609,7 +611,7 @@ void testIsNotInCaseInsensitiveWhenWithNoValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -620,7 +622,7 @@ void testIsBetweenWhenWithValues() { AnimalDataMapper mapper = sqlSession.getMapper(AnimalDataMapper.class); SelectStatementProvider selectStatement = select(id, animalName, bodyWeight, brainWeight) .from(animalData) - .where(id, isBetween(3).and(6)) + .where(id, isBetween(3).and(6).filter(Predicates.bothPresent())) .orderBy(id) .build() .render(RenderingStrategies.MYBATIS3); @@ -628,7 +630,7 @@ void testIsBetweenWhenWithValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id between #{parameters.p1,jdbcType=INTEGER} and #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(4), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(3) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(3) ); } } @@ -648,7 +650,7 @@ void testIsBetweenWhenWithFirstMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -668,7 +670,7 @@ void testIsBetweenWhenWithSecondMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -688,7 +690,7 @@ void testIsBetweenWhenWithBothMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -699,7 +701,7 @@ void testIsNotBetweenWhenWithValues() { AnimalDataMapper mapper = sqlSession.getMapper(AnimalDataMapper.class); SelectStatementProvider selectStatement = select(id, animalName, bodyWeight, brainWeight) .from(animalData) - .where(id, isNotBetween(3).and(6)) + .where(id, isNotBetween(3).and(6).filter(Predicates.bothPresent())) .and(id, isLessThanOrEqualTo(10)) .orderBy(id) .build() @@ -708,7 +710,7 @@ void testIsNotBetweenWhenWithValues() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id not between #{parameters.p1,jdbcType=INTEGER} and #{parameters.p2,jdbcType=INTEGER} and id <= #{parameters.p3,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(6), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -728,7 +730,7 @@ void testIsNotBetweenWhenWithFirstMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -748,7 +750,7 @@ void testIsNotBetweenWhenWithSecondMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -768,7 +770,7 @@ void testIsNotBetweenWhenWithBothMissing() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -788,7 +790,7 @@ void testIsLikeWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where animal_name like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(6) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(6) ); } } @@ -808,7 +810,7 @@ void testIsLikeWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -828,7 +830,7 @@ void testIsLikeCaseInsensitiveWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(2), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(6) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(6) ); } } @@ -848,7 +850,7 @@ void testIsLikeCaseInsensitiveWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -868,7 +870,7 @@ void testIsNotLikeWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where animal_name not like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -888,7 +890,7 @@ void testIsNotLikeWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -908,7 +910,7 @@ void testIsNotLikeCaseInsensitiveWhenWithValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where upper(animal_name) not like #{parameters.p1,jdbcType=VARCHAR} and id <= #{parameters.p2,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(8), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } @@ -928,7 +930,7 @@ void testIsNotLikeCaseInsensitiveWhenWithoutValue() { assertAll( () -> assertThat(selectStatement.getSelectStatement()).isEqualTo("select id, animal_name, body_weight, brain_weight from AnimalData where id <= #{parameters.p1,jdbcType=INTEGER} order by id"), () -> assertThat(animals).hasSize(10), - () -> assertThat(animals).first().isNotNull().extracting(AnimalData::getId).isEqualTo(1) + () -> assertThat(animals).first().isNotNull().extracting(AnimalData::id).isEqualTo(1) ); } } diff --git a/src/test/java/examples/animal/data/VariousListConditionsTest.java b/src/test/java/examples/animal/data/VariousListConditionsTest.java index c3cc8777e..1fef3d88b 100644 --- a/src/test/java/examples/animal/data/VariousListConditionsTest.java +++ b/src/test/java/examples/animal/data/VariousListConditionsTest.java @@ -86,19 +86,18 @@ void testInWithNull() { SelectStatementProvider selectStatement = select(id, animalName) .from(animalData) - .where(id, isIn(2, 3, null)) + .where(id, isInWhenPresent(2, 3, null)) .orderBy(id) .build() .render(RenderingStrategies.MYBATIS3); assertThat(selectStatement.getSelectStatement()).isEqualTo( "select id, animal_name from AnimalData where id " + - "in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER},#{parameters.p3,jdbcType=INTEGER}) " + + "in (#{parameters.p1,jdbcType=INTEGER},#{parameters.p2,jdbcType=INTEGER}) " + "order by id" ); assertThat(selectStatement.getParameters()).containsEntry("p1", 2); assertThat(selectStatement.getParameters()).containsEntry("p2", 3); - assertThat(selectStatement.getParameters()).containsEntry("p3", null); List> rows = mapper.selectManyMappedRows(selectStatement); assertThat(rows).hasSize(2); @@ -171,13 +170,6 @@ void testInWhenPresentWithEmptyList() { } } - @Test - void testInWithNullList() { - assertThatExceptionOfType(NullPointerException.class).isThrownBy(() -> - isIn((Collection) null) - ); - } - @Test void testInWhenPresentWithNullList() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { diff --git a/src/test/java/examples/animal/data/package-info.java b/src/test/java/examples/animal/data/package-info.java new file mode 100644 index 000000000..0b0ff393f --- /dev/null +++ b/src/test/java/examples/animal/data/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.animal.data; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/column/comparison/ColumnComparisonMapper.java b/src/test/java/examples/column/comparison/ColumnComparisonMapper.java index a8acf0c88..dc27de8d0 100644 --- a/src/test/java/examples/column/comparison/ColumnComparisonMapper.java +++ b/src/test/java/examples/column/comparison/ColumnComparisonMapper.java @@ -17,7 +17,7 @@ import java.util.List; -import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Arg; import org.apache.ibatis.annotations.SelectProvider; import org.mybatis.dynamic.sql.select.SelectDSLCompleter; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; @@ -27,8 +27,8 @@ public interface ColumnComparisonMapper { @SelectProvider(type=SqlProviderAdapter.class, method="select") - @Result(column="number1", property="number1", id=true) - @Result(column="number2", property="number2", id=true) + @Arg(column="number1", javaType = int.class, id=true) + @Arg(column="number2", javaType = int.class, id=true) List selectMany(SelectStatementProvider selectStatement); default List select(SelectDSLCompleter completer) { diff --git a/src/test/java/examples/column/comparison/ColumnComparisonRecord.java b/src/test/java/examples/column/comparison/ColumnComparisonRecord.java index b783d61b4..8222ca042 100644 --- a/src/test/java/examples/column/comparison/ColumnComparisonRecord.java +++ b/src/test/java/examples/column/comparison/ColumnComparisonRecord.java @@ -15,23 +15,4 @@ */ package examples.column.comparison; -public class ColumnComparisonRecord { - private int number1; - private int number2; - - public int getNumber1() { - return number1; - } - - public void setNumber1(int number1) { - this.number1 = number1; - } - - public int getNumber2() { - return number2; - } - - public void setNumber2(int number2) { - this.number2 = number2; - } -} +public record ColumnComparisonRecord (int number1, int number2) {} diff --git a/src/test/java/examples/column/comparison/ColumnComparisonTest.java b/src/test/java/examples/column/comparison/ColumnComparisonTest.java index 91a6036c5..746db94cd 100644 --- a/src/test/java/examples/column/comparison/ColumnComparisonTest.java +++ b/src/test/java/examples/column/comparison/ColumnComparisonTest.java @@ -51,8 +51,8 @@ void testColumnComparisonLessThan() { assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); assertThat(records).hasSize(5); - assertThat(records.get(0).getNumber1()).isEqualTo(1); - assertThat(records.get(4).getNumber1()).isEqualTo(5); + assertThat(records.get(0).number1()).isEqualTo(1); + assertThat(records.get(4).number1()).isEqualTo(5); } @Test @@ -73,8 +73,8 @@ void testColumnComparisonLessThanOrEqual() { assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); assertThat(records).hasSize(6); - assertThat(records.get(0).getNumber1()).isEqualTo(1); - assertThat(records.get(5).getNumber1()).isEqualTo(6); + assertThat(records.get(0).number1()).isEqualTo(1); + assertThat(records.get(5).number2()).isEqualTo(6); } @Test @@ -95,8 +95,8 @@ void testColumnComparisonGreaterThan() { assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); assertThat(records).hasSize(5); - assertThat(records.get(0).getNumber1()).isEqualTo(7); - assertThat(records.get(4).getNumber1()).isEqualTo(11); + assertThat(records.get(0).number1()).isEqualTo(7); + assertThat(records.get(4).number1()).isEqualTo(11); } @Test @@ -117,8 +117,8 @@ void testColumnComparisonGreaterThanOrEqual() { assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); assertThat(records).hasSize(6); - assertThat(records.get(0).getNumber1()).isEqualTo(6); - assertThat(records.get(5).getNumber1()).isEqualTo(11); + assertThat(records.get(0).number1()).isEqualTo(6); + assertThat(records.get(5).number1()).isEqualTo(11); } @Test @@ -139,7 +139,7 @@ void testColumnComparisonEqual() { assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); assertThat(records).hasSize(1); - assertThat(records.get(0).getNumber1()).isEqualTo(6); + assertThat(records.get(0).number1()).isEqualTo(6); } @Test @@ -160,8 +160,8 @@ void testColumnComparisonNotEqual() { assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); assertThat(records).hasSize(10); - assertThat(records.get(0).getNumber1()).isEqualTo(1); - assertThat(records.get(9).getNumber1()).isEqualTo(11); + assertThat(records.get(0).number1()).isEqualTo(1); + assertThat(records.get(9).number1()).isEqualTo(11); } @Test @@ -172,7 +172,7 @@ void testHelperMethod() { ); assertThat(records).hasSize(10); - assertThat(records.get(0).getNumber1()).isEqualTo(1); - assertThat(records.get(9).getNumber1()).isEqualTo(11); + assertThat(records.get(0).number1()).isEqualTo(1); + assertThat(records.get(9).number1()).isEqualTo(11); } } diff --git a/src/test/java/examples/complexquery/ComplexQueryTest.java b/src/test/java/examples/complexquery/ComplexQueryTest.java index 3912040cb..e31ab536b 100644 --- a/src/test/java/examples/complexquery/ComplexQueryTest.java +++ b/src/test/java/examples/complexquery/ComplexQueryTest.java @@ -117,7 +117,7 @@ SelectStatementProvider search(@Nullable Integer targetId, @Nullable String fNam } else { builder .and(firstName, isLikeWhenPresent(fName).map(s -> "%" + s + "%")) - .and(lastName, isLikeWhenPresent(lName).map(this::addWildcards)); + .and(lastName, isLikeWhenPresent(lName).map(SearchUtils::addWildcards)); } builder @@ -126,8 +126,4 @@ SelectStatementProvider search(@Nullable Integer targetId, @Nullable String fNam return builder.build().render(RenderingStrategies.MYBATIS3); } - - String addWildcards(String s) { - return "%" + s + "%"; - } } diff --git a/src/test/java/examples/complexquery/GroupingTest.java b/src/test/java/examples/complexquery/GroupingTest.java index 1d3f631f6..b6552b3cb 100644 --- a/src/test/java/examples/complexquery/GroupingTest.java +++ b/src/test/java/examples/complexquery/GroupingTest.java @@ -33,9 +33,9 @@ class GroupingTest { private static class Foo extends SqlTable { - public SqlColumn columnA = column("A"); - public SqlColumn columnB = column("B"); - public SqlColumn columnC = column("C"); + public final SqlColumn columnA = column("A"); + public final SqlColumn columnB = column("B"); + public final SqlColumn columnC = column("C"); public Foo() { super("Foo"); diff --git a/src/test/java/examples/custom_render/CustomRenderingTest.java b/src/test/java/examples/custom_render/CustomRenderingTest.java index 11d7e331c..8b0541c1e 100644 --- a/src/test/java/examples/custom_render/CustomRenderingTest.java +++ b/src/test/java/examples/custom_render/CustomRenderingTest.java @@ -40,7 +40,7 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider; @@ -63,10 +63,10 @@ class CustomRenderingTest { new PostgreSQLContainer<>(TestContainersConfiguration.POSTGRES_LATEST) .withInitScript("examples/custom_render/dbInit.sql"); - private static SqlSessionFactory sqlSessionFactory; + private SqlSessionFactory sqlSessionFactory; - @BeforeAll - static void setUp() { + @BeforeEach + void setUp() { UnpooledDataSource ds = new UnpooledDataSource(postgres.getDriverClassName(), postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword()); Environment environment = new Environment("test", new JdbcTransactionFactory(), ds); @@ -81,10 +81,8 @@ void testInsertRecord() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { JsonTestMapper mapper = sqlSession.getMapper(JsonTestMapper.class); - JsonTestRecord row = new JsonTestRecord(); - row.setId(1); - row.setDescription("Fred"); - row.setInfo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + JsonTestRecord row = new JsonTestRecord(1, "Fred", + "{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); InsertStatementProvider insertStatement = insert(row).into(jsonTest) .map(id).toProperty("id") @@ -102,10 +100,8 @@ void testInsertRecord() { int rows = mapper.insert(insertStatement); assertThat(rows).isEqualTo(1); - row = new JsonTestRecord(); - row.setId(2); - row.setDescription("Wilma"); - row.setInfo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + row = new JsonTestRecord(2, "Wilma", + "{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); insertStatement = insert(row).into(jsonTest) .map(id).toProperty("id") @@ -125,8 +121,8 @@ void testInsertRecord() { List records = mapper.selectMany(selectStatement); assertThat(records).hasSize(2); - assertThat(records.get(0).getInfo()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - assertThat(records.get(1).getInfo()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + assertThat(records.get(0).info()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + assertThat(records.get(1).info()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); } } @@ -169,8 +165,8 @@ void testGeneralInsert() { List records = mapper.selectMany(selectStatement); assertThat(records).hasSize(2); - assertThat(records.get(0).getInfo()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - assertThat(records.get(1).getInfo()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + assertThat(records.get(0).info()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + assertThat(records.get(1).info()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); } } @@ -179,15 +175,11 @@ void testInsertMultiple() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { JsonTestMapper mapper = sqlSession.getMapper(JsonTestMapper.class); - JsonTestRecord record1 = new JsonTestRecord(); - record1.setId(1); - record1.setDescription("Fred"); - record1.setInfo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + JsonTestRecord record1 = new JsonTestRecord(1, "Fred", + "{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - JsonTestRecord record2 = new JsonTestRecord(); - record2.setId(2); - record2.setDescription("Wilma"); - record2.setInfo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + JsonTestRecord record2 = new JsonTestRecord(2, "Wilma", + "{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); MultiRowInsertStatementProvider insertStatement = insertMultiple(record1, record2) .into(jsonTest) @@ -216,8 +208,8 @@ void testInsertMultiple() { List records = mapper.selectMany(selectStatement); assertThat(records).hasSize(2); - assertThat(records.get(0).getInfo()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - assertThat(records.get(1).getInfo()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + assertThat(records.get(0).info()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + assertThat(records.get(1).info()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); } } @@ -226,15 +218,11 @@ void testUpdate() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { JsonTestMapper mapper = sqlSession.getMapper(JsonTestMapper.class); - JsonTestRecord record1 = new JsonTestRecord(); - record1.setId(1); - record1.setDescription("Fred"); - record1.setInfo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + JsonTestRecord record1 = new JsonTestRecord(1, "Fred", + "{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - JsonTestRecord record2 = new JsonTestRecord(); - record2.setId(2); - record2.setDescription("Wilma"); - record2.setInfo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + JsonTestRecord record2 = new JsonTestRecord(2, "Wilma", + "{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); MultiRowInsertStatementProvider insertStatement = insertMultiple(record1, record2) .into(jsonTest) @@ -270,8 +258,8 @@ void testUpdate() { List records = mapper.selectMany(selectStatement); assertThat(records).hasSize(2); - assertThat(records.get(0).getInfo()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - assertThat(records.get(1).getInfo()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 26}"); + assertThat(records.get(0).info()).isEqualTo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + assertThat(records.get(1).info()).isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 26}"); } } @@ -280,15 +268,11 @@ void testDeReference() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { JsonTestMapper mapper = sqlSession.getMapper(JsonTestMapper.class); - JsonTestRecord record1 = new JsonTestRecord(); - record1.setId(1); - record1.setDescription("Fred"); - record1.setInfo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + JsonTestRecord record1 = new JsonTestRecord(1, "Fred", + "{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - JsonTestRecord record2 = new JsonTestRecord(); - record2.setId(2); - record2.setDescription("Wilma"); - record2.setInfo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + JsonTestRecord record2 = new JsonTestRecord(2, "Wilma", + "{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); MultiRowInsertStatementProvider insertStatement = insertMultiple(record1, record2) .into(jsonTest) @@ -316,7 +300,7 @@ void testDeReference() { Optional row = mapper.selectOne(selectStatement); assertThat(row).hasValueSatisfying( r -> - assertThat(r.getInfo()) + assertThat(r.info()) .isEqualTo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}") ); } @@ -327,15 +311,11 @@ void testDereference2() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { JsonTestMapper mapper = sqlSession.getMapper(JsonTestMapper.class); - JsonTestRecord record1 = new JsonTestRecord(); - record1.setId(1); - record1.setDescription("Fred"); - record1.setInfo("{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); + JsonTestRecord record1 = new JsonTestRecord(1, "Fred", + "{\"firstName\": \"Fred\", \"lastName\": \"Flintstone\", \"age\": 30}"); - JsonTestRecord record2 = new JsonTestRecord(); - record2.setId(2); - record2.setDescription("Wilma"); - record2.setInfo("{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); + JsonTestRecord record2 = new JsonTestRecord(2, "Wilma", + "{\"firstName\": \"Wilma\", \"lastName\": \"Flintstone\", \"age\": 25}"); MultiRowInsertStatementProvider insertStatement = insertMultiple(record1, record2) .into(jsonTest) diff --git a/src/test/java/examples/custom_render/JsonTestMapper.java b/src/test/java/examples/custom_render/JsonTestMapper.java index d928c8a11..4b919ea34 100644 --- a/src/test/java/examples/custom_render/JsonTestMapper.java +++ b/src/test/java/examples/custom_render/JsonTestMapper.java @@ -18,9 +18,7 @@ import java.util.List; import java.util.Optional; -import org.apache.ibatis.annotations.Result; -import org.apache.ibatis.annotations.ResultMap; -import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Arg; import org.apache.ibatis.annotations.SelectProvider; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.SqlProviderAdapter; @@ -32,14 +30,14 @@ public interface JsonTestMapper extends CommonDeleteMapper, CommonInsertMapper, CommonSelectMapper, CommonUpdateMapper { @SelectProvider(type = SqlProviderAdapter.class, method = "select") - @Results(id = "JsonTestResult", value = { - @Result(column = "id", property = "id", id = true), - @Result(column = "description", property = "description"), - @Result(column = "info", property = "info") - }) + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "description", javaType = String.class) + @Arg(column = "info", javaType = String.class) List selectMany(SelectStatementProvider selectStatement); @SelectProvider(type = SqlProviderAdapter.class, method = "select") - @ResultMap("JsonTestResult") + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "description", javaType = String.class) + @Arg(column = "info", javaType = String.class) Optional selectOne(SelectStatementProvider selectStatement); } diff --git a/src/test/java/examples/custom_render/JsonTestRecord.java b/src/test/java/examples/custom_render/JsonTestRecord.java index 2d0da5331..6b7090d58 100644 --- a/src/test/java/examples/custom_render/JsonTestRecord.java +++ b/src/test/java/examples/custom_render/JsonTestRecord.java @@ -15,32 +15,4 @@ */ package examples.custom_render; -public class JsonTestRecord { - private int id; - private String description; - private String info; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getInfo() { - return info; - } - - public void setInfo(String info) { - this.info = info; - } -} +public record JsonTestRecord (int id, String description, String info) {} diff --git a/src/test/java/examples/custom_render/package-info.java b/src/test/java/examples/custom_render/package-info.java new file mode 100644 index 000000000..a735b9733 --- /dev/null +++ b/src/test/java/examples/custom_render/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.custom_render; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/emptywhere/EmptyWhereTest.java b/src/test/java/examples/emptywhere/EmptyWhereTest.java index fd699da23..6d6ea5ba7 100644 --- a/src/test/java/examples/emptywhere/EmptyWhereTest.java +++ b/src/test/java/examples/emptywhere/EmptyWhereTest.java @@ -20,10 +20,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mybatis.dynamic.sql.SqlBuilder.*; -import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -41,61 +41,61 @@ import org.mybatis.dynamic.sql.where.render.WhereClauseProvider; class EmptyWhereTest { + private static final String FIRST_NAME = "Fred"; + private static final String LAST_NAME = "Flintstone"; - static List baseVariations() { - String firstName = "Fred"; - String lastName = "Flintstone"; - - Variation v1 = new Variation(firstName, lastName, + static Stream whereVariations() { + Variation v1 = new Variation(FIRST_NAME, LAST_NAME, "where first_name = #{parameters.p1} or last_name = #{parameters.p2}"); - Variation v2 = new Variation(null, lastName, + Variation v2 = new Variation(null, LAST_NAME, "where last_name = #{parameters.p1}"); - Variation v3 = new Variation(firstName, null, + Variation v3 = new Variation(FIRST_NAME, null, "where first_name = #{parameters.p1}"); Variation v4 = new Variation(null, null, ""); - return List.of(v1, v2, v3, v4); - } - - static Stream whereVariations() { - return baseVariations().stream(); + return Stream.of(v1, v2, v3, v4); } static Stream joinWhereVariations() { - List baseVariations = baseVariations(); + Variation v1 = new Variation(FIRST_NAME, LAST_NAME, + "where person.first_name = #{parameters.p1} or person.last_name = #{parameters.p2}"); - baseVariations.get(0).whereClause = - "where person.first_name = #{parameters.p1} or person.last_name = #{parameters.p2}"; - baseVariations.get(1).whereClause = "where person.last_name = #{parameters.p1}"; - baseVariations.get(2).whereClause = "where person.first_name = #{parameters.p1}"; + Variation v2 = new Variation(null, LAST_NAME, + "where person.last_name = #{parameters.p1}"); - return baseVariations.stream(); + Variation v3 = new Variation(FIRST_NAME, null, + "where person.first_name = #{parameters.p1}"); + + Variation v4 = new Variation(null, null, ""); + + return Stream.of(v1, v2, v3, v4); } static Stream updateWhereVariations() { - List baseVariations = baseVariations(); + Variation v1 = new Variation(FIRST_NAME, LAST_NAME, + "where first_name = #{parameters.p2} or last_name = #{parameters.p3}"); - baseVariations.get(0).whereClause = - "where first_name = #{parameters.p2} or last_name = #{parameters.p3}"; - baseVariations.get(1).whereClause ="where last_name = #{parameters.p2}"; - baseVariations.get(2).whereClause = "where first_name = #{parameters.p2}"; + Variation v2 = new Variation(null, LAST_NAME, + "where last_name = #{parameters.p2}"); - return baseVariations.stream(); + Variation v3 = new Variation(FIRST_NAME, null, + "where first_name = #{parameters.p2}"); + + Variation v4 = new Variation(null, null, ""); + + return Stream.of(v1, v2, v3, v4); } @Test void testDeleteThreeConditions() { - String fName = "Fred"; - String lName = "Flintstone"; - DeleteDSL.DeleteWhereBuilder builder = deleteFrom(person) .where(id, isEqualTo(3)); - builder.and(firstName, isEqualTo(fName)); - builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(lName)); + builder.and(firstName, isEqualTo(FIRST_NAME)); + builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(LAST_NAME)); DeleteStatementProvider deleteStatement = builder.build().render(RenderingStrategies.MYBATIS3); @@ -126,15 +126,12 @@ void testDeleteVariations(Variation variation) { @Test void testSelectThreeConditions() { - String fName = "Fred"; - String lName = "Flintstone"; - QueryExpressionDSL.QueryExpressionWhereBuilder builder = select(id, firstName, PersonDynamicSqlSupport.lastName) .from(person) .where(id, isEqualTo(3)); - builder.and(firstName, isEqualTo(fName)); - builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(lName)); + builder.and(firstName, isEqualTo(FIRST_NAME)); + builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(LAST_NAME)); SelectStatementProvider selectStatement = builder.build().render(RenderingStrategies.MYBATIS3); @@ -167,15 +164,12 @@ void testSelectVariations(Variation variation) { @Test void testJoinThreeConditions() { - String fName = "Fred"; - String lName = "Flintstone"; - QueryExpressionDSL.QueryExpressionWhereBuilder builder = select(id, firstName, PersonDynamicSqlSupport.lastName, orderDate) .from(person).join(order).on(person.id, isEqualTo(order.personId)) .where(id, isEqualTo(3)); - builder.and(firstName, isEqualTo(fName)); - builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(lName)); + builder.and(firstName, isEqualTo(FIRST_NAME)); + builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(LAST_NAME)); SelectStatementProvider selectStatement = builder.build().render(RenderingStrategies.MYBATIS3); @@ -212,15 +206,12 @@ void testJoinVariations(Variation variation) { @Test void testUpdateThreeConditions() { - String fName = "Fred"; - String lName = "Flintstone"; - UpdateDSL.UpdateWhereBuilder builder = update(person) .set(id).equalTo(3) .where(id, isEqualTo(3)); - builder.and(firstName, isEqualTo(fName)); - builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(lName)); + builder.and(firstName, isEqualTo(FIRST_NAME)); + builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(LAST_NAME)); UpdateStatementProvider updateStatement = builder.build().render(RenderingStrategies.MYBATIS3); @@ -255,13 +246,10 @@ void testUpdateVariations(Variation variation) { @Test void testWhereThreeConditions() { - String fName = "Fred"; - String lName = "Flintstone"; - WhereDSL.StandaloneWhereFinisher builder = where(id, isEqualTo(3)); - builder.and(firstName, isEqualTo(fName)); - builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(lName)); + builder.and(firstName, isEqualTo(FIRST_NAME)); + builder.and(PersonDynamicSqlSupport.lastName, isEqualTo(LAST_NAME)); Optional whereClause = builder.build().render(RenderingStrategies.MYBATIS3); @@ -294,15 +282,5 @@ void testWhereVariations(Variation variation) { } } - private static class Variation { - String firstName; - String lastName; - String whereClause; - - public Variation(String firstName, String lastName, String whereClause) { - this.firstName = firstName; - this.lastName = lastName; - this.whereClause = whereClause; - } - } + private record Variation (@Nullable String firstName, @Nullable String lastName, String whereClause) {} } diff --git a/src/test/java/examples/emptywhere/OrderDynamicSqlSupport.java b/src/test/java/examples/emptywhere/OrderDynamicSqlSupport.java index 4664e2b21..41cab1031 100644 --- a/src/test/java/examples/emptywhere/OrderDynamicSqlSupport.java +++ b/src/test/java/examples/emptywhere/OrderDynamicSqlSupport.java @@ -22,13 +22,13 @@ public class OrderDynamicSqlSupport { - public static Order order = new Order(); - public static SqlColumn personId = order.personId; - public static SqlColumn orderDate = order.orderDate; + public static final Order order = new Order(); + public static final SqlColumn personId = order.personId; + public static final SqlColumn orderDate = order.orderDate; public static class Order extends SqlTable { - public SqlColumn personId = column("person_id"); - public SqlColumn orderDate = column("order_date"); + public final SqlColumn personId = column("person_id"); + public final SqlColumn orderDate = column("order_date"); public Order() { super("order"); diff --git a/src/test/java/examples/emptywhere/PersonDynamicSqlSupport.java b/src/test/java/examples/emptywhere/PersonDynamicSqlSupport.java index 0a8d791fe..9a7d83a81 100644 --- a/src/test/java/examples/emptywhere/PersonDynamicSqlSupport.java +++ b/src/test/java/examples/emptywhere/PersonDynamicSqlSupport.java @@ -20,15 +20,15 @@ public class PersonDynamicSqlSupport { - public static Person person = new Person(); - public static SqlColumn id = person.id; - public static SqlColumn firstName = person.firstName; - public static SqlColumn lastName = person.lastName; + public static final Person person = new Person(); + public static final SqlColumn id = person.id; + public static final SqlColumn firstName = person.firstName; + public static final SqlColumn lastName = person.lastName; public static class Person extends SqlTable { - public SqlColumn id = column("id"); - public SqlColumn firstName = column("first_name"); - public SqlColumn lastName = column("last_name"); + public final SqlColumn id = column("id"); + public final SqlColumn firstName = column("first_name"); + public final SqlColumn lastName = column("last_name"); public Person() { super("person"); diff --git a/src/test/java/examples/emptywhere/package-info.java b/src/test/java/examples/emptywhere/package-info.java new file mode 100644 index 000000000..89f32f987 --- /dev/null +++ b/src/test/java/examples/emptywhere/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.emptywhere; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/joins/JoinMapper.java b/src/test/java/examples/joins/JoinMapper.java index 0ce4cc42c..66241b7e5 100644 --- a/src/test/java/examples/joins/JoinMapper.java +++ b/src/test/java/examples/joins/JoinMapper.java @@ -17,7 +17,7 @@ import java.util.List; -import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Arg; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.SelectProvider; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; @@ -29,8 +29,8 @@ public interface JoinMapper { List selectMany(SelectStatementProvider selectStatement); @SelectProvider(type=SqlProviderAdapter.class, method="select") - @Result(column="user_id", property="userId") - @Result(column="user_name", property="userName") - @Result(column="parent_id", property="parentId") + @Arg(column="user_id", javaType = Integer.class) + @Arg(column="user_name", javaType = String.class) + @Arg(column="parent_id", javaType = Integer.class) List selectUsers(SelectStatementProvider selectStatement); } diff --git a/src/test/java/examples/joins/JoinMapperTest.java b/src/test/java/examples/joins/JoinMapperTest.java index ace7b2115..1f1c6a27c 100644 --- a/src/test/java/examples/joins/JoinMapperTest.java +++ b/src/test/java/examples/joins/JoinMapperTest.java @@ -98,15 +98,15 @@ void testSingleTableJoin1() { assertThat(orderMaster.getId()).isEqualTo(1); assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); orderMaster = rows.get(1); assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(1); orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); } } @@ -132,15 +132,15 @@ void testSingleTableJoin2() { assertThat(orderMaster.getId()).isEqualTo(1); assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); orderMaster = rows.get(1); assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(1); orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); } } @@ -255,9 +255,9 @@ void testMultipleTableJoinWithWhereClause() { assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); } } @@ -286,9 +286,9 @@ void testMultipleTableJoinWithApplyWhere() { assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); } } @@ -317,7 +317,7 @@ void testMultipleTableJoinWithComplexWhereClause() { assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(1); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); } } @@ -346,15 +346,15 @@ void testMultipleTableJoinWithOrderBy() { assertThat(orderMaster.getId()).isEqualTo(1); assertThat(orderMaster.getDetails()).hasSize(1); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderMaster = rows.get(1); assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(2); orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); } } @@ -385,9 +385,9 @@ void testMultipleTableJoinNoAliasWithOrderBy() { assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); } } @@ -945,9 +945,9 @@ void testSelf() { assertThat(rows).hasSize(1); User row = rows.get(0); - assertThat(row.getUserId()).isEqualTo(2); - assertThat(row.getUserName()).isEqualTo("Barney"); - assertThat(row.getParentId()).isNull(); + assertThat(row.userId()).isEqualTo(2); + assertThat(row.userName()).isEqualTo("Barney"); + assertThat(row.parentId()).isNull(); } } @@ -985,9 +985,9 @@ void testSelfWithNewAlias() { assertThat(rows).hasSize(1); User row = rows.get(0); - assertThat(row.getUserId()).isEqualTo(2); - assertThat(row.getUserName()).isEqualTo("Barney"); - assertThat(row.getParentId()).isNull(); + assertThat(row.userId()).isEqualTo(2); + assertThat(row.userName()).isEqualTo("Barney"); + assertThat(row.parentId()).isNull(); } } @@ -1016,9 +1016,9 @@ void testSelfWithNewAliasAndOverride() { assertThat(rows).hasSize(1); User row = rows.get(0); - assertThat(row.getUserId()).isEqualTo(2); - assertThat(row.getUserName()).isEqualTo("Barney"); - assertThat(row.getParentId()).isNull(); + assertThat(row.userId()).isEqualTo(2); + assertThat(row.userName()).isEqualTo("Barney"); + assertThat(row.parentId()).isNull(); } } diff --git a/src/test/java/examples/joins/JoinSubQueryTest.java b/src/test/java/examples/joins/JoinSubQueryTest.java index 11b4ce192..abf3eaf6f 100644 --- a/src/test/java/examples/joins/JoinSubQueryTest.java +++ b/src/test/java/examples/joins/JoinSubQueryTest.java @@ -97,15 +97,15 @@ void testSingleTableJoin1() { assertThat(orderMaster.getId()).isEqualTo(1); assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); orderMaster = rows.get(1); assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(1); orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); } } @@ -143,9 +143,9 @@ void testMultipleTableJoinWithWhereClause() { assertThat(orderMaster.getId()).isEqualTo(2); assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); } } @@ -180,10 +180,10 @@ void testMultipleTableJoinWithSelectStar() { assertThat(orderMaster.getDetails()).hasSize(2); OrderDetail orderDetail = orderMaster.getDetails().get(0); - assertThat(orderDetail.getLineNumber()).isEqualTo(1); + assertThat(orderDetail.lineNumber()).isEqualTo(1); orderDetail = orderMaster.getDetails().get(1); - assertThat(orderDetail.getLineNumber()).isEqualTo(2); + assertThat(orderDetail.lineNumber()).isEqualTo(2); } } diff --git a/src/test/java/examples/joins/OrderDetail.java b/src/test/java/examples/joins/OrderDetail.java index 6c9cdd8c5..9f9abd4ce 100644 --- a/src/test/java/examples/joins/OrderDetail.java +++ b/src/test/java/examples/joins/OrderDetail.java @@ -15,41 +15,4 @@ */ package examples.joins; -public class OrderDetail { - private Integer orderId; - private Integer lineNumber; - private String description; - private Integer quantity; - - public Integer getOrderId() { - return orderId; - } - - public void setOrderId(Integer orderId) { - this.orderId = orderId; - } - - public Integer getLineNumber() { - return lineNumber; - } - - public void setLineNumber(Integer lineNumber) { - this.lineNumber = lineNumber; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Integer getQuantity() { - return quantity; - } - - public void setQuantity(Integer quantity) { - this.quantity = quantity; - } -} +public record OrderDetail (Integer orderId, Integer lineNumber, String description, Integer quantity) {} diff --git a/src/test/java/examples/joins/User.java b/src/test/java/examples/joins/User.java index e8c242a25..1d9e36795 100644 --- a/src/test/java/examples/joins/User.java +++ b/src/test/java/examples/joins/User.java @@ -15,32 +15,6 @@ */ package examples.joins; -public class User { - private Integer userId; - private String userName; - private Integer parentId; +import org.jspecify.annotations.Nullable; - public Integer getUserId() { - return userId; - } - - public void setUserId(Integer userId) { - this.userId = userId; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public Integer getParentId() { - return parentId; - } - - public void setParentId(Integer parentId) { - this.parentId = parentId; - } -} +public record User (Integer userId, String userName, @Nullable Integer parentId) {} diff --git a/src/test/java/examples/joins/package-info.java b/src/test/java/examples/joins/package-info.java new file mode 100644 index 000000000..a994448fb --- /dev/null +++ b/src/test/java/examples/joins/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.joins; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/mysql/IsLikeEscape.java b/src/test/java/examples/mysql/IsLikeEscape.java index 6b8799abb..418ff7141 100644 --- a/src/test/java/examples/mysql/IsLikeEscape.java +++ b/src/test/java/examples/mysql/IsLikeEscape.java @@ -19,14 +19,12 @@ import java.util.function.Function; import java.util.function.Predicate; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import org.mybatis.dynamic.sql.AbstractSingleValueCondition; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.FragmentAndParameters; -@NullMarked public class IsLikeEscape extends AbstractSingleValueCondition implements AbstractSingleValueCondition.Filterable, AbstractSingleValueCondition.Mappable { private static final IsLikeEscape EMPTY = new IsLikeEscape(-1, null) { diff --git a/src/test/java/examples/mysql/MemberOfCondition.java b/src/test/java/examples/mysql/MemberOfCondition.java index 33b967556..962ad5c38 100644 --- a/src/test/java/examples/mysql/MemberOfCondition.java +++ b/src/test/java/examples/mysql/MemberOfCondition.java @@ -17,10 +17,8 @@ import java.util.Objects; -import org.jspecify.annotations.NullMarked; import org.mybatis.dynamic.sql.AbstractNoValueCondition; -@NullMarked public class MemberOfCondition extends AbstractNoValueCondition { private final String jsonArray; diff --git a/src/test/java/examples/mysql/MemberOfFunction.java b/src/test/java/examples/mysql/MemberOfFunction.java index 1035bf3e0..d41f95f8c 100644 --- a/src/test/java/examples/mysql/MemberOfFunction.java +++ b/src/test/java/examples/mysql/MemberOfFunction.java @@ -17,14 +17,12 @@ import java.util.Objects; -import org.jspecify.annotations.NullMarked; import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractTypeConvertingFunction; import org.mybatis.dynamic.sql.util.FragmentAndParameters; -@NullMarked public class MemberOfFunction extends AbstractTypeConvertingFunction> { private final String jsonArray; diff --git a/src/test/java/examples/mysql/MySQLTest.java b/src/test/java/examples/mysql/MySQLTest.java index 45c403bd7..f9c047f77 100644 --- a/src/test/java/examples/mysql/MySQLTest.java +++ b/src/test/java/examples/mysql/MySQLTest.java @@ -33,7 +33,7 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.render.RenderingStrategies; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; @@ -51,10 +51,10 @@ class MySQLTest { new MySQLContainer<>(TestContainersConfiguration.MYSQL_LATEST) .withInitScript("examples/mariadb/CreateDB.sql"); - private static SqlSessionFactory sqlSessionFactory; + private SqlSessionFactory sqlSessionFactory; - @BeforeAll - static void setup() { + @BeforeEach + void setup() { UnpooledDataSource ds = new UnpooledDataSource(mysql.getDriverClassName(), mysql.getJdbcUrl(), mysql.getUsername(), mysql.getPassword()); Environment environment = new Environment("test", new JdbcTransactionFactory(), ds); diff --git a/src/test/java/examples/mysql/package-info.java b/src/test/java/examples/mysql/package-info.java new file mode 100644 index 000000000..70357075d --- /dev/null +++ b/src/test/java/examples/mysql/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.mysql; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/paging/LimitAndOffsetMapper.java b/src/test/java/examples/paging/LimitAndOffsetMapper.java index 84146d8b9..14bd2d8b0 100644 --- a/src/test/java/examples/paging/LimitAndOffsetMapper.java +++ b/src/test/java/examples/paging/LimitAndOffsetMapper.java @@ -19,8 +19,7 @@ import java.util.List; -import org.apache.ibatis.annotations.Result; -import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Arg; import org.apache.ibatis.annotations.SelectProvider; import org.mybatis.dynamic.sql.select.QueryExpressionDSL; import org.mybatis.dynamic.sql.select.SelectDSL; @@ -32,12 +31,10 @@ public interface LimitAndOffsetMapper { @SelectProvider(type=SqlProviderAdapter.class, method="select") - @Results(id="AnimalDataResult", value={ - @Result(column="id", property="id", id=true), - @Result(column="animal_name", property="animalName"), - @Result(column="brain_weight", property="brainWeight"), - @Result(column="body_weight", property="bodyWeight") - }) + @Arg(column = "id", javaType = int.class, id = true) + @Arg(column = "animal_name", javaType = String.class) + @Arg(column = "brain_weight", javaType = double.class) + @Arg(column = "body_weight", javaType = double.class) List selectMany(SelectStatementProvider selectStatement); default QueryExpressionDSL>> selectWithLimitAndOffset(int limit, int offset) { diff --git a/src/test/java/examples/paging/LimitAndOffsetTest.java b/src/test/java/examples/paging/LimitAndOffsetTest.java index e145568d4..6e8d68ae1 100644 --- a/src/test/java/examples/paging/LimitAndOffsetTest.java +++ b/src/test/java/examples/paging/LimitAndOffsetTest.java @@ -73,7 +73,7 @@ void testLimitAndOffset() { .execute(); assertThat(rows).hasSize(5); - assertThat(rows.get(0).getId()).isEqualTo(4); + assertThat(rows.get(0).id()).isEqualTo(4); } } } diff --git a/src/test/java/examples/paging/package-info.java b/src/test/java/examples/paging/package-info.java new file mode 100644 index 000000000..c8f8f4390 --- /dev/null +++ b/src/test/java/examples/paging/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.paging; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/sharding/package-info.java b/src/test/java/examples/sharding/package-info.java new file mode 100644 index 000000000..8c1f71235 --- /dev/null +++ b/src/test/java/examples/sharding/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.sharding; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/simple/CompoundKeyRow.java b/src/test/java/examples/simple/CompoundKeyRow.java index c710d4b26..dc65b005a 100644 --- a/src/test/java/examples/simple/CompoundKeyRow.java +++ b/src/test/java/examples/simple/CompoundKeyRow.java @@ -15,23 +15,4 @@ */ package examples.simple; -public class CompoundKeyRow { - private Integer id1; - private Integer id2; - - public Integer getId1() { - return id1; - } - - public void setId1(Integer id1) { - this.id1 = id1; - } - - public Integer getId2() { - return id2; - } - - public void setId2(Integer id2) { - this.id2 = id2; - } -} +public record CompoundKeyRow (Integer id1, Integer id2) {} diff --git a/src/test/java/examples/simple/LastName.java b/src/test/java/examples/simple/LastName.java index 1caaef4e2..2a2499e14 100644 --- a/src/test/java/examples/simple/LastName.java +++ b/src/test/java/examples/simple/LastName.java @@ -15,42 +15,4 @@ */ package examples.simple; -public class LastName { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public static LastName of(String name) { - LastName lastName = new LastName(); - lastName.setName(name); - return lastName; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LastName other = (LastName) obj; - if (name == null) { - return other.name == null; - } else return name.equals(other.name); - } -} +public record LastName (String name) {} diff --git a/src/test/java/examples/simple/LastNameTypeHandler.java b/src/test/java/examples/simple/LastNameTypeHandler.java index e8a26486e..de14fcc0d 100644 --- a/src/test/java/examples/simple/LastNameTypeHandler.java +++ b/src/test/java/examples/simple/LastNameTypeHandler.java @@ -22,12 +22,17 @@ import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; +import org.jspecify.annotations.Nullable; public class LastNameTypeHandler implements TypeHandler { @Override - public void setParameter(PreparedStatement ps, int i, LastName parameter, JdbcType jdbcType) throws SQLException { - ps.setString(i, parameter == null ? null : parameter.getName()); + public void setParameter(PreparedStatement ps, int i, @Nullable LastName parameter, JdbcType jdbcType) throws SQLException { + if (parameter == null) { + ps.setNull(i, jdbcType.TYPE_CODE); + } else { + ps.setString(i, parameter.name()); + } } @Override @@ -45,7 +50,7 @@ public LastName getResult(CallableStatement cs, int columnIndex) throws SQLExcep return toLastName(cs.getString(columnIndex)); } - private LastName toLastName(String s) { - return s == null ? null : LastName.of(s); + private @Nullable LastName toLastName(@Nullable String s) { + return s == null ? null : new LastName(s); } } diff --git a/src/test/java/examples/simple/MyBatisMapToRowTest.java b/src/test/java/examples/simple/MyBatisMapToRowTest.java index 473a4cd47..7750195e9 100644 --- a/src/test/java/examples/simple/MyBatisMapToRowTest.java +++ b/src/test/java/examples/simple/MyBatisMapToRowTest.java @@ -30,6 +30,7 @@ import java.sql.DriverManager; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.stream.IntStream; import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; @@ -98,7 +99,7 @@ void testInsertOne() { .orderBy(id1, id2) .build().render(RenderingStrategies.MYBATIS3); - List records = mapper.selectMany(selectStatement, this::mapRow); + List records = mapper.selectMany(selectStatement, rowMapper); assertThat(records).hasSize(1); } } @@ -128,7 +129,7 @@ void testInsertMultiple() { .orderBy(id1, id2) .build().render(RenderingStrategies.MYBATIS3); - List records = mapper.selectMany(selectStatement, this::mapRow); + List records = mapper.selectMany(selectStatement, rowMapper); assertThat(records).hasSize(3); } } @@ -165,15 +166,11 @@ void testInsertBatch() { .orderBy(id1, id2) .build().render(RenderingStrategies.MYBATIS3); - List records = mapper.selectMany(selectStatement, this::mapRow); + List records = mapper.selectMany(selectStatement, rowMapper); assertThat(records).hasSize(3); } } - private CompoundKeyRow mapRow(Map map) { - CompoundKeyRow answer = new CompoundKeyRow(); - answer.setId1((Integer) map.get("ID1")); - answer.setId2((Integer) map.get("ID2")); - return answer; - } + private final Function, CompoundKeyRow> rowMapper = + m -> new CompoundKeyRow((Integer) m.get("ID1"), (Integer) m.get("ID2")); } diff --git a/src/test/java/examples/simple/PersonMapper.java b/src/test/java/examples/simple/PersonMapper.java index dffc66ee4..819b72c3b 100644 --- a/src/test/java/examples/simple/PersonMapper.java +++ b/src/test/java/examples/simple/PersonMapper.java @@ -17,17 +17,17 @@ import static examples.simple.PersonDynamicSqlSupport.*; import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo; +import static org.mybatis.dynamic.sql.SqlBuilder.isEqualToWhenPresent; import java.util.Arrays; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Optional; import java.util.function.UnaryOperator; +import org.apache.ibatis.annotations.Arg; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Result; -import org.apache.ibatis.annotations.ResultMap; -import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.type.JdbcType; import org.mybatis.dynamic.sql.BasicColumn; @@ -56,19 +56,23 @@ public interface PersonMapper extends CommonCountMapper, CommonDeleteMapper, CommonInsertMapper, CommonUpdateMapper { @SelectProvider(type=SqlProviderAdapter.class, method="select") - @Results(id="PersonResult", value= { - @Result(column="A_ID", property="id", jdbcType=JdbcType.INTEGER, id=true), - @Result(column="first_name", property="firstName", jdbcType=JdbcType.VARCHAR), - @Result(column="last_name", property="lastName", jdbcType=JdbcType.VARCHAR, typeHandler=LastNameTypeHandler.class), - @Result(column="birth_date", property="birthDate", jdbcType=JdbcType.DATE), - @Result(column="employed", property="employed", jdbcType=JdbcType.VARCHAR, typeHandler=YesNoTypeHandler.class), - @Result(column="occupation", property="occupation", jdbcType=JdbcType.VARCHAR), - @Result(column="address_id", property="addressId", jdbcType=JdbcType.INTEGER) - }) + @Arg(column="A_ID", jdbcType=JdbcType.INTEGER, id=true, javaType = Integer.class) + @Arg(column="first_name", jdbcType=JdbcType.VARCHAR, javaType = String.class) + @Arg(column="last_name", jdbcType=JdbcType.VARCHAR, typeHandler=LastNameTypeHandler.class, javaType = LastName.class) + @Arg(column="birth_date", jdbcType=JdbcType.DATE, javaType = Date.class) + @Arg(column="employed", jdbcType=JdbcType.VARCHAR, typeHandler=YesNoTypeHandler.class, javaType = Boolean.class) + @Arg(column="occupation", jdbcType=JdbcType.VARCHAR, javaType = String.class) + @Arg(column="address_id", jdbcType=JdbcType.INTEGER, javaType = Integer.class) List selectMany(SelectStatementProvider selectStatement); @SelectProvider(type=SqlProviderAdapter.class, method="select") - @ResultMap("PersonResult") + @Arg(column="A_ID", jdbcType=JdbcType.INTEGER, id=true, javaType = Integer.class) + @Arg(column="first_name", jdbcType=JdbcType.VARCHAR, javaType = String.class) + @Arg(column="last_name", jdbcType=JdbcType.VARCHAR, typeHandler=LastNameTypeHandler.class, javaType = LastName.class) + @Arg(column="birth_date", jdbcType=JdbcType.DATE, javaType = Date.class) + @Arg(column="employed", jdbcType=JdbcType.VARCHAR, typeHandler=YesNoTypeHandler.class, javaType = Boolean.class) + @Arg(column="occupation", jdbcType=JdbcType.VARCHAR, javaType = String.class) + @Arg(column="address_id", jdbcType=JdbcType.INTEGER, javaType = Integer.class) Optional selectOne(SelectStatementProvider selectStatement); BasicColumn[] selectList = @@ -130,13 +134,13 @@ default int insertMultiple(Collection records) { default int insertSelective(PersonRecord row) { return MyBatis3Utils.insert(this::insert, row, person, c -> - c.map(id).toPropertyWhenPresent("id", row::getId) - .map(firstName).toPropertyWhenPresent("firstName", row::getFirstName) - .map(lastName).toPropertyWhenPresent("lastName", row::getLastName) - .map(birthDate).toPropertyWhenPresent("birthDate", row::getBirthDate) - .map(employed).toPropertyWhenPresent("employed", row::getEmployed) - .map(occupation).toPropertyWhenPresent("occupation", row::getOccupation) - .map(addressId).toPropertyWhenPresent("addressId", row::getAddressId) + c.map(id).toPropertyWhenPresent("id", row::id) + .map(firstName).toPropertyWhenPresent("firstName", row::firstName) + .map(lastName).toPropertyWhenPresent("lastName", row::lastName) + .map(birthDate).toPropertyWhenPresent("birthDate", row::birthDate) + .map(employed).toPropertyWhenPresent("employed", row::employed) + .map(occupation).toPropertyWhenPresent("occupation", row::occupation) + .map(addressId).toPropertyWhenPresent("addressId", row::addressId) ); } @@ -164,47 +168,47 @@ default int update(UpdateDSLCompleter completer) { static UpdateDSL updateAllColumns(PersonRecord row, UpdateDSL dsl) { - return dsl.set(id).equalTo(row::getId) - .set(firstName).equalTo(row::getFirstName) - .set(lastName).equalTo(row::getLastName) - .set(birthDate).equalTo(row::getBirthDate) - .set(employed).equalTo(row::getEmployed) - .set(occupation).equalTo(row::getOccupation) - .set(addressId).equalTo(row::getAddressId); + return dsl.set(id).equalToOrNull(row::id) + .set(firstName).equalToOrNull(row::firstName) + .set(lastName).equalToOrNull(row::lastName) + .set(birthDate).equalToOrNull(row::birthDate) + .set(employed).equalToOrNull(row::employed) + .set(occupation).equalToOrNull(row::occupation) + .set(addressId).equalToOrNull(row::addressId); } static UpdateDSL updateSelectiveColumns(PersonRecord row, UpdateDSL dsl) { - return dsl.set(id).equalToWhenPresent(row::getId) - .set(firstName).equalToWhenPresent(row::getFirstName) - .set(lastName).equalToWhenPresent(row::getLastName) - .set(birthDate).equalToWhenPresent(row::getBirthDate) - .set(employed).equalToWhenPresent(row::getEmployed) - .set(occupation).equalToWhenPresent(row::getOccupation) - .set(addressId).equalToWhenPresent(row::getAddressId); + return dsl.set(id).equalToWhenPresent(row::id) + .set(firstName).equalToWhenPresent(row::firstName) + .set(lastName).equalToWhenPresent(row::lastName) + .set(birthDate).equalToWhenPresent(row::birthDate) + .set(employed).equalToWhenPresent(row::employed) + .set(occupation).equalToWhenPresent(row::occupation) + .set(addressId).equalToWhenPresent(row::addressId); } default int updateByPrimaryKey(PersonRecord row) { return update(c -> - c.set(firstName).equalTo(row::getFirstName) - .set(lastName).equalTo(row::getLastName) - .set(birthDate).equalTo(row::getBirthDate) - .set(employed).equalTo(row::getEmployed) - .set(occupation).equalTo(row::getOccupation) - .set(addressId).equalTo(row::getAddressId) - .where(id, isEqualTo(row::getId)) + c.set(firstName).equalToOrNull(row::firstName) + .set(lastName).equalToOrNull(row::lastName) + .set(birthDate).equalToOrNull(row::birthDate) + .set(employed).equalToOrNull(row::employed) + .set(occupation).equalToOrNull(row::occupation) + .set(addressId).equalToOrNull(row::addressId) + .where(id, isEqualToWhenPresent(row::id)) ); } default int updateByPrimaryKeySelective(PersonRecord row) { return update(c -> - c.set(firstName).equalToWhenPresent(row::getFirstName) - .set(lastName).equalToWhenPresent(row::getLastName) - .set(birthDate).equalToWhenPresent(row::getBirthDate) - .set(employed).equalToWhenPresent(row::getEmployed) - .set(occupation).equalToWhenPresent(row::getOccupation) - .set(addressId).equalToWhenPresent(row::getAddressId) - .where(id, isEqualTo(row::getId)) + c.set(firstName).equalToWhenPresent(row::firstName) + .set(lastName).equalToWhenPresent(row::lastName) + .set(birthDate).equalToWhenPresent(row::birthDate) + .set(employed).equalToWhenPresent(row::employed) + .set(occupation).equalToWhenPresent(row::occupation) + .set(addressId).equalToWhenPresent(row::addressId) + .where(id, isEqualToWhenPresent(row::id)) ); } } diff --git a/src/test/java/examples/simple/PersonMapperTest.java b/src/test/java/examples/simple/PersonMapperTest.java index acbda68ad..b02d52c4c 100644 --- a/src/test/java/examples/simple/PersonMapperTest.java +++ b/src/test/java/examples/simple/PersonMapperTest.java @@ -25,6 +25,7 @@ import static examples.simple.PersonDynamicSqlSupport.occupation; import static examples.simple.PersonDynamicSqlSupport.person; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.entry; import static org.mybatis.dynamic.sql.SqlBuilder.*; @@ -32,7 +33,6 @@ import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; -import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; @@ -51,6 +51,7 @@ import org.mybatis.dynamic.sql.SortSpecification; import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter; import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider; +import org.mybatis.dynamic.sql.exception.NonRenderingWhereClauseException; import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider; import org.mybatis.dynamic.sql.render.RenderingStrategies; import org.mybatis.dynamic.sql.select.CountDSLCompleter; @@ -108,7 +109,7 @@ void testSelectEmployed() { .orderBy(id)); assertThat(rows).hasSize(4); - assertThat(rows.get(0).getId()).isEqualTo(1); + assertThat(rows.get(0).id()).isEqualTo(1); } } @@ -122,7 +123,7 @@ void testSelectUnemployed() { .orderBy(id)); assertThat(rows).hasSize(2); - assertThat(rows.get(0).getId()).isEqualTo(3); + assertThat(rows.get(0).id()).isEqualTo(3); } } @@ -179,8 +180,8 @@ void testSelectAll() { List rows = mapper.select(SelectDSLCompleter.allRows()); assertThat(rows).hasSize(6); - assertThat(rows.get(0).getId()).isEqualTo(1); - assertThat(rows.get(5).getId()).isEqualTo(6); + assertThat(rows.get(0).id()).isEqualTo(1); + assertThat(rows.get(5).id()).isEqualTo(6); } } @@ -193,8 +194,8 @@ void testSelectAllOrdered() { .select(SelectDSLCompleter.allRowsOrderedBy(lastName.descending(), firstName.descending())); assertThat(rows).hasSize(6); - assertThat(rows.get(0).getId()).isEqualTo(5); - assertThat(rows.get(5).getId()).isEqualTo(1); + assertThat(rows.get(0).id()).isEqualTo(5); + assertThat(rows.get(5).id()).isEqualTo(1); } } @@ -221,8 +222,8 @@ void testSelectWithTypeHandler() { .orderBy(id)); assertThat(rows).hasSize(2); - assertThat(rows.get(0).getId()).isEqualTo(3); - assertThat(rows.get(1).getId()).isEqualTo(6); + assertThat(rows.get(0).id()).isEqualTo(3); + assertThat(rows.get(1).id()).isEqualTo(6); } } @@ -245,8 +246,14 @@ void testFirstNameIn() { c.where(firstName, isIn("Fred", "Barney"))); assertThat(rows).hasSize(2); - assertThat(rows.get(0).getLastName().getName()).isEqualTo("Flintstone"); - assertThat(rows.get(1).getLastName().getName()).isEqualTo("Rubble"); + assertThat(rows.get(0)) + .isNotNull() + .extracting("lastName").isNotNull() + .extracting("name").isEqualTo("Flintstone"); + assertThat(rows.get(1)) + .isNotNull() + .extracting("lastName").isNotNull() + .extracting("name").isEqualTo("Rubble"); } } @@ -263,8 +270,14 @@ void testOrderByCollection() { ); assertThat(rows).hasSize(2); - assertThat(rows.get(0).getLastName().getName()).isEqualTo("Rubble"); - assertThat(rows.get(1).getLastName().getName()).isEqualTo("Flintstone"); + assertThat(rows.get(0)) + .isNotNull() + .extracting("lastName").isNotNull() + .extracting("name").isEqualTo("Rubble"); + assertThat(rows.get(1)) + .isNotNull() + .extracting("lastName").isNotNull() + .extracting("name").isEqualTo("Flintstone"); } } @@ -318,14 +331,7 @@ void testDeleteByPrimaryKey() { void testInsert() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); int rows = mapper.insert(row); assertThat(rows).isEqualTo(1); @@ -339,7 +345,7 @@ void testGeneralInsert() { int rows = mapper.generalInsert(c -> c.set(id).toValue(100) .set(firstName).toValue("Joe") - .set(lastName).toValue(LastName.of("Jones")) + .set(lastName).toValue(new LastName("Jones")) .set(birthDate).toValue(new Date()) .set(employed).toValue(true) .set(occupation).toValue("Developer") @@ -355,27 +361,10 @@ void testInsertMultiple() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - List records = new ArrayList<>(); - - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); - records.add(row); - - row = new PersonRecord(); - row.setId(101); - row.setFirstName("Sarah"); - row.setLastName(LastName.of("Smith")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Architect"); - row.setAddressId(2); - records.add(row); + List records = List.of( + new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1), + new PersonRecord(101, "Sarah", new LastName("Smith"), new Date(), true, "Architect", 2) + ); int rows = mapper.insertMultiple(records); assertThat(rows).isEqualTo(2); @@ -386,42 +375,39 @@ void testInsertMultiple() { void testInsertSelective() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(false); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), false, null, 1); int rows = mapper.insertSelective(row); assertThat(rows).isEqualTo(1); } } + @Test + void testUpdateByPrimaryKeyNullKeyShouldThrowException() { + try (SqlSession session = sqlSessionFactory.openSession()) { + PersonMapper mapper = session.getMapper(PersonMapper.class); + PersonRecord row = new PersonRecord(null, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); + + assertThatExceptionOfType(NonRenderingWhereClauseException.class).isThrownBy(() -> mapper.updateByPrimaryKey(row)); + } + } + @Test void testUpdateByPrimaryKey() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); int rows = mapper.insert(row); assertThat(rows).isEqualTo(1); - row.setOccupation("Programmer"); + row = row.withOccupation("Programmer"); rows = mapper.updateByPrimaryKey(row); assertThat(rows).isEqualTo(1); Optional newRecord = mapper.selectByPrimaryKey(100); assertThat(newRecord).hasValueSatisfying(r -> - assertThat(r.getOccupation()).isEqualTo("Programmer")); + assertThat(r.occupation()).isEqualTo("Programmer")); } } @@ -429,28 +415,19 @@ void testUpdateByPrimaryKey() { void testUpdateByPrimaryKeySelective() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); int rows = mapper.insert(row); assertThat(rows).isEqualTo(1); - PersonRecord updateRecord = new PersonRecord(); - updateRecord.setId(100); - updateRecord.setOccupation("Programmer"); + PersonRecord updateRecord = new PersonRecord(100, null, null, null, null, "Programmer", null); rows = mapper.updateByPrimaryKeySelective(updateRecord); assertThat(rows).isEqualTo(1); Optional newRecord = mapper.selectByPrimaryKey(100); assertThat(newRecord).hasValueSatisfying(r -> { - assertThat(r.getOccupation()).isEqualTo("Programmer"); - assertThat(r.getFirstName()).isEqualTo("Joe"); + assertThat(r.occupation()).isEqualTo("Programmer"); + assertThat(r.firstName()).isEqualTo("Joe"); }); } } @@ -459,22 +436,15 @@ void testUpdateByPrimaryKeySelective() { void testUpdate() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); int rows = mapper.insert(row); assertThat(rows).isEqualTo(1); - row.setOccupation("Programmer"); + PersonRecord updateRow = row.withOccupation("Programmer"); rows = mapper.update(c -> - PersonMapper.updateAllColumns(row, c) + PersonMapper.updateAllColumns(updateRow, c) .where(id, isEqualTo(100)) .and(firstName, isEqualTo("Joe"))); @@ -482,7 +452,7 @@ void testUpdate() { Optional newRecord = mapper.selectByPrimaryKey(100); assertThat(newRecord).hasValueSatisfying(r -> - assertThat(r.getOccupation()).isEqualTo("Programmer")); + assertThat(r.occupation()).isEqualTo("Programmer")); } } @@ -490,14 +460,7 @@ void testUpdate() { void testUpdateOneField() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); int rows = mapper.insert(row); assertThat(rows).isEqualTo(1); @@ -510,7 +473,7 @@ void testUpdateOneField() { Optional newRecord = mapper.selectByPrimaryKey(100); assertThat(newRecord).hasValueSatisfying(r -> - assertThat(r.getOccupation()).isEqualTo("Programmer")); + assertThat(r.occupation()).isEqualTo("Programmer")); } } @@ -518,20 +481,12 @@ void testUpdateOneField() { void testUpdateAll() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); int rows = mapper.insert(row); assertThat(rows).isEqualTo(1); - PersonRecord updateRecord = new PersonRecord(); - updateRecord.setOccupation("Programmer"); + PersonRecord updateRecord = new PersonRecord(null, null, null, null, null, "Programmer", null); rows = mapper.update(c -> PersonMapper.updateSelectiveColumns(updateRecord, c)); @@ -539,7 +494,7 @@ void testUpdateAll() { Optional newRecord = mapper.selectByPrimaryKey(100); assertThat(newRecord).hasValueSatisfying(r -> - assertThat(r.getOccupation()).isEqualTo("Programmer")); + assertThat(r.occupation()).isEqualTo("Programmer")); } } @@ -547,20 +502,12 @@ void testUpdateAll() { void testUpdateSelective() { try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); int rows = mapper.insert(row); assertThat(rows).isEqualTo(1); - PersonRecord updateRecord = new PersonRecord(); - updateRecord.setOccupation("Programmer"); + PersonRecord updateRecord = new PersonRecord(null, null, null, null, null, "Programmer", null); rows = mapper.update(c -> PersonMapper.updateSelectiveColumns(updateRecord, c) .where(id, isEqualTo(100))); @@ -569,7 +516,7 @@ void testUpdateSelective() { Optional newRecord = mapper.selectByPrimaryKey(100); assertThat(newRecord).hasValueSatisfying(r -> - assertThat(r.getOccupation()).isEqualTo("Programmer")); + assertThat(r.occupation()).isEqualTo("Programmer")); } } @@ -620,11 +567,11 @@ void testTypeHandledLike() { PersonMapper mapper = session.getMapper(PersonMapper.class); List rows = mapper.select(c -> - c.where(lastName, isLike(LastName.of("Fl%"))) + c.where(lastName, isLike(new LastName("Fl%"))) .orderBy(id)); assertThat(rows).hasSize(3); - assertThat(rows.get(0).getFirstName()).isEqualTo("Fred"); + assertThat(rows.get(0).firstName()).isEqualTo("Fred"); } } @@ -634,11 +581,11 @@ void testTypeHandledNotLike() { PersonMapper mapper = session.getMapper(PersonMapper.class); List rows = mapper.select(c -> - c.where(lastName, isNotLike(LastName.of("Fl%"))) + c.where(lastName, isNotLike(new LastName("Fl%"))) .orderBy(id)); assertThat(rows).hasSize(3); - assertThat(rows.get(0).getFirstName()).isEqualTo("Barney"); + assertThat(rows.get(0).firstName()).isEqualTo("Barney"); } } @@ -654,7 +601,7 @@ void testJoinAllRows() { assertThat(records.get(0).getId()).isEqualTo(1); assertThat(records.get(0).getEmployed()).isTrue(); assertThat(records.get(0).getFirstName()).isEqualTo("Fred"); - assertThat(records.get(0).getLastName()).isEqualTo(LastName.of("Flintstone")); + assertThat(records.get(0).getLastName()).isEqualTo(new LastName("Flintstone")); assertThat(records.get(0).getOccupation()).isEqualTo("Brontosaurus Operator"); assertThat(records.get(0).getBirthDate()).isNotNull(); assertThat(records.get(0).getAddress().getId()).isEqualTo(1); @@ -677,7 +624,7 @@ void testJoinOneRow() { assertThat(records.get(0).getId()).isEqualTo(1); assertThat(records.get(0).getEmployed()).isTrue(); assertThat(records.get(0).getFirstName()).isEqualTo("Fred"); - assertThat(records.get(0).getLastName()).isEqualTo(LastName.of("Flintstone")); + assertThat(records.get(0).getLastName()).isEqualTo(new LastName("Flintstone")); assertThat(records.get(0).getOccupation()).isEqualTo("Brontosaurus Operator"); assertThat(records.get(0).getBirthDate()).isNotNull(); assertThat(records.get(0).getAddress().getId()).isEqualTo(1); @@ -697,7 +644,7 @@ void testJoinPrimaryKey() { assertThat(r.getId()).isEqualTo(1); assertThat(r.getEmployed()).isTrue(); assertThat(r.getFirstName()).isEqualTo("Fred"); - assertThat(r.getLastName()).isEqualTo(LastName.of("Flintstone")); + assertThat(r.getLastName()).isEqualTo(new LastName("Flintstone")); assertThat(r.getOccupation()).isEqualTo("Brontosaurus Operator"); assertThat(r.getBirthDate()).isNotNull(); assertThat(r.getAddress().getId()).isEqualTo(1); @@ -807,8 +754,8 @@ void testMultiSelectWithUnion() { List records = mapper.selectMany(selectStatement); assertThat(records).hasSize(2); - assertThat(records.get(0).getId()).isEqualTo(1); - assertThat(records.get(1).getId()).isEqualTo(6); + assertThat(records.get(0).id()).isEqualTo(1); + assertThat(records.get(1).id()).isEqualTo(6); } } @@ -852,8 +799,8 @@ void testMultiSelectWithUnionAll() { List records = mapper.selectMany(selectStatement); assertThat(records).hasSize(2); - assertThat(records.get(0).getId()).isEqualTo(1); - assertThat(records.get(1).getId()).isEqualTo(6); + assertThat(records.get(0).id()).isEqualTo(1); + assertThat(records.get(1).id()).isEqualTo(6); } } diff --git a/src/test/java/examples/simple/PersonRecord.java b/src/test/java/examples/simple/PersonRecord.java index bb7702cc1..10a9d9edf 100644 --- a/src/test/java/examples/simple/PersonRecord.java +++ b/src/test/java/examples/simple/PersonRecord.java @@ -15,70 +15,14 @@ */ package examples.simple; -import java.util.Date; - -public class PersonRecord { - private Integer id; - private String firstName; - private LastName lastName; - private Date birthDate; - private Boolean employed; - private String occupation; - private Integer addressId; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public LastName getLastName() { - return lastName; - } - - public void setLastName(LastName lastName) { - this.lastName = lastName; - } +import org.jspecify.annotations.Nullable; - public Date getBirthDate() { - return birthDate; - } - - public void setBirthDate(Date birthDate) { - this.birthDate = birthDate; - } - - public String getOccupation() { - return occupation; - } - - public void setOccupation(String occupation) { - this.occupation = occupation; - } - - public Boolean getEmployed() { - return employed; - } - - public void setEmployed(Boolean employed) { - this.employed = employed; - } - - public Integer getAddressId() { - return addressId; - } +import java.util.Date; - public void setAddressId(Integer addressId) { - this.addressId = addressId; +public record PersonRecord (@Nullable Integer id, @Nullable String firstName, @Nullable LastName lastName, + @Nullable Date birthDate, @Nullable Boolean employed, @Nullable String occupation, + @Nullable Integer addressId) { + public PersonRecord withOccupation(String occupation) { + return new PersonRecord(id, firstName, lastName, birthDate, employed, occupation, addressId); } } diff --git a/src/test/java/examples/simple/package-info.java b/src/test/java/examples/simple/package-info.java new file mode 100644 index 000000000..79a124103 --- /dev/null +++ b/src/test/java/examples/simple/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.simple; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/spring/AddressRecord.java b/src/test/java/examples/spring/AddressRecord.java index a8f56e426..3987285ab 100644 --- a/src/test/java/examples/spring/AddressRecord.java +++ b/src/test/java/examples/spring/AddressRecord.java @@ -15,41 +15,4 @@ */ package examples.spring; -public class AddressRecord { - private Integer id; - private String streetAddress; - private String city; - private String state; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getStreetAddress() { - return streetAddress; - } - - public void setStreetAddress(String streetAddress) { - this.streetAddress = streetAddress; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } -} +public record AddressRecord (Integer id, String streetAddress, String city, String state) { } diff --git a/src/test/java/examples/spring/CompoundKeyRow.java b/src/test/java/examples/spring/CompoundKeyRow.java index ea7162e04..d9422b447 100644 --- a/src/test/java/examples/spring/CompoundKeyRow.java +++ b/src/test/java/examples/spring/CompoundKeyRow.java @@ -15,23 +15,4 @@ */ package examples.spring; -public class CompoundKeyRow { - private Integer id1; - private Integer id2; - - public Integer getId1() { - return id1; - } - - public void setId1(Integer id1) { - this.id1 = id1; - } - - public Integer getId2() { - return id2; - } - - public void setId2(Integer id2) { - this.id2 = id2; - } -} +public record CompoundKeyRow (Integer id1, Integer id2) {} diff --git a/src/test/java/examples/spring/LastName.java b/src/test/java/examples/spring/LastName.java index 2bda4c7cc..e6e9d93dd 100644 --- a/src/test/java/examples/spring/LastName.java +++ b/src/test/java/examples/spring/LastName.java @@ -15,42 +15,6 @@ */ package examples.spring; -public class LastName { - private String name; +import org.jspecify.annotations.Nullable; - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public static LastName of(String name) { - LastName lastName = new LastName(); - lastName.setName(name); - return lastName; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LastName other = (LastName) obj; - if (name == null) { - return other.name == null; - } else return name.equals(other.name); - } -} +public record LastName(@Nullable String name) { } diff --git a/src/test/java/examples/spring/LastNameParameterConverter.java b/src/test/java/examples/spring/LastNameParameterConverter.java index e8d57d4cd..413aea7cb 100644 --- a/src/test/java/examples/spring/LastNameParameterConverter.java +++ b/src/test/java/examples/spring/LastNameParameterConverter.java @@ -15,20 +15,18 @@ */ package examples.spring; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import org.mybatis.dynamic.sql.ParameterTypeConverter; import org.springframework.core.convert.converter.Converter; -@NullMarked public class LastNameParameterConverter implements ParameterTypeConverter, Converter { @Override public @Nullable String convert(LastName source) { - if ("Slate".equals(source.getName())) { + if ("Slate".equals(source.name())) { return null; } else { - return source.getName(); + return source.name(); } } } diff --git a/src/test/java/examples/spring/PersonRecord.java b/src/test/java/examples/spring/PersonRecord.java index 138f853d1..73417e5c6 100644 --- a/src/test/java/examples/spring/PersonRecord.java +++ b/src/test/java/examples/spring/PersonRecord.java @@ -15,78 +15,23 @@ */ package examples.spring; -import java.util.Date; - -public class PersonRecord { - private Integer id; - private String firstName; - private LastName lastName; - private Date birthDate; - private Boolean employed; - private String occupation; - private Integer addressId; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public LastName getLastName() { - return lastName; - } - - public String getLastNameAsString() { - return lastName == null ? null : lastName.getName(); - } +import org.jspecify.annotations.Nullable; - public void setLastName(LastName lastName) { - this.lastName = lastName; - } - - public Date getBirthDate() { - return birthDate; - } - - public void setBirthDate(Date birthDate) { - this.birthDate = birthDate; - } - - public String getOccupation() { - return occupation; - } +import java.util.Date; - public void setOccupation(String occupation) { - this.occupation = occupation; - } +public record PersonRecord (Integer id, @Nullable String firstName, @Nullable LastName lastName, + @Nullable Date birthDate, @Nullable Boolean employed, + @Nullable String occupation, @Nullable Integer addressId) { - public Boolean getEmployed() { - return employed; + public @Nullable String getLastNameAsString() { + return lastName == null ? null : lastName.name(); } public String getEmployedAsString() { return employed == null ? "No" : employed ? "Yes" : "No"; } - public void setEmployed(Boolean employed) { - this.employed = employed; - } - - public Integer getAddressId() { - return addressId; - } - - public void setAddressId(Integer addressId) { - this.addressId = addressId; + public PersonRecord withOccupation(String occupation) { + return new PersonRecord(id, firstName, lastName, birthDate, employed, occupation, addressId); } } diff --git a/src/test/java/examples/spring/PersonTemplateTest.java b/src/test/java/examples/spring/PersonTemplateTest.java index 8376dcef7..b92c03a50 100644 --- a/src/test/java/examples/spring/PersonTemplateTest.java +++ b/src/test/java/examples/spring/PersonTemplateTest.java @@ -20,7 +20,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mybatis.dynamic.sql.SqlBuilder.*; -import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; @@ -38,7 +37,7 @@ import org.mybatis.dynamic.sql.util.Buildable; import org.mybatis.dynamic.sql.util.spring.NamedParameterJdbcTemplateExtensions; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.DataClassRowMapper; import org.springframework.jdbc.core.RowMapper; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.springframework.transaction.annotation.Transactional; @@ -70,8 +69,8 @@ void testSelectAll() { List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(6); - assertThat(rows.get(0).getId()).isEqualTo(1); - assertThat(rows.get(5).getId()).isEqualTo(6); + assertThat(rows.get(0).id()).isEqualTo(1); + assertThat(rows.get(5).id()).isEqualTo(6); } @@ -84,8 +83,8 @@ void testSelectAllOrdered() { List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(6); - assertThat(rows.get(0).getId()).isEqualTo(5); - assertThat(rows.get(5).getId()).isEqualTo(1); + assertThat(rows.get(0).id()).isEqualTo(5); + assertThat(rows.get(5).id()).isEqualTo(1); } @@ -151,36 +150,36 @@ void testSelectWithTypeHandler() { List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(2); - assertThat(rows.get(0).getId()).isEqualTo(3); - assertThat(rows.get(1).getId()).isEqualTo(6); + assertThat(rows.get(0).id()).isEqualTo(3); + assertThat(rows.get(1).id()).isEqualTo(6); } @Test void testSelectBetweenWithTypeHandler() { Buildable selectStatement = select(id, firstName, lastName, birthDate, employed, occupation, addressId) .from(person) - .where(lastName, isBetween(LastName.of("Adams")).and(LastName.of("Jones"))) + .where(lastName, isBetween(new LastName("Adams")).and(new LastName("Jones"))) .orderBy(id); List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(3); - assertThat(rows.get(0).getId()).isEqualTo(1); - assertThat(rows.get(1).getId()).isEqualTo(2); + assertThat(rows.get(0).id()).isEqualTo(1); + assertThat(rows.get(1).id()).isEqualTo(2); } @Test void testSelectListWithTypeHandler() { Buildable selectStatement = select(id, firstName, lastName, birthDate, employed, occupation, addressId) .from(person) - .where(lastName, isIn(LastName.of("Flintstone"), LastName.of("Rubble"))) + .where(lastName, isIn(new LastName("Flintstone"), new LastName("Rubble"))) .orderBy(id); List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(6); - assertThat(rows.get(0).getId()).isEqualTo(1); - assertThat(rows.get(1).getId()).isEqualTo(2); + assertThat(rows.get(0).id()).isEqualTo(1); + assertThat(rows.get(1).id()).isEqualTo(2); } @Test @@ -203,8 +202,15 @@ void testFirstNameIn() { List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(2); - assertThat(rows.get(0).getLastName().getName()).isEqualTo("Flintstone"); - assertThat(rows.get(1).getLastName().getName()).isEqualTo("Rubble"); + + assertThat(rows).satisfiesExactly( + person1 -> assertThat(person1).isNotNull() + .extracting("lastName").isNotNull() + .extracting("name").isEqualTo("Flintstone"), + person2 -> assertThat(person2).isNotNull() + .extracting("lastName").isNotNull() + .extracting("name").isEqualTo("Rubble") + ); } @Test @@ -238,14 +244,7 @@ void testDeleteByPrimaryKey() { @Test void testInsert() { - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); Buildable> insertStatement = insert(row).into(person) .map(id).toProperty("id") @@ -266,7 +265,7 @@ void testGeneralInsert() { Buildable insertStatement = insertInto(person) .set(id).toValue(100) .set(firstName).toValue("Joe") - .set(lastName).toValue(LastName.of("Jones")) + .set(lastName).toValue(new LastName("Jones")) .set(birthDate).toValue(new Date()) .set(employed).toValue(true) .set(occupation).toValue("Developer") @@ -280,27 +279,9 @@ void testGeneralInsert() { @Test void testInsertMultiple() { - List records = new ArrayList<>(); - - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); - records.add(row); - - row = new PersonRecord(); - row.setId(101); - row.setFirstName("Sarah"); - row.setLastName(LastName.of("Smith")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Architect"); - row.setAddressId(2); - records.add(row); + List records = List.of( + new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1), + new PersonRecord(101, "Sarah", new LastName("Smith"), new Date(), true, "Architect", 2)); Buildable> insertStatement = insertMultiple(records).into(person) .map(id).toProperty("id") @@ -319,27 +300,9 @@ void testInsertMultiple() { @Test void testInsertBatch() { - List records = new ArrayList<>(); - - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); - records.add(row); - - row = new PersonRecord(); - row.setId(101); - row.setFirstName("Sarah"); - row.setLastName(LastName.of("Smith")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Architect"); - row.setAddressId(2); - records.add(row); + List records = List.of( + new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1), + new PersonRecord(101, "Sarah", new LastName("Smith"), new Date(), true, "Architect", 2)); Buildable> insertStatement = insertBatch(records).into(person) .map(id).toProperty("id") @@ -359,22 +322,16 @@ void testInsertBatch() { @Test void testInsertSelective() { - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(false); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), false, null, 1); Buildable> insertStatement = insert(row).into(person) - .map(id).toPropertyWhenPresent("id", row::getId) - .map(firstName).toPropertyWhenPresent("firstName", row::getFirstName) + .map(id).toPropertyWhenPresent("id", row::id) + .map(firstName).toPropertyWhenPresent("firstName", row::firstName) .map(lastName).toPropertyWhenPresent("lastNameAsString", row::getLastNameAsString) - .map(birthDate).toPropertyWhenPresent("birthDate", row::getBirthDate) + .map(birthDate).toPropertyWhenPresent("birthDate", row::birthDate) .map(employed).toPropertyWhenPresent("employedAsString", row::getEmployedAsString) - .map(occupation).toPropertyWhenPresent("occupation", row::getOccupation) - .map(addressId).toPropertyWhenPresent("addressId", row::getAddressId); + .map(occupation).toPropertyWhenPresent("occupation", row::occupation) + .map(addressId).toPropertyWhenPresent("addressId", row::addressId); int rows = template.insert(insertStatement); @@ -387,7 +344,7 @@ void testGeneralInsertWhenTypeConverterReturnsNull() { GeneralInsertStatementProvider insertStatement = insertInto(person) .set(id).toValue(100) .set(firstName).toValue("Joe") - .set(lastName).toValueWhenPresent(LastName.of("Slate")) + .set(lastName).toValueWhenPresent(new LastName("Slate")) .set(birthDate).toValue(new Date()) .set(employed).toValue(true) .set(occupation).toValue("Quarry Owner") @@ -404,7 +361,9 @@ void testGeneralInsertWhenTypeConverterReturnsNull() { .from(person) .where(id, isEqualTo(100)); Optional newRecord = template.selectOne(selectStatement, personRowMapper); - assertThat(newRecord).hasValueSatisfying(r -> assertThat(r.getLastName().getName()).isNull()); + assertThat(newRecord).hasValueSatisfying( + r -> assertThat(r).isNotNull().extracting("lastName").isNotNull().extracting("name").isNull() + ); } @Test @@ -413,7 +372,7 @@ void testUpdateByPrimaryKey() { Buildable insertStatement = insertInto(person) .set(id).toValue(100) .set(firstName).toValue("Joe") - .set(lastName).toValue(LastName.of("Jones")) + .set(lastName).toValue(new LastName("Jones")) .set(birthDate).toValue(new Date()) .set(employed).toValue(true) .set(occupation).toValue("Developer") @@ -433,7 +392,7 @@ void testUpdateByPrimaryKey() { .from(person) .where(id, isEqualTo(100)); Optional newRecord = template.selectOne(selectStatement, personRowMapper); - assertThat(newRecord).hasValueSatisfying(r -> assertThat(r.getOccupation()).isEqualTo("Programmer")); + assertThat(newRecord).hasValueSatisfying(r -> assertThat(r.occupation()).isEqualTo("Programmer")); } @Test @@ -442,7 +401,7 @@ void testUpdateByPrimaryKeyWithTypeHandler() { Buildable insertStatement = insertInto(person) .set(id).toValue(100) .set(firstName).toValue("Joe") - .set(lastName).toValue(LastName.of("Jones")) + .set(lastName).toValue(new LastName("Jones")) .set(birthDate).toValue(new Date()) .set(employed).toValue(true) .set(occupation).toValue("Developer") @@ -452,7 +411,7 @@ void testUpdateByPrimaryKeyWithTypeHandler() { assertThat(rows).isEqualTo(1); Buildable updateStatement = update(person) - .set(lastName).equalTo(LastName.of("Smith")) + .set(lastName).equalTo(new LastName("Smith")) .where(id, isEqualTo(100)); rows = template.update(updateStatement); @@ -462,8 +421,10 @@ void testUpdateByPrimaryKeyWithTypeHandler() { .from(person) .where(id, isEqualTo(100)); Optional newRecord = template.selectOne(selectStatement, personRowMapper); - assertThat(newRecord).hasValueSatisfying(r -> - assertThat(r.getLastName().getName()).isEqualTo("Smith")); + assertThat(newRecord).hasValueSatisfying(r -> assertThat(r).isNotNull() + .extracting("lastName").isNotNull() + .extracting("name").isEqualTo("Smith") + ); } @Test @@ -471,7 +432,7 @@ void testUpdateByPrimaryKeySelective() { Buildable insertStatement = insertInto(person) .set(id).toValue(100) .set(firstName).toValue("Joe") - .set(lastName).toValue(LastName.of("Jones")) + .set(lastName).toValue(new LastName("Jones")) .set(birthDate).toValue(new Date()) .set(employed).toValue(true) .set(occupation).toValue("Developer") @@ -480,18 +441,16 @@ void testUpdateByPrimaryKeySelective() { int rows = template.generalInsert(insertStatement); assertThat(rows).isEqualTo(1); - PersonRecord updateRecord = new PersonRecord(); - updateRecord.setId(100); - updateRecord.setOccupation("Programmer"); + PersonRecord updateRecord = new PersonRecord(100, null, null, null, null, "Programmer", null); Buildable updateStatement = update(person) - .set(firstName).equalToWhenPresent(updateRecord::getFirstName) - .set(lastName).equalToWhenPresent(updateRecord::getLastName) - .set(birthDate).equalToWhenPresent(updateRecord::getBirthDate) - .set(employed).equalToWhenPresent(updateRecord::getEmployed) - .set(occupation).equalToWhenPresent(updateRecord::getOccupation) - .set(addressId).equalToWhenPresent(updateRecord::getAddressId) - .where(id, isEqualTo(updateRecord::getId)); + .set(firstName).equalToWhenPresent(updateRecord::firstName) + .set(lastName).equalToWhenPresent(updateRecord::lastName) + .set(birthDate).equalToWhenPresent(updateRecord::birthDate) + .set(employed).equalToWhenPresent(updateRecord::employed) + .set(occupation).equalToWhenPresent(updateRecord::occupation) + .set(addressId).equalToWhenPresent(updateRecord::addressId) + .where(id, isEqualTo(updateRecord::id)); rows = template.update(updateStatement); assertThat(rows).isEqualTo(1); @@ -501,21 +460,14 @@ void testUpdateByPrimaryKeySelective() { .where(id, isEqualTo(100)); Optional newRecord = template.selectOne(selectStatement, personRowMapper); assertThat(newRecord).hasValueSatisfying(r -> { - assertThat(r.getOccupation()).isEqualTo("Programmer"); - assertThat(r.getFirstName()).isEqualTo("Joe"); + assertThat(r.occupation()).isEqualTo("Programmer"); + assertThat(r.firstName()).isEqualTo("Joe"); }); } @Test void testUpdate() { - PersonRecord row = new PersonRecord(); - row.setId(100); - row.setFirstName("Joe"); - row.setLastName(LastName.of("Jones")); - row.setBirthDate(new Date()); - row.setEmployed(true); - row.setOccupation("Developer"); - row.setAddressId(1); + PersonRecord row = new PersonRecord(100, "Joe", new LastName("Jones"), new Date(), true, "Developer", 1); Buildable> insertStatement = insert(row).into(person) .map(id).toProperty("id") @@ -529,16 +481,16 @@ void testUpdate() { int rows = template.insert(insertStatement); assertThat(rows).isEqualTo(1); - row.setOccupation("Programmer"); + row = row.withOccupation("Programmer"); Buildable updateStatement = update(person) - .set(firstName).equalTo(row::getFirstName) - .set(lastName).equalTo(row::getLastName) - .set(birthDate).equalTo(row::getBirthDate) - .set(employed).equalTo(row::getEmployed) - .set(occupation).equalTo(row::getOccupation) - .set(addressId).equalTo(row::getAddressId) - .where(id, isEqualTo(row::getId)); + .set(firstName).equalToWhenPresent(row::firstName) + .set(lastName).equalToWhenPresent(row::lastName) + .set(birthDate).equalToWhenPresent(row::birthDate) + .set(employed).equalToWhenPresent(row::employed) + .set(occupation).equalToWhenPresent(row::occupation) + .set(addressId).equalToWhenPresent(row::addressId) + .where(id, isEqualTo(row::id)); rows = template.update(updateStatement); assertThat(rows).isEqualTo(1); @@ -548,8 +500,8 @@ void testUpdate() { .where(id, isEqualTo(100)); Optional newRecord = template.selectOne(selectStatement, personRowMapper); assertThat(newRecord).hasValueSatisfying(r -> { - assertThat(r.getOccupation()).isEqualTo("Programmer"); - assertThat(r.getFirstName()).isEqualTo("Joe"); + assertThat(r.occupation()).isEqualTo("Programmer"); + assertThat(r.firstName()).isEqualTo("Joe"); }); } @@ -558,7 +510,7 @@ void testUpdateAll() { Buildable insertStatement = insertInto(person) .set(id).toValue(100) .set(firstName).toValue("Joe") - .set(lastName).toValue(LastName.of("Jones")) + .set(lastName).toValue(new LastName("Jones")) .set(birthDate).toValue(new Date()) .set(employed).toValue(true) .set(occupation).toValue("Developer") @@ -578,7 +530,7 @@ void testUpdateAll() { .where(id, isEqualTo(100)); Optional newRecord = template.selectOne(selectStatement, personRowMapper); - assertThat(newRecord).hasValueSatisfying(r -> assertThat(r.getOccupation()).isEqualTo("Programmer")); + assertThat(newRecord).hasValueSatisfying(r -> assertThat(r.occupation()).isEqualTo("Programmer")); } @Test @@ -618,25 +570,25 @@ void testCountDistinctLastName() { void testTypeHandledLike() { Buildable selectStatement = select(id, firstName, lastName, birthDate, employed, occupation, addressId) .from(person) - .where(lastName, isLike(LastName.of("Fl%"))) + .where(lastName, isLike(new LastName("Fl%"))) .orderBy(id); List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(3); - assertThat(rows.get(0).getFirstName()).isEqualTo("Fred"); + assertThat(rows.get(0).firstName()).isEqualTo("Fred"); } @Test void testTypeHandledNotLike() { Buildable selectStatement = select(id, firstName, lastName, birthDate, employed, occupation, addressId) .from(person) - .where(lastName, isNotLike(LastName.of("Fl%"))) + .where(lastName, isNotLike(new LastName("Fl%"))) .orderBy(id); List rows = template.selectList(selectStatement, personRowMapper); assertThat(rows).hasSize(3); - assertThat(rows.get(0).getFirstName()).isEqualTo("Barney"); + assertThat(rows.get(0).firstName()).isEqualTo("Barney"); } @Test @@ -646,14 +598,15 @@ void testAutoMapping() { .from(address) .orderBy(address.id); + List records = template.selectList(selectStatement, - BeanPropertyRowMapper.newInstance(AddressRecord.class)); + DataClassRowMapper.newInstance(AddressRecord.class)); assertThat(records).hasSize(2); - assertThat(records.get(0).getId()).isEqualTo(1); - assertThat(records.get(0).getStreetAddress()).isEqualTo("123 Main Street"); - assertThat(records.get(0).getCity()).isEqualTo("Bedrock"); - assertThat(records.get(0).getState()).isEqualTo("IN"); + assertThat(records.get(0).id()).isEqualTo(1); + assertThat(records.get(0).streetAddress()).isEqualTo("123 Main Street"); + assertThat(records.get(0).city()).isEqualTo("Bedrock"); + assertThat(records.get(0).state()).isEqualTo("IN"); } @Test @@ -667,16 +620,16 @@ void testJoinAllRows() { List records = template.selectList(selectStatement, personWithAddressRowMapper); assertThat(records).hasSize(6); - assertThat(records.get(0).getId()).isEqualTo(1); - assertThat(records.get(0).getEmployed()).isTrue(); - assertThat(records.get(0).getFirstName()).isEqualTo("Fred"); - assertThat(records.get(0).getLastName()).isEqualTo(LastName.of("Flintstone")); - assertThat(records.get(0).getOccupation()).isEqualTo("Brontosaurus Operator"); - assertThat(records.get(0).getBirthDate()).isNotNull(); - assertThat(records.get(0).getAddress().getId()).isEqualTo(1); - assertThat(records.get(0).getAddress().getStreetAddress()).isEqualTo("123 Main Street"); - assertThat(records.get(0).getAddress().getCity()).isEqualTo("Bedrock"); - assertThat(records.get(0).getAddress().getState()).isEqualTo("IN"); + assertThat(records.get(0).id()).isEqualTo(1); + assertThat(records.get(0).employed()).isTrue(); + assertThat(records.get(0).firstName()).isEqualTo("Fred"); + assertThat(records.get(0).lastName()).isEqualTo(new LastName("Flintstone")); + assertThat(records.get(0).occupation()).isEqualTo("Brontosaurus Operator"); + assertThat(records.get(0).birthDate()).isNotNull(); + assertThat(records.get(0).address().id()).isEqualTo(1); + assertThat(records.get(0).address().streetAddress()).isEqualTo("123 Main Street"); + assertThat(records.get(0).address().city()).isEqualTo("Bedrock"); + assertThat(records.get(0).address().state()).isEqualTo("IN"); } @Test @@ -690,16 +643,16 @@ void testJoinOneRow() { List records = template.selectList(selectStatement, personWithAddressRowMapper); assertThat(records).hasSize(1); - assertThat(records.get(0).getId()).isEqualTo(1); - assertThat(records.get(0).getEmployed()).isTrue(); - assertThat(records.get(0).getFirstName()).isEqualTo("Fred"); - assertThat(records.get(0).getLastName()).isEqualTo(LastName.of("Flintstone")); - assertThat(records.get(0).getOccupation()).isEqualTo("Brontosaurus Operator"); - assertThat(records.get(0).getBirthDate()).isNotNull(); - assertThat(records.get(0).getAddress().getId()).isEqualTo(1); - assertThat(records.get(0).getAddress().getStreetAddress()).isEqualTo("123 Main Street"); - assertThat(records.get(0).getAddress().getCity()).isEqualTo("Bedrock"); - assertThat(records.get(0).getAddress().getState()).isEqualTo("IN"); + assertThat(records.get(0).id()).isEqualTo(1); + assertThat(records.get(0).employed()).isTrue(); + assertThat(records.get(0).firstName()).isEqualTo("Fred"); + assertThat(records.get(0).lastName()).isEqualTo(new LastName("Flintstone")); + assertThat(records.get(0).occupation()).isEqualTo("Brontosaurus Operator"); + assertThat(records.get(0).birthDate()).isNotNull(); + assertThat(records.get(0).address().id()).isEqualTo(1); + assertThat(records.get(0).address().streetAddress()).isEqualTo("123 Main Street"); + assertThat(records.get(0).address().city()).isEqualTo("Bedrock"); + assertThat(records.get(0).address().state()).isEqualTo("IN"); } @Test @@ -713,16 +666,16 @@ void testJoinPrimaryKey() { Optional row = template.selectOne(selectStatement, personWithAddressRowMapper); assertThat(row).hasValueSatisfying(r -> { - assertThat(r.getId()).isEqualTo(1); - assertThat(r.getEmployed()).isTrue(); - assertThat(r.getFirstName()).isEqualTo("Fred"); - assertThat(r.getLastName()).isEqualTo(LastName.of("Flintstone")); - assertThat(r.getOccupation()).isEqualTo("Brontosaurus Operator"); - assertThat(r.getBirthDate()).isNotNull(); - assertThat(r.getAddress().getId()).isEqualTo(1); - assertThat(r.getAddress().getStreetAddress()).isEqualTo("123 Main Street"); - assertThat(r.getAddress().getCity()).isEqualTo("Bedrock"); - assertThat(r.getAddress().getState()).isEqualTo("IN"); + assertThat(r.id()).isEqualTo(1); + assertThat(r.employed()).isTrue(); + assertThat(r.firstName()).isEqualTo("Fred"); + assertThat(r.lastName()).isEqualTo(new LastName("Flintstone")); + assertThat(r.occupation()).isEqualTo("Brontosaurus Operator"); + assertThat(r.birthDate()).isNotNull(); + assertThat(r.address().id()).isEqualTo(1); + assertThat(r.address().streetAddress()).isEqualTo("123 Main Street"); + assertThat(r.address().city()).isEqualTo("Bedrock"); + assertThat(r.address().state()).isEqualTo("IN"); }); } @@ -759,36 +712,24 @@ void testJoinCountWithSubCriteria() { } private final RowMapper personWithAddressRowMapper = - (rs, i) -> { - PersonWithAddress row = new PersonWithAddress(); - row.setId(rs.getInt(1)); - row.setFirstName(rs.getString(2)); - row.setLastName(LastName.of(rs.getString(3))); - row.setBirthDate(rs.getTimestamp(4)); - row.setEmployed("Yes".equals(rs.getString(5))); - row.setOccupation(rs.getString(6)); - - AddressRecord address = new AddressRecord(); - row.setAddress(address); - address.setId(rs.getInt(7)); - address.setStreetAddress(rs.getString(8)); - address.setCity(rs.getString(9)); - address.setState(rs.getString(10)); - - return row; - }; - - - static RowMapper personRowMapper = - (rs, i) -> { - PersonRecord row = new PersonRecord(); - row.setId(rs.getInt(1)); - row.setFirstName(rs.getString(2)); - row.setLastName(LastName.of(rs.getString(3))); - row.setBirthDate(rs.getTimestamp(4)); - row.setEmployed("Yes".equals(rs.getString(5))); - row.setOccupation(rs.getString(6)); - row.setAddressId(rs.getInt(7)); - return row; - }; + (rs, i) -> new PersonWithAddress(rs.getInt(1), + rs.getString(2), + new LastName(rs.getString(3)), + rs.getTimestamp(4), + "Yes".equals(rs.getString(5)), + rs.getString(6), + new AddressRecord(rs.getInt(7), + rs.getString(8), + rs.getString(9), + rs.getString(10))); + + + static final RowMapper personRowMapper = + (rs, i) -> new PersonRecord(rs.getInt(1), + rs.getString(2), + new LastName(rs.getString(3)), + rs.getTimestamp(4), + "Yes".equals(rs.getString(5)), + rs.getString(6), + rs.getInt(7)); } diff --git a/src/test/java/examples/spring/PersonWithAddress.java b/src/test/java/examples/spring/PersonWithAddress.java index 7dd143e6f..7cf524553 100644 --- a/src/test/java/examples/spring/PersonWithAddress.java +++ b/src/test/java/examples/spring/PersonWithAddress.java @@ -17,68 +17,5 @@ import java.util.Date; -public class PersonWithAddress { - private Integer id; - private String firstName; - private LastName lastName; - private Date birthDate; - private Boolean employed; - private String occupation; - private AddressRecord address; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public LastName getLastName() { - return lastName; - } - - public void setLastName(LastName lastName) { - this.lastName = lastName; - } - - public Date getBirthDate() { - return birthDate; - } - - public void setBirthDate(Date birthDate) { - this.birthDate = birthDate; - } - - public String getOccupation() { - return occupation; - } - - public void setOccupation(String occupation) { - this.occupation = occupation; - } - - public Boolean getEmployed() { - return employed; - } - - public void setEmployed(Boolean employed) { - this.employed = employed; - } - - public AddressRecord getAddress() { - return address; - } - - public void setAddress(AddressRecord address) { - this.address = address; - } -} +public record PersonWithAddress(Integer id, String firstName, LastName lastName, Date birthDate, Boolean employed, + String occupation, AddressRecord address) { } diff --git a/src/test/java/examples/spring/SpringMapToRowTest.java b/src/test/java/examples/spring/SpringMapToRowTest.java index 7c40f03d8..0a2d5fe61 100644 --- a/src/test/java/examples/spring/SpringMapToRowTest.java +++ b/src/test/java/examples/spring/SpringMapToRowTest.java @@ -122,11 +122,6 @@ void testInsertBatch() { assertThat(records).hasSize(3); } - static RowMapper rowMapper = - (rs, i) -> { - CompoundKeyRow answer = new CompoundKeyRow(); - answer.setId1(rs.getInt("ID1")); - answer.setId2(rs.getInt("ID2")); - return answer; - }; + static final RowMapper rowMapper = + (rs, i) -> new CompoundKeyRow(rs.getInt("ID1"), rs.getInt("ID2")); } diff --git a/src/test/java/examples/spring/YesNoParameterConverter.java b/src/test/java/examples/spring/YesNoParameterConverter.java index f86cc7b0f..9801fe1ae 100644 --- a/src/test/java/examples/spring/YesNoParameterConverter.java +++ b/src/test/java/examples/spring/YesNoParameterConverter.java @@ -15,10 +15,8 @@ */ package examples.spring; -import org.jspecify.annotations.NullMarked; import org.mybatis.dynamic.sql.ParameterTypeConverter; -@NullMarked public class YesNoParameterConverter implements ParameterTypeConverter { @Override diff --git a/src/test/java/examples/spring/package-info.java b/src/test/java/examples/spring/package-info.java new file mode 100644 index 000000000..27fa1f118 --- /dev/null +++ b/src/test/java/examples/spring/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.spring; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/examples/springbatch/common/PersonProcessor.java b/src/test/java/examples/springbatch/common/PersonProcessor.java index ad7492f4e..2a4939cdb 100644 --- a/src/test/java/examples/springbatch/common/PersonProcessor.java +++ b/src/test/java/examples/springbatch/common/PersonProcessor.java @@ -29,7 +29,7 @@ public class PersonProcessor implements ItemProcessor id = person.id; - public static SqlColumn firstName = person.firstName; - public static SqlColumn lastName = person.lastName; - public static SqlColumn forPagingTest = person.forPagingTest; + public static final Person person = new Person(); + public static final SqlColumn id = person.id; + public static final SqlColumn firstName = person.firstName; + public static final SqlColumn lastName = person.lastName; + public static final SqlColumn forPagingTest = person.forPagingTest; public static class Person extends SqlTable { - public SqlColumn id = column("id", JDBCType.INTEGER); - public SqlColumn firstName = column("first_name", JDBCType.VARCHAR); - public SqlColumn lastName = column("last_name", JDBCType.VARCHAR); - public SqlColumn forPagingTest = column("for_paging_test", JDBCType.BOOLEAN); + public final SqlColumn id = column("id", JDBCType.INTEGER); + public final SqlColumn firstName = column("first_name", JDBCType.VARCHAR); + public final SqlColumn lastName = column("last_name", JDBCType.VARCHAR); + public final SqlColumn forPagingTest = column("for_paging_test", JDBCType.BOOLEAN); public Person() { super("person"); diff --git a/src/test/java/examples/type_conversion/package-info.java b/src/test/java/examples/type_conversion/package-info.java new file mode 100644 index 000000000..4848de776 --- /dev/null +++ b/src/test/java/examples/type_conversion/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +@NullMarked +package examples.type_conversion; + +import org.jspecify.annotations.NullMarked; diff --git a/src/test/java/issues/gh105/Issue105Test.java b/src/test/java/issues/gh105/Issue105Test.java index c12f4fde9..63d2b2f16 100644 --- a/src/test/java/issues/gh105/Issue105Test.java +++ b/src/test/java/issues/gh105/Issue105Test.java @@ -49,12 +49,11 @@ void testFuzzyLikeBothPresent() { @Test void testFuzzyLikeFirstNameNull() { - String fName = null; String lName = "Flintstone"; SelectStatementProvider selectStatement = select(id, firstName, lastName) .from(person) - .where(firstName, isLikeWhenPresent(fName).map(SearchUtils::addWildcards)) + .where(firstName, isLikeWhenPresent((String) null).map(SearchUtils::addWildcards)) .and(lastName, isLike(lName).map(SearchUtils::addWildcards)) .build() .render(RenderingStrategies.MYBATIS3); @@ -70,12 +69,11 @@ void testFuzzyLikeFirstNameNull() { @Test void testFuzzyLikeLastNameNull() { String fName = "Fred"; - String lName = null; SelectStatementProvider selectStatement = select(id, firstName, lastName) .from(person) .where(firstName, isLike(fName).map(SearchUtils::addWildcards)) - .and(lastName, isLikeWhenPresent(lName).map(SearchUtils::addWildcards)) + .and(lastName, isLikeWhenPresent((String) null).map(SearchUtils::addWildcards)) .build() .render(RenderingStrategies.MYBATIS3); @@ -89,13 +87,10 @@ void testFuzzyLikeLastNameNull() { @Test void testFuzzyLikeBothNull() { - String fName = null; - String lName = null; - SelectStatementProvider selectStatement = select(id, firstName, lastName) .from(person) - .where(firstName, isLikeWhenPresent(fName).map(SearchUtils::addWildcards)) - .and(lastName, isLikeWhenPresent(lName).map(SearchUtils::addWildcards)) + .where(firstName, isLikeWhenPresent((String) null).map(SearchUtils::addWildcards)) + .and(lastName, isLikeWhenPresent((String) null).map(SearchUtils::addWildcards)) .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true)) .build() .render(RenderingStrategies.MYBATIS3); diff --git a/src/test/java/org/mybatis/dynamic/sql/insert/GeneralInsertStatementTest.java b/src/test/java/org/mybatis/dynamic/sql/insert/GeneralInsertStatementTest.java index 5c470cdcc..22813df69 100644 --- a/src/test/java/org/mybatis/dynamic/sql/insert/GeneralInsertStatementTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/insert/GeneralInsertStatementTest.java @@ -85,14 +85,12 @@ void testInsertStatementBuilderWithConstants() { @Test void testSelectiveInsertStatementBuilder() { - Integer myId = null; - String myFirstName = null; String myLastName = "jones"; String myOccupation = "dino driver"; GeneralInsertStatementProvider insertStatement = insertInto(foo) - .set(id).toValueWhenPresent(() -> myId) - .set(firstName).toValueWhenPresent(myFirstName) + .set(id).toValueWhenPresent(() -> null) + .set(firstName).toValueWhenPresent((String) null) .set(lastName).toValueWhenPresent(() -> myLastName) .set(occupation).toValueWhenPresent(myOccupation) .build() diff --git a/src/test/java/org/mybatis/dynamic/sql/insert/InsertStatementTest.java b/src/test/java/org/mybatis/dynamic/sql/insert/InsertStatementTest.java index e991bef02..29249317b 100644 --- a/src/test/java/org/mybatis/dynamic/sql/insert/InsertStatementTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/insert/InsertStatementTest.java @@ -20,6 +20,7 @@ import java.sql.JDBCType; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.SqlColumn; import org.mybatis.dynamic.sql.SqlTable; @@ -37,9 +38,7 @@ class InsertStatementTest { @Test void testFullInsertStatementBuilder() { - TestRecord row = new TestRecord(); - row.setLastName("jones"); - row.setOccupation("dino driver"); + TestRecord row = new TestRecord(null, null, "jones", "dino driver"); InsertStatementProvider insertStatement = insert(row) .into(foo) @@ -97,16 +96,14 @@ void testInsertStatementBuilderWithConstants() { @Test void testSelectiveInsertStatementBuilder() { - TestRecord row = new TestRecord(); - row.setLastName("jones"); - row.setOccupation("dino driver"); + TestRecord row = new TestRecord(null, null, "jones", "dino driver"); InsertStatementProvider insertStatement = insert(row) .into(foo) - .map(id).toPropertyWhenPresent("id", row::getId) - .map(firstName).toPropertyWhenPresent("firstName", row::getFirstName) - .map(lastName).toPropertyWhenPresent("lastName", row::getLastName) - .map(occupation).toPropertyWhenPresent("occupation", row::getOccupation) + .map(id).toPropertyWhenPresent("id", row::id) + .map(firstName).toPropertyWhenPresent("firstName", row::firstName) + .map(lastName).toPropertyWhenPresent("lastName", row::lastName) + .map(occupation).toPropertyWhenPresent("occupation", row::occupation) .build() .render(RenderingStrategies.MYBATIS3); @@ -115,42 +112,9 @@ void testSelectiveInsertStatementBuilder() { assertThat(insertStatement.getInsertStatement()).isEqualTo(expected); } - static class TestRecord { - private Integer id; - private String firstName; - private String lastName; - private String occupation; - - Integer getId() { - return id; - } - - void setId(Integer id) { - this.id = id; - } - - String getFirstName() { - return firstName; - } - - void setFirstName(String firstName) { - this.firstName = firstName; - } - - String getLastName() { - return lastName; - } - - void setLastName(String lastName) { - this.lastName = lastName; - } - - String getOccupation() { - return occupation; - } - - void setOccupation(String occupation) { - this.occupation = occupation; + record TestRecord (@Nullable Integer id, @Nullable String firstName, @Nullable String lastName, @Nullable String occupation) { + TestRecord() { + this(null, null, null, null); } } } diff --git a/src/test/java/org/mybatis/dynamic/sql/insert/MapToRowTest.java b/src/test/java/org/mybatis/dynamic/sql/insert/MapToRowTest.java index eb0ff2657..d17811fe1 100644 --- a/src/test/java/org/mybatis/dynamic/sql/insert/MapToRowTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/insert/MapToRowTest.java @@ -166,13 +166,5 @@ void testBatchInsertRowMappingWithSpring() { assertThat(batchInsert.getInsertStatementSQL()).isEqualTo(expected); } - static class Record { - public Record(Integer id1, Integer id2) { - this.id1 = id1; - this.id2 = id2; - } - - public Integer id1; - public Integer id2; - } + record Record(Integer id1, Integer id2) { } } diff --git a/src/test/java/org/mybatis/dynamic/sql/util/ColumnMappingVisitorTest.java b/src/test/java/org/mybatis/dynamic/sql/util/ColumnMappingVisitorTest.java index f75be43f6..2f17910b2 100644 --- a/src/test/java/org/mybatis/dynamic/sql/util/ColumnMappingVisitorTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/util/ColumnMappingVisitorTest.java @@ -205,8 +205,8 @@ void testThatUpdateVisitorErrorsForRowMapping() { } private static class TestTable extends SqlTable { - public SqlColumn id; - public SqlColumn description; + public final SqlColumn id; + public final SqlColumn description; public TestTable() { super("Test"); diff --git a/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperNewSyntaxTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperNewSyntaxTest.kt index 2d74a5784..1ad6d71c2 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperNewSyntaxTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperNewSyntaxTest.kt @@ -477,14 +477,12 @@ class JoinMapperNewSyntaxTest { join(orderLine, "ol") on { orderMaster.orderId isEqualTo orderLine.orderId } - leftJoin( - { - select(itemMaster.allColumns()) { - from(itemMaster) - } - + "im" + leftJoin { + select(itemMaster.allColumns()) { + from(itemMaster) } - ) on { + +"im" + } on { orderLine.itemId isEqualTo "im"(itemMaster.itemId) } orderBy(orderLine.orderId, itemMaster.itemId) @@ -614,14 +612,12 @@ class JoinMapperNewSyntaxTest { join(orderLine, "ol") on { orderMaster.orderId isEqualTo orderLine.orderId } - rightJoin( - { - select(itemMaster.allColumns()) { - from(itemMaster) - } - + "im" + rightJoin { + select(itemMaster.allColumns()) { + from(itemMaster) } - ) on { + +"im" + } on { orderLine.itemId isEqualTo "im"(itemMaster.itemId) } orderBy(orderLine.orderId, itemMaster.itemId) diff --git a/src/test/kotlin/examples/kotlin/spring/canonical/GeneratedAlwaysDynamicSqlSupport.kt b/src/test/kotlin/examples/kotlin/spring/canonical/GeneratedAlwaysDynamicSqlSupport.kt index db4067c5a..0c388bdb6 100644 --- a/src/test/kotlin/examples/kotlin/spring/canonical/GeneratedAlwaysDynamicSqlSupport.kt +++ b/src/test/kotlin/examples/kotlin/spring/canonical/GeneratedAlwaysDynamicSqlSupport.kt @@ -26,7 +26,7 @@ object GeneratedAlwaysDynamicSqlSupport { val fullName = generatedAlways.fullName class GeneratedAlways : SqlTable("GeneratedAlways") { - val id = column("id") + val id = column(name = "id") val firstName = column(name = "first_name") val lastName = column(name = "last_name") val fullName = column(name = "full_name") diff --git a/src/test/kotlin/org/mybatis/dynamic/sql/util/kotlin/model/ModelBuilderTest.kt b/src/test/kotlin/org/mybatis/dynamic/sql/util/kotlin/model/ModelBuilderTest.kt index d4394a500..a4a4b9e3f 100644 --- a/src/test/kotlin/org/mybatis/dynamic/sql/util/kotlin/model/ModelBuilderTest.kt +++ b/src/test/kotlin/org/mybatis/dynamic/sql/util/kotlin/model/ModelBuilderTest.kt @@ -19,13 +19,14 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mybatis.dynamic.sql.SqlTable import org.mybatis.dynamic.sql.render.RenderingStrategies +import org.mybatis.dynamic.sql.util.kotlin.elements.column class ModelBuilderTest { class Table : SqlTable("Table") val table = Table() - val id = table.column("id") - val description = table.column("description") + val id = table.column(name = "id") + val description = table.column(name = "description") @Test fun testSelectBuilder() { diff --git a/src/test/resources/examples/joins/JoinMapper.xml b/src/test/resources/examples/joins/JoinMapper.xml index e70e6b242..22aa930e9 100644 --- a/src/test/resources/examples/joins/JoinMapper.xml +++ b/src/test/resources/examples/joins/JoinMapper.xml @@ -22,10 +22,12 @@ - - - - + + + + + +