311-frameworks-spring-jdbc — Claude Code skill for Spring JDBC
A skill that reviews and writes Spring JDBC code: pushes JdbcClient, catches SQL injection, fixes transaction boundaries.
npx skills add jabrena/plinth --skill 311-frameworks-spring-jdbc -a claude-codeWhat 311-frameworks-spring-jdbc does
This skill covers programmatic database access through Spring JDBC. Its default is JdbcClient from Spring Framework 7+, while JdbcTemplate and NamedParameterJdbcTemplate stay for legacy code and for cases that need batch updates, KeyHolder or RowCallbackHandler streaming.
Inside is a rule set with good and bad code examples: parameterized SQL, RowMapper mapping into records, batch operations and generated keys, @Transactional boundaries on the service layer, read-only transactions, safe single-row reads with optional() and findFirst(), DataAccessException handling, and @JdbcTest slice tests with @Sql fixtures. The skill reads references/311-frameworks-spring-jdbc.md first, then inspects the project and proposes the smallest safe set of changes.
One hard rule: the project has to compile before anything is touched. If ./mvnw compile or mvn compile fails, the skill stops and changes nothing. After the edits it runs ./mvnw clean verify. So fix the build first, then ask for the refactor.
What it helps with
- spot user input concatenated into a SQL string
- migrate legacy NamedParameterJdbcTemplate code to JdbcClient
- map a query result into a record with RowMapper
- move transaction boundaries up to the service layer
- replace queryForObject where a row may be missing
Example prompts for the agent
- Review this repository for SQL injection in the JDBC code
- Rewrite these queries with JdbcClient from Spring Framework 7
- Check transaction boundaries and DataAccessException handling in the services
How to install 311-frameworks-spring-jdbc
1Skills CLI (Vercel)
npx skills add jabrena/plinth --skill 311-frameworks-spring-jdbc -a claude-code2Manually: put the files in place
~/.claude/skills/311-frameworks-spring-jdbc/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/311-frameworks-spring-jdbc/
1Skills CLI (Vercel)
npx skills add jabrena/plinth --skill 311-frameworks-spring-jdbc -a codex2Manually: put the files in place
.agents/skills/311-frameworks-spring-jdbc/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add jabrena/plinth --skill 311-frameworks-spring-jdbc -a cursor2Manually: put the files in place
.cursor/skills/311-frameworks-spring-jdbc/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install jabrena/plinth 311-frameworks-spring-jdbc2Manually: put the files in place
.github/skills/311-frameworks-spring-jdbc/SKILL.md1Skills CLI (Vercel)
npx skills add jabrena/plinth --skill 311-frameworks-spring-jdbc -a gemini-cli2Platform CLI
gemini skills install https://github.com/jabrena/plinth --path skills/311-frameworks-spring-jdbcManually: put the files in place
.devin/skills/311-frameworks-spring-jdbc/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add jabrena/plinth --skill 311-frameworks-spring-jdbc -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about 311-frameworks-spring-jdbc
How do I install 311-frameworks-spring-jdbc in Claude?
Run npx skills add jabrena/plinth --skill 311-frameworks-spring-jdbc -a claude-code. The skill lands in ~/.claude/skills/311-frameworks-spring-jdbc/SKILL.md.
What does 311-frameworks-spring-jdbc do?
It reviews and rewrites Spring JDBC code: parameterized SQL, JdbcClient, RowMapper, batch operations, transactions, exception handling and slice tests.
What has to be in place before running the skill?
The project must compile. The skill runs ./mvnw compile or mvn compile itself and stops without making changes if the build fails.
Source text
SKILL.md · Apache-2.0
--- name: 311-frameworks-spring-jdbc description: Use when you need to write or review programmatic JDBC with Spring — including JdbcClient (Spring Framework 7+) as the default API, JdbcTemplate only where batch/streaming APIs require JdbcOperations, NamedParameterJdbcTemplate for legacy named-param code, parameterized SQL, RowMapper mapping to records, batch operations, transactions, safe handling of generated keys, DataAccessException handling, read-only transactions, streaming large result sets, and @JdbcTest slice testing. This should trigger for requests such as Review Java code for Spring JDBC (JdbcTemplate, JdbcClient, NamedParameterJdbcTemplate); Apply best practices for Spring JDBC data access in Java code; Detect and fix SQL injection risks in JDBC code; Improve transaction boundaries or exception handling for JDBC operations; Review JdbcClient usage in Spring Framework 7. Part of Plinth Toolkit license: Apache-2.0 metadata: author: Juan Antonio Breña Moral version: 0.19.0 --- # Spring JDBC — JdbcClient (Spring Framework 7+) Apply Spring JDBC guidelines with JdbcClient as the default; use JdbcTemplate / NamedParameterJdbcTemplate only for legacy code or APIs not covered by JdbcClient (batch updates, KeyHolder, RowCallbackHandler streaming). **What is covered in this Skill?** - Parameterized SQL (never concatenate user input) - JdbcClient fluent API (Spring Framework 7+) — preferred for queries and updates - Named parameters via JdbcClient; NamedParameterJdbcTemplate for legacy migration - RowMapper, query(Class), and records - Batch operations and generated keys (JdbcTemplate / JdbcOperations where needed) - Safe handling of generated keys (KeyHolder; single-row JdbcClient updates) - Service-layer @Transactional boundaries - Read-only transactions (@Transactional(readOnly = true)) - Safe single-row access (optional() / findFirst() vs queryForObject) - Streaming large result sets (RowCallbackHandler, ResultSetExtractor) - DataAccessException handling (DuplicateKeyException, EmptyResultDataAccessException) - @JdbcTest slice testing with @Sql fixtures **Scope:** Apply recommendations based on the reference rules and good/bad code examples. ## Constraints Before applying any Spring JDBC changes, ensure the project compiles. If compilation fails, stop immediately. After applying improvements, run full verification. - **MANDATORY**: Run `./mvnw compile` or `mvn compile` before applying any change - **SAFETY**: If compilation fails, stop immediately - **VERIFY**: Run `./mvnw clean verify` or `mvn clean verify` after applying improvements - **SQL INJECTION**: Never concatenate untrusted input into SQL strings — always use bind parameters - **BEFORE APPLYING**: Read the reference for detailed rules and good/bad patterns ## When to use this skill - Review Java code for Spring JDBC (JdbcTemplate, JdbcClient, NamedParameterJdbcTemplate) - Apply best practices for Spring JDBC data access in Java code - Detect and fix SQL injection risks in JDBC code - Improve transaction boundaries or exception handling for JDBC operations - Review JdbcClient usage in Spring Framework 7 ## Workflow 1. **Read reference and assess project context** Read `references/311-frameworks-spring-jdbc.md` and inspect the current project setup before proposing changes. 2. **Gather scope and decide target improvements** Identify requested outcomes, constraints, and the minimum safe set of changes to apply. 3. **Apply framework-aligned changes** Implement or refactor configuration/code following the reference patterns and project conventions. 4. **Run verification and report results** Execute appropriate build/tests and summarize what changed, what was verified, and any follow-up actions. ## Reference For detailed guidance, examples, and constraints, see [references/311-frameworks-spring-jdbc.md](references/311-frameworks-spring-jdbc.md).
© Juan Antonio Breña Moral · Apache-2.0 · jabrena/plinth