> For the complete documentation index, see [llms.txt](https://hanfak.gitbook.io/workspace/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hanfak.gitbook.io/workspace/languages/java/advanced/databases.md).

# Database and java

* Be wary of using ORMs and use the simplest tool (which might be using plain sql)
* Sql is a declarative language, and is not hard to learn. Very useful for working with relational databases
* Dont be too quick to go straight to modelling tables as objects and using ORMs, when calling a sql is a simpler
  * Using ORMs means a lot set up and code (more code, more chance of bugs), learning a DSL, testing, relying on the ORM to generate non efficient queries,
* Benefits of using Sql
  * We don’t need a new table for the join output, so we don’t create one.
    * The biggest failing of applied object-oriented programming has been the belief that you should faithfully reproduce your domain model in code.
    * In reality, a few core type definitions are useful for encapsulation and understanding, but tuples, sets, arrays, and so forth are all we need the rest of the time.
    * Unnecessary classes become a burden as the code evolves.
  * The query is declarative
    * Nowhere does it tell the database how to do the query; it just states the relational constraints the database must satisfy
    * Doing this in java (exp pre version 8), it would be done imperatively
    * Instead, we should declare constraints and desired outcomes, and then isolate the how implementation in one place or delegate to a library that can implement it for us
  * The database is more efficient at running the query then letting the code run query on the whole dataset
  * The domain-specific language (DSL) is well matched to the problem
    * SQL is mature, and well known, with lots of resources
