## Using connections

When you need to execute sequential queries (without a transaction), you can create a new connection or borrow one from the pool:

    Code not translatable

Prepared queries can be created:

    connection.prepare("SELECT * FROM users WHERE first_name LIKE ?", { ar1 ->
      if (ar1.succeeded()) {
        var pq = ar1.result()
        pq.execute(Tuple.of("julien"), { ar2 ->
          if (ar2.succeeded()) {
            // All rows
            var rows = ar2.result()
          }
        })
      }
    })

Note | prepared query caching depends on the `setCachePreparedStatements` and does not depend on whether you are creating prepared queries or use `direct prepared queries`

`PreparedQuery` can perform efficient batching:

    connection.prepare("INSERT INTO USERS (id, name) VALUES (?, ?)", { ar1 ->
      if (ar1.succeeded()) {
        var prepared = ar1.result()

        // Create a query : bind parameters
        var batch = mutableListOf<Any?>()

        // Add commands to the createBatch
        batch.add(Tuple.of("julien", "Julien Viet"))
        batch.add(Tuple.of("emad", "Emad Alblueshi"))

        prepared.batch(batch, { res ->
          if (res.succeeded()) {

            // Process rows
            var rows = res.result()
          } else {
            println("Batch failed ${res.cause()}")
          }
        })
      }
    })