mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-06 16:48:24 +08:00
doc: 更新 BaseMapper 文档。
This commit is contained in:
parent
e60b17ef71
commit
d161eb45ef
@ -1,6 +1,6 @@
|
||||
- **`deleteById(id)`**: 根据主键删除数据。如果是多个主键的情况下,需要传入数组,例如:`new Integer[]{100,101``。
|
||||
- **`deleteBatchByIds(ids)`**: 根据多个主键批量删除数据。
|
||||
- **`deleteBatchByIds(ids, size)`**: 根据多个主键批量删除数据。
|
||||
- **`deleteByMap(Map<String, whereConditions)`**: 根据 Map 构建的条件来删除数据。
|
||||
- **`deleteByCondition(whereConditions)`**: 根据查询条件来删除数据。
|
||||
- **`deleteByQuery(queryWrapper)`**: 根据查询条件来删除数据。
|
||||
- **`deleteById(id)`**:根据主键删除数据。如果是多个主键的情况下,需要传入数组,例如:`new Integer[]{100,101}`。
|
||||
- **`deleteBatchByIds(ids)`**:根据多个主键批量删除数据。
|
||||
- **`deleteBatchByIds(ids, size)`**:根据多个主键批量删除数据。
|
||||
- **`deleteByMap(whereConditions)`**:根据 Map 构建的条件来删除数据。
|
||||
- **`deleteByCondition(whereConditions)`**:根据查询条件来删除数据。
|
||||
- **`deleteByQuery(queryWrapper)`**:根据查询条件来删除数据。
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
- **`insert(entity)`**: 插入实体类数据,不忽略 `null` 值。
|
||||
- **`insertSelective(entity)`**: 插入实体类数据,但是忽略 `null` 的数据,只对有值的内容进行插入。这样的好处是数据库已经配置了一些默认值,这些默认值才会生效。
|
||||
- **`insert(entity, ignoreNulls)`**: 插入实体类数据。
|
||||
- **`insertWithPk(entity)`**: 插入带有主键的实体类,不忽略 `null` 值。
|
||||
- **`insertSelectiveWithPk(entity)`**: 插入带有主键的实体类,忽略 `null` 值。
|
||||
- **`insertWithPk(entity, ignoreNulls)`**: 带有主键的插入,此时实体类不会经过主键生成器生成主键。
|
||||
- **`insertBatch(entities)`**: 批量插入实体类数据,只会根据第一条数据来构建插入的字段内容。
|
||||
- **`insertBatch(entities, size)`**: 批量插入实体类数据,按 size 切分。
|
||||
- **`insertOrUpdate(entity)`**: 插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 `null` 值。
|
||||
- **`insertOrUpdateSelective(entity)`**: 插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都会忽略 `null` 值。
|
||||
- **`insertOrUpdate(entity, ignoreNulls)`**: 插入或者更新,若主键有值,则更新,若没有主键值,则插入。
|
||||
- **`insert(entity)`**:插入实体类数据,不忽略 `null` 值。
|
||||
- **`insertSelective(entity)`**:插入实体类数据,但是忽略 `null` 的数据,只对有值的内容进行插入。这样的好处是数据库已经配置了一些默认值,这些默认值才会生效。
|
||||
- **`insert(entity, ignoreNulls)`**:插入实体类数据。
|
||||
- **`insertWithPk(entity)`**:插入带有主键的实体类,不忽略 `null` 值。
|
||||
- **`insertSelectiveWithPk(entity)`**:插入带有主键的实体类,忽略 `null` 值。
|
||||
- **`insertWithPk(entity, ignoreNulls)`**:带有主键的插入,此时实体类不会经过主键生成器生成主键。
|
||||
- **`insertBatch(entities)`**:批量插入实体类数据,只会根据第一条数据来构建插入的字段内容。
|
||||
- **`insertBatch(entities, size)`**:批量插入实体类数据,按 size 切分。
|
||||
- **`insertOrUpdate(entity)`**:插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 `null` 值。
|
||||
- **`insertOrUpdateSelective(entity)`**:插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都会忽略 `null`
|
||||
值。
|
||||
- **`insertOrUpdate(entity, ignoreNulls)`**:插入或者更新,若主键有值,则更新,若没有主键值,则插入。
|
||||
|
||||
@ -1,20 +1,20 @@
|
||||
- **`paginate(pageNumber, pageSize, queryWrapper)`**: 分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, queryWrapper)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(pageNumber, pageSize, whereConditions)`**: 分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, whereConditions)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(pageNumber, pageSize, totalRow, queryWrapper)`**: 分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, queryWrapper)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(pageNumber, pageSize, totalRow, whereConditions)`**: 分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, whereConditions)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(page, queryWrapper)`**: 分页查询。
|
||||
- **`paginate(page, queryWrapper, consumers)`**: 分页查询。
|
||||
- **`paginateWithRelations(page, queryWrapper)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(page, queryWrapper, consumers)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateAs(pageNumber, pageSize, queryWrapper, asType)`**: 分页查询。
|
||||
- **`paginateAs(pageNumber, pageSize, totalRow, queryWrapper, asType)`**: 分页查询。
|
||||
- **`paginateAs(page, queryWrapper, asType)`**: 分页查询。
|
||||
- **`paginateAs(page, queryWrapper, asType, consumers)`**: 分页查询。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, queryWrapper, asType)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, totalRow, queryWrapper, asType)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType, consumers)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(pageNumber, pageSize, queryWrapper)`**:分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, queryWrapper)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(pageNumber, pageSize, whereConditions)`**:分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, whereConditions)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(pageNumber, pageSize, totalRow, queryWrapper)`**:分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, queryWrapper)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(pageNumber, pageSize, totalRow, whereConditions)`**:分页查询。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, whereConditions)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginate(page, queryWrapper)`**:分页查询。
|
||||
- **`paginate(page, queryWrapper, consumers)`**:分页查询。
|
||||
- **`paginateWithRelations(page, queryWrapper)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(page, queryWrapper, consumers)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateAs(pageNumber, pageSize, queryWrapper, asType)`**:分页查询。
|
||||
- **`paginateAs(pageNumber, pageSize, totalRow, queryWrapper, asType)`**:分页查询。
|
||||
- **`paginateAs(page, queryWrapper, asType)`**:分页查询。
|
||||
- **`paginateAs(page, queryWrapper, asType, consumers)`**:分页查询。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, queryWrapper, asType)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, totalRow, queryWrapper, asType)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType, consumers)`**:分页查询,及其 Relation 字段内容。
|
||||
|
||||
@ -1,28 +1,36 @@
|
||||
- **`selectOneById(id)`**: 根据主键查询数据。
|
||||
- **`selectOneByMap(Map<String, whereConditions)`**: 根据 Map 构建的条件来查询数据。
|
||||
- **`selectOneByCondition(whereConditions)`**: 根据查询条件查询数据。
|
||||
- **`selectOneByQuery(queryWrapper)`**: 根据查询条件来查询 1 条数据。
|
||||
- **`selectOneByQueryAs(queryWrapper, asType)`**: 根据查询条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByMap(Map<String, whereConditions)`**: 根据 Map 构建的条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByCondition(whereConditions)`**: 根据查询条件查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQuery(queryWrapper)`**: 根据查询条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQueryAs(queryWrapper, asType)`**: 根据查询条件来查询 1 条数据。
|
||||
- **`selectListByIds(ids)`**: 根据多个主键来查询多条数据。
|
||||
- **`selectListByMap(Map<String, whereConditions)`**: 根据 Map 来构建查询条件,查询多条数据。
|
||||
- **`selectListByMap(Map<String, whereConditions, count)`**: 根据 Map 来构建查询条件,查询多条数据。
|
||||
- **`selectListByCondition(whereConditions)`**: 根据查询条件查询多条数据。
|
||||
- **`selectListByCondition(whereConditions, count)`**: 根据查询条件查询多条数据。
|
||||
- **`selectListByQuery(queryWrapper)`**: 根据查询条件查询数据列表。
|
||||
- **`selectListByQuery(queryWrapper, consumers)`**: 根据查询条件查询数据列表。
|
||||
- **`selectListByQueryAs(queryWrapper, asType)`**: 根据查询条件查询数据列表,要求返回的数据为 asType。这种场景一般用在 left join 时,有多出了实体类本身的字段内容,可以转换为 dto、vo 等场景。
|
||||
- **`selectListByQueryAs(queryWrapper, asType, consumers)`**: 根据查询条件查询数据列表,要求返回的数据为 asType 类型。
|
||||
- **`selectListWithRelationsByQuery(queryWrapper)`**: 查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType)`**: 查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType, consumers)`**: 查询实体类及其 Relation 注解字段。
|
||||
- **`selectAll()`**: 查询全部数据。
|
||||
- **`selectAllWithRelations()`**: 查询全部数据,及其 Relation 字段内容。
|
||||
- **`selectObjectByQuery(queryWrapper)`**: 查询第一列返回的数据,QueryWrapper 执行的结果应该只有 1 列,例如:<br>`QueryWrapper.create().select(ACCOUNT.id).where(...);`
|
||||
- **`selectObjectByQueryAs(queryWrapper, asType)`**: 查询第一列返回的数据,QueryWrapper 执行的结果应该只有 1 列,例如:<br>`QueryWrapper.create().select(ACCOUNT.id).where(...);`
|
||||
- **`selectObjectListByQueryAs(queryWrapper, asType)`**: 查询第一列返回的数据集合,QueryWrapper 执行的结果应该只有 1 列,例如:<br>`QueryWrapper.create().select(ACCOUNT.id).where(...);`
|
||||
- **`selectCountByQuery(queryWrapper)`**: 查询数据量。
|
||||
- **`selectCountByCondition(whereConditions)`**: 根据条件查询数据总量。
|
||||
- **`selectOneById(id)`**:根据主键查询数据。
|
||||
- **`selectOneByMap(whereConditions)`**:根据 Map 构建的条件来查询数据。
|
||||
- **`selectOneByCondition(whereConditions)`**:根据查询条件查询数据。
|
||||
- **`selectOneByQuery(queryWrapper)`**:根据查询条件来查询 1 条数据。
|
||||
- **`selectOneByQueryAs(queryWrapper, asType)`**:根据查询条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByMap(whereConditions)`**:根据 Map 构建的条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByCondition(whereConditions)`**:根据查询条件查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQuery(queryWrapper)`**:根据查询条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQueryAs(queryWrapper, asType)`**:根据查询条件来查询 1 条数据。
|
||||
- **`selectListByIds(ids)`**:根据多个主键来查询多条数据。
|
||||
- **`selectListByMap(whereConditions)`**:根据 Map 来构建查询条件,查询多条数据。
|
||||
- **`selectListByMap(whereConditions, count)`**:根据 Map 来构建查询条件,查询多条数据。
|
||||
- **`selectListByCondition(whereConditions)`**:根据查询条件查询多条数据。
|
||||
- **`selectListByCondition(whereConditions, count)`**:根据查询条件查询多条数据。
|
||||
- **`selectListByQuery(queryWrapper)`**:根据查询条件查询数据列表。
|
||||
- **`selectListByQuery(queryWrapper, consumers)`**:根据查询条件查询数据列表。
|
||||
- **`selectCursorByQuery(queryWrapper)`**:根据查询条件查询游标数据,该方法必须在事务中才能正常使用,非事务下无法获取数据。
|
||||
- **`selectRowsByQuery(queryWrapper)`**:根据查询条件查询 Row 数据。
|
||||
- **`selectListByQueryAs(queryWrapper, asType)`**:根据查询条件查询数据列表,要求返回的数据为 asType。这种场景一般用在 left
|
||||
join 时,有多出了实体类本身的字段内容,可以转换为 dto、vo 等场景。
|
||||
- **`selectListByQueryAs(queryWrapper, asType, consumers)`**:根据查询条件查询数据列表,要求返回的数据为 asType 类型。
|
||||
- **`selectListWithRelationsByQuery(queryWrapper)`**:查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType)`**:查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType, consumers)`**:查询实体类及其 Relation 注解字段。
|
||||
- **`selectAll()`**:查询全部数据。
|
||||
- **`selectAllWithRelations()`**:查询全部数据,及其 Relation 字段内容。
|
||||
- **`selectObjectByQuery(queryWrapper)`**:查询第一列返回的数据,QueryWrapper 执行的结果应该只有 1
|
||||
列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);`
|
||||
- **`selectObjectByQueryAs(queryWrapper, asType)`**:查询第一列返回的数据,QueryWrapper 执行的结果应该只有 1
|
||||
列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);`
|
||||
- **`selectObjectListByQuery(queryWrapper)`**:查询第一列返回的数据集合,QueryWrapper 执行的结果应该只有 1
|
||||
列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);`
|
||||
- **`selectObjectListByQueryAs(queryWrapper, asType)`**:查询第一列返回的数据集合,QueryWrapper 执行的结果应该只有 1
|
||||
列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);`
|
||||
- **`selectCountByQuery(queryWrapper)`**:查询数据量。
|
||||
- **`selectCountByCondition(whereConditions)`**:根据条件查询数据总量。
|
||||
|
||||
@ -1,18 +1,18 @@
|
||||
- **`selectOneWithRelationsByMap(Map<String, whereConditions)`**: 根据 Map 构建的条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByCondition(whereConditions)`**: 根据查询条件查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQuery(queryWrapper)`**: 根据查询条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQueryAs(queryWrapper, asType)`**: 根据查询条件来查询 1 条数据。
|
||||
- **`selectListWithRelationsByQuery(queryWrapper)`**: 查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType)`**: 查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType, consumers)`**: 查询实体类及其 Relation 注解字段。
|
||||
- **`selectAllWithRelations()`**: 查询全部数据,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, queryWrapper)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, whereConditions)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, queryWrapper)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, whereConditions)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(page, queryWrapper)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(page, queryWrapper, consumers)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, queryWrapper, asType)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, totalRow, queryWrapper, asType)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType, consumers)`**: 分页查询,及其 Relation 字段内容。
|
||||
- **`selectOneWithRelationsByMap(whereConditions)`**:根据 Map 构建的条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByCondition(whereConditions)`**:根据查询条件查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQuery(queryWrapper)`**:根据查询条件来查询 1 条数据。
|
||||
- **`selectOneWithRelationsByQueryAs(queryWrapper, asType)`**:根据查询条件来查询 1 条数据。
|
||||
- **`selectListWithRelationsByQuery(queryWrapper)`**:查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType)`**:查询实体类及其 Relation 注解字段。
|
||||
- **`selectListWithRelationsByQueryAs(queryWrapper, asType, consumers)`**:查询实体类及其 Relation 注解字段。
|
||||
- **`selectAllWithRelations()`**:查询全部数据,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, queryWrapper)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, whereConditions)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, queryWrapper)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(pageNumber, pageSize, totalRow, whereConditions)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(page, queryWrapper)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelations(page, queryWrapper, consumers)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, queryWrapper, asType)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(pageNumber, pageSize, totalRow, queryWrapper, asType)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType)`**:分页查询,及其 Relation 字段内容。
|
||||
- **`paginateWithRelationsAs(page, queryWrapper, asType, consumers)`**:分页查询,及其 Relation 字段内容。
|
||||
|
||||
@ -1,10 +1,13 @@
|
||||
- **`update(entity)`**: 根据主键来更新数据,若实体类属性数据为 `null`,该属性不会新到数据库。
|
||||
- **`update(entity, ignoreNulls)`**: 根据主键来更新数据到数据库。
|
||||
- **`updateByMap(entity, Map<String, whereConditions)`**: 根据 Map 构建的条件来更新数据。
|
||||
- **`updateByCondition(entity, whereConditions)`**: 根据查询条件来更新数据。
|
||||
- **`updateByCondition(entity, ignoreNulls, whereConditions)`**: 根据查询条件来更新数据。
|
||||
- **`updateByQuery(entity, queryWrapper)`**: 根据查询条件来更新数据。
|
||||
- **`updateByQuery(entity, ignoreNulls, queryWrapper)`**: 根据查询条件来更新数据。
|
||||
- **`updateNumberAddByQuery(fieldName, value, queryWrapper)`**: 执行类似 `update table set field = field + 1 where ... ` 的场景。
|
||||
- **`updateNumberAddByQuery(column, value, queryWrapper)`**: 执行类似 `update table set field = field + 1 where ... ` 的场景。
|
||||
- **`updateNumberAddByQuery(fn, value, queryWrapper)`**: 执行类似 `update table set field = field + 1 where ... ` 的场景。
|
||||
- **`update(entity)`**:根据主键来更新数据,若实体类属性数据为 `null`,该属性不会新到数据库。
|
||||
- **`update(entity, ignoreNulls)`**:根据主键来更新数据到数据库。
|
||||
- **`updateByMap(entity, whereConditions)`**:根据 Map 构建的条件来更新数据。
|
||||
- **`updateByMap(entity, ignoreNulls, whereConditions)`**:根据 Map 构建的条件来更新数据。
|
||||
- **`updateByCondition(entity, whereConditions)`**:根据查询条件来更新数据。
|
||||
- **`updateByCondition(entity, ignoreNulls, whereConditions)`**:根据查询条件来更新数据。
|
||||
- **`updateByQuery(entity, queryWrapper)`**:根据查询条件来更新数据。
|
||||
- **`updateByQuery(entity, ignoreNulls, queryWrapper)`**:根据查询条件来更新数据。
|
||||
- **`updateNumberAddByQuery(fieldName, value, queryWrapper)`**:执行类似 `update table set field = field + 1 where ... `
|
||||
的场景。
|
||||
- **`updateNumberAddByQuery(column, value, queryWrapper)`**:执行类似 `update table set field = field + 1 where ... `
|
||||
的场景。
|
||||
- **`updateNumberAddByQuery(fn, value, queryWrapper)`**:执行类似 `update table set field = field + 1 where ... ` 的场景。
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user