jasync-sql-extensions is a simple Extension of jasync-sql. The current Features include:
- Named argument binding
- List binding
- Bean binding
- Json binding
- Data class mapping
- Json mapping
- Custom mapper support
- WIP: 1 to N, N to N and 1 to 1 support via dsl
jasync-sql-extensions is based upon extension functions. So create a query using named bindings start like this:
connection.sendPreparedStatement(
"SELECT :bert.number, :bert.nabla, :carol.id, :carol.name",
mapOf(
"bert" to Bert(
number = 42,
nabla = "bar"
),
"carol" to Carol(
id = 24,
name = "Homer"
)
)
)
To map a result set, use the mapTo<>()
extension.
resultSet.mapTo<Carol>()
This will map the corresponding columns into objects.
Add this to your build.gradle
file
compile group: "com.github.28Smiles", name: "jasync-sql-extensions", version: "0.3.1"
To improve the speed of mapping columns into objects, before mapping the bean is analysed and the most efficient code will be syntesised using ASM. This way the mapTo<>()
implementation, in most cases, outperforms mapping code created by the kotlin compiler, since some null checks have been ommited.
The MappingBenchmark
, mapping a result set of 500000 rows shows the following run times:
Manual mapping of the select took: 61 ms
Reflection mapping of the select took: 233 ms
Cold ASM mapping of the select took: 86 ms
Hot ASM mapping of the select took: 51 ms
Manual mapping refers to a standard kotlin implementation.
Reflection mapping refers to a mapping using kotlin reflection.
Cold ASM mapping refers to code being synthesized and then executed.
Hot ASM mapping refers code being cached and executed.
Using the SmallMappingBenchmark
, mapping 30 beans, we get a impression of the initial overhead:
Manual mapping of the select took: 1120 us
Reflection mapping of the select took: 55562 us
Cold ASM mapping of the select took: 31021 us
Hot ASM mapping of the select took: 147 us
This libary is tested, but it most certainly contains bugs and has several limitations, use with caution.