# informat.datasource 数据源相关操作

## 概述

使用`informat.datasource`执行数据源相关的操作

## getConnection

从数据库连接池获取连接

```javascript
informat.datasource.getConnection(moduleId, dataSourceKey, setting)
```

::: tip

- 连接创建不成功会抛出异常
- 设置了`autoCommit`等于`true`时，在执行update、insert、delete语句时将会自动提交事务
- 在脚本执行结束后，需要手动关闭创建的连接

:::

| 参数            | 类型                                                                                  | 描述       |
|---------------|-------------------------------------------------------------------------------------|----------|
| moduleId      | `String`                                                                            | 数据源模块标识符 |
| dataSourceKey | `String`                                                                            | 数据源标识符   |
| setting       | [DataSourceConnnectionSetting](/guide/script/model.md#datasourceconnnectionsetting) | 数据源配置    |

***返回值***
数据库连接 类型为`JDBCConnection`

**示例**

```javascript
const connection = informat.datasource.getConnection('dataSource', 'db_informat', {
    "autoCommit": true
})
connection.select('select * form table', (row) => {
    console.log(row.getString(1))
})

// 关闭连接
connection.close();
```

## Connection

### select

执行查询,如果查询失败会抛出异常

```javascript
connection.select(sql, handler, ...args)
```

| 参数                   | 类型          | 描述       |
|----------------------|-------------|----------|
| sql                  | `String`    | 查询的SQL   |
| handler(`ResultSet`) | Function    | 查询结果回调函数 |
| args                 | `...Object` | 查询的参数    |

**示例1**

```javascript
//查询 user 表中name等于tom的数据
connection.select('select * from user where name=?', (rs) => {
    console.log(rs.getString('name'))
}, 'tom')
```

**示例2 使用like**

```javascript
//查询 user 表中name包含tom的数据
connection.select('select * from user where name like concat(' % ',?,' % ')', (rs) => {
    console.log(rs.getString('name'))
}, 'tom')
```

**示例3 使用in**

```javascript
//查询 user 表中name是tom或jerry的数据
connection.select('select name from user where name in(?,?)', (rs) => {
    console.log(rs.getString('name'))
}, 'tom', 'jerry')
```

### insert

执行插入，如果插入失败会抛出异常

```javascript
connection.insert(sql, returnAutoGeneratedKeys, ...args)
```

| 参数                      | 类型          | 描述          |
|-------------------------|-------------|-------------|
| sql                     | `String`    | 查询的SQL      |
| returnAutoGeneratedKeys | `Boolean`   | 是否返回自增的主键ID |
| args                    | `...Object` | 插入的参数       |

**返回值**

类型为`String`

如果设置了`returnAutoGeneratedKeys`为true，并且执行的操作为insert则返回最后插入数据的自增ID

**示例**

```javascript
connection.insert('insert into user(name,age) values (?, ?)', true, 'tom', 10)
```

### update

执行更新或者删除, 如果更新或者删除失败会抛出异常

```javascript
connection.update(sql, ...args)
```

| 参数   | 类型          | 描述     |
|------|-------------|--------|
| sql  | `String`    | 查询的SQL |
| args | `...Object` | 更新的参数  |

**返回值**
类型为`Integer`

返回更新或删除成功的记录条数

**示例**

::: code-group

```javascript [更新]
connection.update('update user set age=?', 10)
```

```javascript [删除]
connection.update('delete from user where age=?', 10)
```

:::

### commit

提交事务，如果提交事务失败会抛出异常

```javascript
connection.commit()
```

### rollback

回滚事务，如果回滚事务失败会抛出异常

```javascript
connection.rollback()
```

### close

关闭数据连接

```javascript
connection.close()
```

## ResultSet

::: tip
columnIndex为索引时，起始索引为1
:::

| 方法                             | 返回值     | 描述                       |
|--------------------------------|---------|--------------------------|
| getString(columnIndex)         | String  | 按照索引或者列名获取String类型的列     |
| getBoolean(columnIndex)        | String  | 按照索引或者列名获取Boolean类型的列    |
| getByte(columnIndex)           | String  | 按照索引或者列名获取Byte类型的列       |
| getShort(columnIndex)          | String  | 按照索引或者列名获取Short类型的列      |
| getInt(columnIndex)            | String  | 按照索引或者列名获取Integer类型的列    |
| getLong(columnIndex)           | String  | 按照索引或者列名获取Long类型的列       |
| getFloat(columnIndex)          | String  | 按照索引或者列名获取Float类型的列      |
| getDouble(columnIndex)         | String  | 按照索引或者列名获取Double类型的列     |
| getBytes(columnIndex)          | String  | 按照索引或者列名获取byte[]类型的列     |
| getDate(columnIndex)           | String  | 按照索引或者列名获取Date类型的列       |
| getTime(columnIndex)           | String  | 按照索引或者列名获取Time类型的列       |
| getTimestamp(columnIndex)      | String  | 按照索引或者列名获取Timestamp类型的列  |
| getObject(columnIndex)         | String  | 按照索引或者列名获取Object类型的列     |
| getBigDecimal(columnIndex)     | String  | 按照索引或者列名获取BigDecimal类型的列 |
| getColumnCount()               | Integer | 返回结果集的列数量                |
| getColumnName(columnIndex)     | String  | 按照索引返回列名                 |
| getColumnTypeName(columnIndex) | String  | 按照索引返回列类型                |

