PRE SIP: ThisFunction | scope injection (similar to kotlin receiver function)

A tuple is (at least shallowly) immutable by design (and that’s a good design). You cannot do:

val tuple = (1, "abc", 'z')
tuple._2 = "something else" // doesn't compile

OTOH with case classes you can mark fields as vars instead of default vals:

case class MyType(var a: Int, var b: String, var c: Char)
val myValue = MyType(1, "abc", 'z')
myValue.b = "something else" // compiles fine

If you want to reuse already created objects then custom case classes offer more flexibility than standard tuples. However, I don’t recommend that in general - side-effect free code is often easier to reason about.

JDBC is a low level API, not meant to be concise, readable, strongly typed or programmer friendly. Therefore there are tons of higher level libraries (built on top of JDBC) that provide improved API. Scala is oriented towards high-level abstractions rather than low-level ones.