| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| 3.55.0 source code.tar.gz | 2026-09-27 | 1.0 MB | |
| 3.55.0 source code.zip | 2026-09-27 | 2.5 MB | |
| README.md | 2026-09-27 | 9.2 kB | |
| Totals: 3 Items | 3.6 MB | 3 | |
Significant bugfix and small feature request sweep of the backlog:
- Bind and map types that are not public: a package-private bean class with public accessors, a non-public
constructor or
@JdbiConstructorfactory method, or a package-private Immutables value type.mapToBeannow also uses a non-public no-arg constructor, e.g. a private one on a public bean. TheReflectionMappersaccessible object strategy controls this. UnlikeFieldMapper, these mappers apply the strategy in effect when a type is first used and cache the result for theJdbiinstance, so set the strategy on theJdbibefore first use, not on aHandleor statement. AConstructorMapperfor a type that Jdbi can not access now fails on first use, with a message that names the fix, instead of at creation (#1684) - Fix
KotlinMapperignoring a SQLNULLfor a@PropagateNullconstructor parameter or property of a non-null primitive type such asLongorInt. The column mapper returned0(orfalse) and the object was mapped instead ofnull.KotlinMappernow treats theNULLasnulllike theConstructorMapper,FieldMapper, andBeanMapperdo (#3048) - Fix a
@Nested Optional<T>attribute that heldnullinstead ofOptional.empty()whenTused the class-level@PropagateNull("column")form and that column was null. A@PropagateNullon theOptionalattribute itself no longer turns the parent intonullin this case, which matches the attribute-level form (#3049) - New
JoinRowReducer(Beta) reduces the rows of a join query into root objects and links the joined objects to them, for to-one and to-many relations over inner and outer joins. Columns are named relative to the relation prefix, one type is one table, so a table row is one instance no matter through how many relations the query reaches it, and reducers nest for deeper graphs (#1574) - New
RowView.getColumn(String)andRowView.getColumn(int)return a column value as the JDBC driver returns it fromResultSet.getObject, without a column mapper. NewRowView.getColumnNames()returns the column labels of the result set, andRowView.getRow(RowMapper)maps the current row with a given mapper (#1574) - Add
BindListStyleto renderbindList/@BindListelements as single-column rows,(:a),(:b), for use with the SQLVALUESlist constructor. Configure it withSqlStatements#setBindListStyleor@BindList(style = BindListStyle.ROWS)(#1550, Alpha) - Add
LocalTransactionHandler.managed(): Jdbi manages transactions on connections with autocommit disabled instead of joining them, e.g. on a pool that disables autocommit as a precaution.inTransactioncommits, retry handlers such asSerializableTransactionRunnerengage, and a statement executed outside of a transaction is not committed. (#2663, [#1733]) - Add
NoOpTransactionHandlerfor connections whose transactions an external framework manages, e.g. a SpringTransactionAwareDataSourceProxyor an XA data source. It never reads or changes the transaction state of the connection.CMTTransactionHandlernow extends it, with unchanged behavior. (#2742, thanks @bekoenig for the suggestion!) - Document the transaction contract for connections with autocommit disabled: the handle joins the transaction that the connection owner manages. New "Transactions managed outside Jdbi" section in the User Guide, with tests that pin the contract. (#1039, [#2663])
- Document how
@PropagateNullresolves its column: on a class, the column name is relative to the mapper prefix (from@Nestedor from a mapper made with a prefix), so one class maps under different prefixes. New "Using@PropagateNull" section in the User Guide, with tests for mappers made with a prefix. (#1764) - Fix
JdbiExtensionlosing its plugins and initializer afterafterAll, so a static extension whose test class ran a second time in the same JVM (a Surefire rerun of a failed test, or a@Nestedclass selected as its own test class) restarted with a bareJdbiand failed withNoSuchMapperExceptionorNoSuchExtensionException(#3036) - vavr: update to vavr 1.0.1. The vavr 1.0.0-alpha releases remain unsupported (#2350)
- Fix repeated
@RegisterKotlinMapperannotations on one method or type. Kotlin wrapped them in a generated container that Jdbi did not process, so none of the mappers were registered and rows mapped through the unprefixedKotlinMapperFactorymapper, ignoring the prefix. The annotation now usesRegisterKotlinMappersas its container. Recompile code that repeats the annotation to pick up the fix. (#2961) - update Spring Framework to 6.2.19 due to CVE-2026-41848 (Dependabot alert [#45], [#3026])
ConfigRegistry.createCopy()now materializes each config object lazily on its first access instead of copying every config object eagerly. This removes most of the allocation cost of extension attach (Jdbi#onDemandre-attaches on every call), ofHandlecreation, and of statement creation (#2982, thanks @ulmetrs!). If code depends on the exact moment a copy is taken, restore the old timing withConfigRegistry#setEagerCopies(true)(Alpha).- Reflective row mappers (
BeanMapper,ConstructorMapper,FieldMapper) that match no columns at all now list the result set columns in the error, and a prefixed mapper explains thatSELECT t.*yields unprefixed labels and shows how to alias them. Document the same in the mapper and JoinRowMapper sections (#2289) - Fix jdbi3-spring excluding spring-jcl from consumers since 3.51.0, which broke Spring Boot 3
applications at startup with
NoClassDefFoundError: org.apache.commons.logging.LogFactory(#2990) - Register SQL array element types for
java.timeout of the box:LocalDate,LocalTime,LocalDateTime,OffsetDateTime,OffsetTime,Instant, andZonedDateTimenow bind to SQL arrays without a manualregisterArrayTypecall.PostgresPluginadditionally registersDurationandPeriod(bound asinterval) and binds the date-bearing types as text literals that cover the full Postgres date range, including BC dates (#3022) - Fix
afterRollbackcallbacks not firing when a transaction fails at commit time, e.g. on a serialization failure underSerializableTransactionRunner. The failed transaction's callbacks also no longer leak into the next transaction on the same handle. (#3021, thanks @OswaldOniSango!) - Fix
afterCommitandafterRollbackcallbacks not firing, and leaking into the next transaction on the same handle, when the connection fails during a rollback or during the autocommit restore that follows a commit.RollbackOnlyTransactionHandlernow runs theafterRollbackcallbacks on a commit, and never theafterCommitcallbacks, because it never commits (#3038) - generator: generated SQL objects work in a GraalVM native image without reachability metadata. The
generator now registers a
GeneratedSqlObjectProvider(Alpha) for each generated class through theServiceLoader, and Jdbi uses it instead of a reflective lookup by class name. Classes generated by an older Jdbi version must be recompiled.ExtensionMetadata.Builder#setExtensionTypeMethodslets an extension factory supply the extension methods instead of discovering them by reflection. (#2474) - Fix PreparedBatch NPE when rows bind different runtime types, e.g. mixed bean subclasses (#2974, thanks @arimu1!)
- Fix DefaultJdbiCache pinning entries when loader throws an exception (#2995)
- Fix GraalVM native image missing entries and update metadata to new format, support 25.2 (#2994)
QualifiedTypeno longer synthesizes an annotation proxy for a qualifier annotation without members, soQualifiedType.with(Class)and the built-in@Legacy,@NVarchar,@EnumByName, and@EncodedJsonqualifiers work in a GraalVM native image without proxy registration. NewQualifiedType.hasQualifiers(Set)andhasNoQualifiers()compare qualifiers without materializing annotations. (#2967)- stringtemplate4:
StringTemplateEnginenow caches template compilation through the core statement cache instead of recompiling on every render, with compiled templates pooled for thread safety. The cached path bypassesrender(String, StatementContext): a subclass that overridesrendermust also overrideparse, most simply to returnOptional.empty(), which keeps the core on itsrenderpath.BatchandScriptnow render through the statement cache as well. (#2997) - Fix
@GenerateSqlObjectimplementations not found when the SQL object interface is loaded by a class loader other than the one that loaded Jdbi, e.g. plugin containers (#3014) - Share the extension metadata cache across handles so
handle.attach()-only workloads no longer recomputeExtensionMetadataon every handle (#2991) - Fix
JdbiImmutablesnot finding the generatedImmutable*andModifiable*classes when the spec is loaded by a class loader other than the one that loaded Jdbi, e.g. plugin containers