☕ Java & Groovy for Data
Do the data half of the job in the language your company already runs — streams and records, JDBC and DuckDB, with Groovy for the parts where Java makes you type too much.
No lessons published yet — this is the roadmap, so you can see exactly what the course will cover before it lands.
Before you start: Learn SQL — Series 1. Series 1 of Learn SQL is the whole prerequisite: SELECT, WHERE, JOIN and GROUP BY. Once you start running queries from Java here, you check the answers against the same Northwind numbers the SQL koans use. You are never asked to write clever SQL — but you do need to read a query and know what it should come back with, because that is how you tell a JVM bug from a SQL one.
Short on time? The 31 episodes marked core are the shortest path to being productive at work. Start there and pick up the rest whenever a job asks for them.
Series 1 · Java & Groovy for Data Fundamentals
write a Java or Groovy script that reads and reshapes data
- 01
Your First Script — Read a CSV File and Answer One Question About It
corebeginner#foundationalcoming soon - 02
Records and Collections — Holding Rows and Tables in Memory
corebeginnercoming soon - 03
Streams — Transforming Rows With map, filter and collect
corebeginner#foundationalcoming soon - 04
Groovy Collections — Filtering, Transforming and Grouping in Less Code
beginnercoming soon - 05
Files and Encodings — Reading Text Files in the Right Character Set
corebeginnercoming soon - 06
java.time — Working With Dates, Times and Time Zones Correctly
corebeginnercoming soon - 07
Nulls and Optional — Handling Data That Is Missing
corebeginnercoming soon - 08
Money and BigDecimal — Doing Arithmetic on Amounts and Rounding Them
corebeginnercoming soon - 09
Grouping and Aggregating — Summarising Rows With groupingBy
corebeginnercoming soon - 10
Joining Two Datasets in Memory — Combining Rows Without Doubling Totals
corebeginnercoming soon - 11
Your First End-to-End Script — From a File to a Finished Answer
corebeginner#projectcoming soon
Series 2 · Working With Real Data
files, databases and APIs — nothing pre-cleaned
- 01
CSV, JSON and Parquet — Reading the Three Formats You Will Meet Most
coreintermediatecoming soon - 02
Excel with POI — Reading and Writing the Spreadsheets Your Business Needs
intermediatecoming soon - 03
PDF with PDFBox — Reading and Writing the Documents and Reports Your Business Needs
intermediatecoming soon - 04
JDBC — Talking to a Database From Java: Connection, Statement, ResultSet
coreintermediate#foundationalcoming soon - 05
PreparedStatement — Passing Values Safely Into a Query
coreintermediatecoming soon - 06
Text Blocks — Writing Multi-Line SQL Inside Java Code
intermediatecoming soon - 07
groovy.sql.Sql — Running Queries With Much Less Code
coreintermediatecoming soon - 08
jOOQ — Writing SQL in Java That the Compiler Checks
intermediatecoming soon - 09
MyBatis — Mapping Hand-Written SQL Onto Java Objects
intermediatecoming soon - 10
Batches and Transactions — Inserting Many Rows Quickly and Safely
coreintermediatecoming soon - 11
Streaming Large Results — Reading Millions of Rows Without Filling Memory
coreintermediatecoming soon - 12
DuckDB from Java — An Analytics Engine Inside Your Process
intermediatecoming soon - 13
Choosing Database Access — Picking Between JDBC, jOOQ, MyBatis and DuckDB
coreintermediatecoming soon - 14
HTTP and JSON — Reading Data From an API With HttpClient and Jackson
coreintermediatecoming soon - 15
Retry, Backoff and Pagination — Fetching From an API Reliably
intermediatecoming soon - 16
Virtual Threads and Parallel Streams — Running Slow Calls in Parallel
intermediatecoming soon - 17
Cleaning and Validating — Checking Data Before You Load It
coreintermediatecoming soon - 18
Project — One Answer From a CSV, a Database and an API
coreintermediate#projectcoming soon
Series 3 · Java That Ships
code someone else can run next month
- 01
Maven, Gradle and @Grab — Dependencies for Apps and for Scripts
coreadvancedcoming soon - 02
Project Structure — Where the Data Code Goes
advancedcoming soon - 03
Command-Line Tools — Arguments, Exit Codes and picocli
coreadvancedcoming soon - 04
Configuration and Secrets — Keeping Passwords Out of Your Code
coreadvancedcoming soon - 05
Liquibase — Database Changes Kept in Version Control, Written in Groovy
coreadvancedcoming soon - 06
Logging and Failure — What Someone Needs to See When the Job Breaks
coreadvancedcoming soon - 07
Testing Data Code — Testcontainers and the Database You Actually Ship
advancedcoming soon - 08
Performance and Memory — Measure Before You Change Anything
advancedcoming soon - 09
Before You Reach for Threads — Push It Down to the Engine
coreadvancedcoming soon - 10
Fan-Out and Bounded Memory — N Calls, One Queue, a Flat Heap
advancedcoming soon - 11
Partitioned Work — Splitting Rows and Combining Answers
advanced#dean-mapreducecoming soon - 12
When One Machine Is Not Enough — What Changes, and What Breaks
advancedcoming soon - 13
Project — A Job That Reads, Transforms, Loads and Reports
coreadvanced#projectcoming soon
Series 4 · Frameworks, Where They Earn It
use JPA, Hibernate and Spring for queries and the jobs that run them
- 01
JPA — Java's Standard Way to Turn Rows Into Objects
advancedcoming soon - 02
Hibernate — The Library That Turns Your JPA Code Into SQL
advancedcoming soon - 03
Spring JdbcTemplate — Running Your Own SQL From a Spring Application
coreadvancedcoming soon - 04
Spring Data Repositories — Your Method Name Becomes the Query
advancedcoming soon - 05
GORM — Grails' Data Layer, and the Hibernate Underneath It
advancedcoming soon - 06
Liquibase in Spring Boot and Grails — Migrations That Run at Startup
advancedcoming soon - 07
Spring Batch — Jobs That Process Rows in Chunks and Restart Where They Stopped
advancedcoming soon - 08
Apache Beam — Describing a Pipeline Once and Letting a Runner Execute It
advancedcoming soon - 09
Spring Scheduling — Running a Data Job on a Timer Inside Your Application
advancedcoming soon - 10
DataPallas Crons — Scheduling the dbt Transform and the Excel Refresh
coreadvancedcoming soon - 11
ShedLock — Locking a Scheduled Task So Only One Instance Runs It
advancedcoming soon - 12
Quartz — Storing Schedules in a Database and Firing Them Once Across Instances
advancedcoming soon - 13
Choosing a Framework — Picking Between JPA, Spring Data, GORM, Spring Batch and Quartz
coreadvancedcoming soon - 14
Project — Add a Data Feature to the DataPallas Grails App
coreadvanced#projectcoming soon
Where this leads
- Grails — starts from Series 1, and Series 4.
- Spring Boot — starts from Series 1, and Series 4.
Not here, on purpose
- Controllers, dependency injection, security and the web layer — not covered; Series 4 teaches Spring and Grails only where they read and write rows
- Hibernate internals and JPA entity mapping in depth — not covered by design. In this course, Series 4 · 00 teaches JPA as the vocabulary and Series 4 · 05 the one Hibernate behaviour that costs you memory on a bulk load
- Deciding what the schema change should be — covered in Data Modeling, Series 2 · 50. In this course, Series 3 · 20 applies a change that has already been designed
- Running a migration against a live database under load — locks, zero downtime — covered in Data Ops — here the question is only how the change gets versioned and shipped from your build
- Making a load re-runnable — MERGE, watermarks and proving nothing changed — covered in ETL & Data Pipelines, Series 1 · 30 and · 35. In this course, Series 2 · 55 covers only the request-level half — whether it is safe to RETRY a call whose outcome you never learned
- Machine learning — features, training, model selection — not covered; this track moves and shapes data. For LLM-era work see AI for Data
- OCR, and getting data out of scanned documents — not covered. Series 2 · 07 teaches you to RECOGNISE that a PDF carries no text layer — which is the decision you actually have to make — but extracting from an image is a different tool and a different problem
- Charts other people read, and dashboards — covered in BI & Data Visualization — here you plot only to see the data yourself
- cron, systemd timers, and choosing an orchestrator — covered in Data Ops — here the scheduler runs inside your own Spring Boot app, which fails in different ways. In this course, Series 4 · 30 and · 35
- Writing the SQL itself — covered in Learn SQL — here the SQL is assumed and the question is how to run it from the JVM