mybatis-flex笔记
MyBatis-Flex 的增删改功能 - MyBatis-Flex 官方网站https://mybatis-flex.com/zh/base/add-delete-update.html
代码https://gitee.com/hntianshu/mybatis-flex-test
一 新增数据
不忽略
null
值。 就是允许有null忽略null 就是不允许有null
BaseMapper
的接口提供了 insert 和 insertBatch 方法,用于新增数据;
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. insert(entity)
:插入实体类数据,不忽略 null
值。
@Autowiredprivate AccountMapper accountMapper; @Testvoid insert() {Account account = new Account(16, "哈皮", null, LocalDateTime.now()); //还是自增//INSERT INTO `tb_account`(`user_name`, `age`, `birthday`) VALUES (?, ?, ?)//Parameters: 哈皮(String), null, 2024-01-02T09:42:14.063491400(LocalDateTime)int row = accountMapper.insert(account);System.err.println("新增数量:" + row + "条");}
2.insertSelective(entity)
:插入实体类数据,但是忽略 null
的数据,只对有值的内容进行插入。这样的好处是数据库已经配置了一些默认值,这些默认值才会生效。
/*** insertSelective(entity):插入实体类数据,但是忽略 null 的数据,只对有值的内容进行插入。这样的好处是数据库已经配置了一些默认值,这些默认值才会生效。*/@Testvoid insertSelective() {Account account = new Account(null, "赵华", null, LocalDateTime.now());//Preparing: INSERT INTO `tb_account`(`user_name`, `birthday`) VALUES (?, ?)//Parameters: 赵华(String), 2024-01-02T09:44:54.492425100(LocalDateTime)int row = accountMapper.insertSelective(account);System.err.println("新增数量:" + row + "条");}
3. insert(entity, ignoreNulls):插入实体类数据。
- ignoreNulls: false相当于
insert(entity)
- ignoreNulls: true相当于
insertSelective(entity)
/*** insert(entity, ignoreNulls):插入实体类数据。* ignoreNulls: false相当于 insert(entity)* ignoreNulls: true相当于 insertSelective(entity)*/@Testvoid insert2() {Account account = new Account(null, "赵华", null, LocalDateTime.now());int row = accountMapper.insert(account, true);System.err.println("新增数量:" + row + "条");}
4.insertWithPk(entity):插入带有主键的实体类,不忽略 null 值。
/*** insertWithPk(entity):插入带有主键的实体类,不忽略 null 值。*/@Testvoid insertWithPk() {Account account = new Account(null, "赵华", null, LocalDateTime.now());int row = accountMapper.insertWithPk(account);System.err.println("新增数量:" + row + "条");}
5. insertSelectiveWithPk(entity):插入带有主键的实体类,忽略 null 值。 相当于insertWithPk(entity, true)
/*** insertSelectiveWithPk(entity):插入带有主键的实体类,忽略 null 值。* 相当于insertWithPk(entity, true)*/@Testvoid insertSelectiveWithPk() {Account account = new Account(5, "赵华", null, LocalDateTime.now());int row = accountMapper.insertSelectiveWithPk(account);System.err.println("新增数量:" + row + "条");}
6.insertWithPk(entity, ignoreNulls)
:带有主键的插入,此时实体类不会经过主键生成器生成主键。
insertWithPk = insertWithPk(entity, false)insertSelectiveWithPk = insertWithPk(entity, true)
/*** insertWithPk(entity, ignoreNulls):带有主键的插入,此时实体类不会经过主键生成器生成主键。* insertWithPk = insertWithPk(entity, false)* insertSelectiveWithPk = insertWithPk(entity, true)*/@Testvoid insertWithPk2() {Account account = new Account(5, "赵华", null, LocalDateTime.now());int row = accountMapper.insertWithPk(account, true);System.err.println("新增数量:" + row + "条");}
7.insertBatch(entities):批量插入实体类数据,只会根据第一条数据来构建插入的字段内容。
只会根据字段数量最多的数据来构建插入的字段内容不忽略null
/*** insertBatch(entities):批量插入实体类数据,只会根据第一条数据来构建插入的字段内容。* 只会根据字段数量最多的数据来构建插入的字段内容* 不忽略null*/@Testvoid insertBatch() {ArrayList<Account> list = new ArrayList<>();list.add(new Account(null, "林一", 25, LocalDateTime.now()));list.add(new Account(null, null, null, null));list.add(new Account("王五", 23, LocalDateTime.now()));int row = accountMapper.insertBatch(list);System.err.println("新增数量:" + row + "条");}
8. insertBatch(entities, size):批量插入实体类数据,按 size 切分。分开插入 n条做切分
/*** insertBatch(entities, size):批量插入实体类数据,按 size 切分。* 分开插入 n条做切分*/@Testvoid insertBatch2() {ArrayList<Account> list = new ArrayList<>();list.add(new Account(null, "剑一", 25, LocalDateTime.now()));list.add(new Account(null, "剑二", 25, LocalDateTime.now()));list.add(new Account(null, "剑三", 25, LocalDateTime.now()));int row = accountMapper.insertBatch(list, 2);System.err.println("新增数量:" + row + "条");}
9.insertOrUpdate(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 null 值。
/*** insertOrUpdate(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 null 值。*/@Testvoid insertOrUpdate() {Account account = new Account(56, "林二", 25, LocalDateTime.now());int row = accountMapper.insertOrUpdate(account);System.err.println("新增/更新 数量:" + row + "条");}
10.insertOrUpdateSelective(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都会忽略 null 值。
/*** insertOrUpdateSelective(entity):插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都会忽略 null 值。*/@Testvoid insertOrUpdateSelective() {Account account = new Account(56, "林二", null, LocalDateTime.now());int row = accountMapper.insertOrUpdateSelective(account);System.err.println("新增/更新 数量:" + row + "条");}
11. insertOrUpdate(entity, ignoreNulls)
:插入或者更新,若主键有值,则更新,若没有主键值,则插入。
/*** insertOrUpdate(entity, ignoreNulls):插入或者更新,若主键有值,则更新,若没有主键值,则插入。* insertOrUpdate = insertOrUpdate(entity, false)* insertOrUpdateSelective = insertOrUpdate(entity, true)*/@Testvoid insertOrUpdate2() {Account account = new Account(56, "林二", null, LocalDateTime.now());int row = accountMapper.insertOrUpdate(account, false);System.err.println("新增/更新 数量:" + row + "条");}
12.用 UpdateWrapper 新增数据
/*** 用 UpdateWrapper 新增数据* INSERT INTO `tb_account`(`user_name`, `birthday`)* VALUES (?, now())*/@Testpublic void testInsertWithRaw() {Account account = new Account();account.setUserName("剑一");Account newAccount = UpdateWrapper.of(account)
// .setRaw("birthday", "now()")
// .setRaw(ACCOUNT.BIRTHDAY, "now()").setRaw(Account::getBirthday, "now()").toEntity();int row = accountMapper.insert(newAccount);System.err.println("新数量:" + row + "条");}/*** 用 UpdateWrapper 新增数据 复杂一点* INSERT INTO `tb_account`(`user_name`, `birthday`)* VALUES (?, (select xxx from ...))*/@Testpublic void testInsertWithRaw2() {Account account = new Account();account.setUserName("剑二");Account newAccount = UpdateWrapper.of(account).setRaw(Account::getBirthday, "(select a.birthday from (SELECT birthday FROM tb_account where id = 1)" +" a )").toEntity();int row = accountMapper.insert(newAccount);System.err.println("新数量:" + row + "条");}
二 删除数据
不忽略
null
值。 就是允许有null忽略null 就是不允许有null
BaseMapper
的接口提供了 deleteById、deleteBatchByIds、deleteByMap、deleteByQuery 方法,用于删除数据;
deleteById(id)
:根据主键删除数据。如果是多个主键的情况下,需要传入数组,例如:new Integer[]{100,101}
。delete(entity)
:根据实体主键来删除数据。相比deleteById(id),此方法更便于对复合主键实体类的删除。deleteBatchByIds(ids)
:根据多个主键批量删除数据。deleteBatchByIds(ids, size)
:根据多个主键批量删除数据。deleteByMap(whereConditions)
:根据 Map 构建的条件来删除数据。deleteByCondition(whereConditions)
:根据查询条件来删除数据。deleteByQuery(queryWrapper)
:根据查询条件来删除数据。
1. deleteById(id)
:根据主键删除数据。如果是多个主键的情况下,需要传入数组,例如:new Integer[]{100,101}
。
/*** deleteById(id):根据主键删除数据。如果是多个主键的情况下,需要传入数组,例如:new Integer[]{100,101}。*/@Testpublic void deleteById() {int row = accountMapper.deleteById(59);System.err.println("删除数量:" + row + "条");}
2. deleteBatchByIds(ids)
:根据多个主键批量删除数据。
/*** deleteBatchByIds(ids):根据多个主键批量删除数据。*/@Testpublic void deleteBatchByIds() {List<Integer> array = new ArrayList<Integer>();array.add(59);array.add(60);array.add(61);int row = accountMapper.deleteBatchByIds(array);System.err.println("删除数量:" + row + "条");}
3. deleteBatchByIds(ids, size):根据多个主键批量删除数据。 分片删除
/*** deleteBatchByIds(ids, size):根据多个主键批量删除数据。 分片删除*/@Testpublic void deleteBatchByIds2() {List<Integer> array = new ArrayList<Integer>();array.add(62);array.add(64);array.add(65);int row = accountMapper.deleteBatchByIds(array, 2);System.err.println("删除数量:" + row + "条");}
4. deleteByMap(whereConditions)
:根据 Map 构建的条件来删除数据。
/*** deleteByMap(whereConditions):根据 Map 构建的条件来删除数据。*/@Testpublic void deleteByMap() {//条件 where id =63 and age = 18Map<String, Object> map = new HashMap<>();map.put("id", 63);map.put("age", 18);int row = accountMapper.deleteByMap(map);System.err.println("删除数量:" + row + "条");}
5.deleteByCondition(whereConditions):根据查询条件来删除数据。
/*** deleteByCondition(whereConditions):根据查询条件来删除数据。* ge >=* le <=* gt >* eq =* lt <* notIN*/@Testpublic void deleteByCondition() {//accountMapper.deleteByCondition(ACCOUNT.ID.ge(100));
// int row = accountMapper.deleteByCondition(ACCOUNT.ID.in(67,69));int row = accountMapper.deleteByCondition(ACCOUNT.ID.eq(70));System.err.println("删除数量:" + row + "条");}
6.deleteByQuery(queryWrapper):根据查询条件来删除数据。
/*** deleteByQuery(queryWrapper):根据查询条件来删除数据。*/@Testpublic void deleteByQuery() {QueryWrapper queryWrapper = QueryWrapper.create();queryWrapper.where(ACCOUNT.ID.ge(66));//通过 queryWrapper 删除int row = accountMapper.deleteByQuery(queryWrapper);System.err.println("删除数量:" + row + "条");}
三 更新数据
不忽略
null
值。 就是允许有null忽略null 就是不允许有null
BaseMapper
的接口提供了 update、updateByMap、updateByQuery 方法,用于更新数据;
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 ...
的场景。
1.update(entity)
:根据主键来更新数据,若实体类属性数据为 null
,该属性不会更新到数据库。
/*** update(entity):根据主键来更新数据,若实体类属性数据为 null,该属性不会更新到数据库。*/@Testpublic void update() {Account account = new Account();account.setUserName("小明");account.setAge(18);account.setBirthday(LocalDateTime.now());account.setId(72);int row = accountMapper.update(account);System.err.println("修改数量:" + row + "条");}
2.update(entity, ignoreNulls):根据主键来更新数据到数据库。
/*** update(entity, ignoreNulls):根据主键来更新数据到数据库。*/@Testpublic void update2() {Account account = new Account();account.setUserName("小明1");account.setId(72);int row = accountMapper.update(account,false);System.err.println("修改数量:" + row + "条");}
3.updateByMap(entity, whereConditions):根据 Map 构建的条件来更新数据。不忽略NUll
/*** updateByMap(entity, whereConditions):根据 Map 构建的条件来更新数据。* 不忽略NUll**/@Testpublic void updateByMap() {Account account = new Account();account.setUserName("小明2");Map<String, Object> map = new HashMap<>();map.put("id","72");int row = accountMapper.updateByMap(account,map);System.err.println("修改数量:" + row + "条");}
4.updateByMap(entity, ignoreNulls, whereConditions):根据 Map 构建的条件来更新数据。 忽略null
/*** updateByMap(entity, ignoreNulls, whereConditions):根据 Map 构建的条件来更新数据。* 忽略null*/@Testpublic void updateByMap2() {Account account = new Account();
// account.setUserName("小明2");account.setUserName(null); //会报错Map<String, Object> map = new HashMap<>();map.put("id","72");int row = accountMapper.updateByMap(account,true,map);System.err.println("修改数量:" + row + "条");}
5.updateByCondition(entity, whereConditions):根据查询条件来更新数据。 不忽略NUll
/*** updateByCondition(entity, whereConditions):根据查询条件来更新数据。* 不忽略NUll*/@Testpublic void updateByCondition() {Account account = new Account();account.setUserName("剑南山2");
// account.setUserName(null); //会报错// update tb_account set user_name="剑南山2" , age=21 where id = 73
// int row = accountMapper.updateByCondition(account,ACCOUNT.ID.eq("73"));// update tb_account set user_name="剑南山2" , age=21 where id > 73int row = accountMapper.updateByCondition(account,ACCOUNT.ID.gt(73));System.err.println("修改数量:" + row + "条");}
6.updateByCondition(entity, ignoreNulls, whereConditions):根据查询条件来更新数据。忽略NUll,传入空不修改
/*** updateByCondition(entity, ignoreNulls, whereConditions):根据查询条件来更新数据。* 忽略NUll,传入空不修改*/@Testpublic void updateByCondition2() {Account account = new Account();account.setUserName(null); //默认不修改account.setAge(18);
// account.setUserName(null); //会报错// update tb_account set age=18 where id = 73
// int row = accountMapper.updateByCondition(account,ACCOUNT.ID.eq("73"));// update tb_account set age=18 where id > 73int row = accountMapper.updateByCondition(account,true,ACCOUNT.ID.gt(73));System.err.println("修改数量:" + row + "条");}
7.updateByQuery(entity, queryWrapper):根据查询条件来更新数据。不忽略NUll
/*** updateByQuery(entity, queryWrapper):根据查询条件来更新数据。* 不忽略NUll*/@Testpublic void updateByQuery() {Account account = new Account();account.setUserName("神奇的小鱼人");account.setAge(20);QueryWrapper queryWrapper = new QueryWrapper();// update tb_account set user_name="神奇的小鱼人" , age=21 where id = 73 or id = 74queryWrapper.where(ACCOUNT.ID.eq(73)).or(ACCOUNT.ID.eq(74));int row = accountMapper.updateByQuery(account,queryWrapper);System.err.println("修改数量:" + row + "条");}
7.updateByQuery(entity, ignoreNulls, queryWrapper):根据查询条件来更新数据。 忽略NUll
/*** updateByQuery(entity, ignoreNulls, queryWrapper):根据查询条件来更新数据。* 忽略NUll*/@Testpublic void updateByQuery2() {Account account = new Account();account.setUserName(null); //忽略NULL 不进行updateaccount.setAge(20);QueryWrapper queryWrapper = new QueryWrapper();// update tb_account set age=21 where id = 73 or id = 74queryWrapper.where(ACCOUNT.ID.eq(73)).or(ACCOUNT.ID.eq(74));int row = accountMapper.updateByQuery(account,queryWrapper);System.err.println("修改数量:" + row + "条");}
8.updateByQuery(entity, ignoreNulls, queryWrapper):根据查询条件来更新数据。 不忽略NUll
/*** updateByQuery(entity, ignoreNulls, queryWrapper):根据查询条件来更新数据。* ignoreNulls:false 忽略NUll* ignoreNulls:true 不忽略NUll**/@Testpublic void updateByQuery2() {Account account = new Account();account.setUserName(null); //忽略NULL 不进行updateaccount.setAge(20);QueryWrapper queryWrapper = new QueryWrapper();// update tb_account set age=21 where id = 73 or id = 74queryWrapper.where(ACCOUNT.ID.eq(73)).or(ACCOUNT.ID.eq(74));int row = accountMapper.updateByQuery(account,false,queryWrapper);System.err.println("修改数量:" + row + "条");}
9. 部分字段更新 update
(1) 部分字段
在很多场景下,我们希望只更新部分字段,而更新的字段中,一些为 null,一些非 null。此时需要用到
UpdateEntity
工具类,以下是示例代码:以下的示例中,会把 id (主键)为 100 这条数据中的 user_name 字段更新为 null,age 字段更新为 10,其他字段不会被更新。
也就是说,通过 UpdateEntity 创建的对象,只会更新调用了 setter 方法的字段,若不调用 setter 方法,不管这个对象里的属性的值是什么,都不会更新到数据库。
/*** updateByQuery(entity, ignoreNulls, queryWrapper):根据查询条件来更新数据。* 不忽略NUll*/@Testpublic void UpdateEntity () {//update tb_account//set user_name = ?, age = ? where id = ?//#参数: null,10,100//写法1 不忽略NUll
// Account account = UpdateEntity.of(Account.class, 100);//写法2 不忽略NUll
// Account account = UpdateEntity.of(Account.class);
// account.setId(74);//写法3 忽略null//update tb_account//set age = ? where id = ?//#参数: 10,100Account account = new Account();account.setId(74);account.setUserName(null);account.setAge(11);int row = accountMapper.update(account);System.err.println("修改数量:" + row + "条");}
(2) 部分字段更新(增强)
/*** 部分字段更新(增强)*/@Testpublic void UpdateEntity2 () {Account account = UpdateEntity.of(Account.class, 100);account.setUserName(null);// 通过 UpdateWrapper 操作 account 数据UpdateWrapper wrapper = UpdateWrapper.of(account);wrapper.setRaw("age", "age + 1");accountMapper.update(account);// update tb_account//set user_name = null, age = age + 1 where id = 100int row = accountMapper.update(account);System.err.println("修改数量:" + row + "条");}
(3) 更高级的用法
/*** 更高级的用法2*/@Testpublic void UpdateEntity4 () {Account account = UpdateEntity.of(Account.class, 100);// account.setUserName("Michael2");
// 通过 UpdateWrapper 操作 account 数据UpdateWrapper wrapper = UpdateWrapper.of(account);
// wrapper.setRaw(ACCOUNT.AGE, "(select a.age from (select age from tb_account where id = 101) a )");wrapper.set(ACCOUNT.USER_NAME, "(select name from tb_account where id = 101)");accountMapper.update(account);int row = accountMapper.update(account);System.err.println("修改数量:" + row + "条");}
10. 链式修改-UpdateChain
UpdateChain 是一个对
UpdateEntity
、UpdateWrapper
等进行封装的一个工具类,方便用户用于进行链式操作。假设我们要更新
Account
的userName
为 "张三
",更新年龄在之前的基础上加 1,更新代码如下:
/*** UpdateChain 是一个对 UpdateEntity、UpdateWrapper 等进行封装的一个工具类,方便用户用于进行链式操作。* 不忽略空* UPDATE `tb_account` SET `user_name` = '张三' , `age` = age + 1* WHERE `id` = 1** UPDATE `tb_account` SET `user_name` = null , `age` = age + 1* WHERE `id` = 1*/@Testpublic void testUpdateChain() {UpdateChain.of(Account.class)
// .set(Account::getUserName, "张三").set(Account::getUserName, null).setRaw(Account::getAge, "age + 1").where(Account::getId).eq(1).update();}
/*** 假设我们要更新 Account 的 userName 为 "张三",更新年龄在之前的基础上加 1,更新代码如下:* UPDATE `tb_account` SET `age` = `age` + 1* WHERE `id` >= 100 AND `age` = 18**/@Testpublic void testUpdateChain2() {//更新数据UpdateChain.of(Account.class).set(Account::getAge, ACCOUNT.AGE.add(1)).where(Account::getId).ge(100).and(Account::getAge).eq(18).update();//查询所有数据并打印QueryChain.of(accountMapper).where(Account::getId).ge(100).and(Account::getAge).eq(18).list().forEach(System.out::println);}
四 基础查询
单条数据查询
在 MyBatis-Flex 的 BaseMapper
中,提供了如下的功能用于查询数据库的数据:
selectOneById(id)
:根据主键查询数据。selectOneByEntityId(entity)
:根据实体主键查询数据,便于对复合主键实体类的查询。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. selectOneById(id):根据主键查询数据。
/*** selectOneById(id):根据主键查询数据。*/@Testpublic void testUpdateChain() {Account account = accountMapper.selectOneById(1L);System.err.println("==============");System.err.println(account);System.err.println("==============");}
2.selectOneByEntityId(entity)
:根据实体主键查询数据,便于对复合主键实体类的查询。
- 只能根据主键查询
/*** selectOneByEntityId(entity):根据实体主键查询数据,便于对复合主键实体类的查询。*/@Testpublic void selectOneByEntityId() {Account param = new Account();param.setId(1);Account account = accountMapper.selectOneByEntityId(param);System.err.println("==============");System.err.println(account);System.err.println("==============");Account param2 = new Account();param.setAge(18);param.setUserName("剑南山2");Account account2 = accountMapper.selectOneByEntityId(param2);System.err.println("==============");System.err.println(account2);System.err.println("==============");}
3.selectOneByMap(whereConditions)
:根据 Map 构建的条件来查询数据。
/*** selectOneByMap(whereConditions):根据 Map 构建的条件来查询数据。* * selectOneByMap(Map<String, Object> whereConditions)*/@Testpublic void selectOneByMap() {Map<String,Object> param = new HashMap<>();param.put("id",2);param.put("user_name","李四");Account account = accountMapper.selectOneByMap(param);System.err.println("==============");System.err.println(account);System.err.println("==============");}
4.selectOneByCondition(whereConditions):根据查询条件查询数据。
/*** selectOneByCondition(whereConditions):根据查询条件查询数据。** selectOneByCondition(QueryCondition whereConditions)*/@Testpublic void selectOneByCondition() {Account account = accountMapper.selectOneByCondition(ACCOUNT.ID.eq(2).or(ACCOUNT.ID.eq(1)));System.err.println("==============");System.err.println(account);System.err.println("==============");}
5. selectOneByQuery(queryWrapper):根据查询条件来查询 1 条数据。
/*** selectOneByQuery(queryWrapper):根据查询条件来查询 1 条数据。* selectOneByQuery(QueryWrapper queryWrapper)*/@Testpublic void selectOneByQuery() {QueryWrapper param = new QueryWrapper();// where id = 1
// param.where(ACCOUNT.ID.eq(1));//SELECT `id`, `user_name`, `age`, `birthday` FROM `tb_account` WHERE `user_name` LIKE ? LIMIT 1//Parameters: %李四%(String)param.where(ACCOUNT.USER_NAME.like("李四"));Account account = accountMapper.selectOneByQuery(param);System.err.println("==============");System.err.println(account);System.err.println("==============");}
6. selectOneWithRelationsByMap(whereConditions):根据 Map 构建的条件来查询 1 条数据。
/*** selectOneWithRelationsByMap(whereConditions):根据 Map 构建的条件来查询 1 条数据。** selectOneWithRelationsByMap(Map<String, Object> whereConditions)*/@Testpublic void selectOneWithRelationsByMap() {Map<String,Object> param = new HashMap<>();param.put("id",1);// Preparing: SELECT `id`, `user_name`, `age`, `birthday` FROM `tb_account` WHERE `tb_account`.`id` = ? LIMIT 1// Parameters: 1(Integer)Account account = accountMapper.selectOneWithRelationsByMap(param);System.err.println("==============");System.err.println(account);System.err.println("==============");}
7.selectOneWithRelationsByCondition(whereConditions):根据查询条件查询 1 条数据。
/*** selectOneWithRelationsByCondition(whereConditions):根据查询条件查询 1 条数据。*/@Testpublic void selectOneWithRelationsByCondition() { // Preparing: SELECT `id`, `user_name`, `age`, `birthday` FROM `tb_account` WHERE `tb_account`.`id` = ? LIMIT 1// Parameters: 1(Integer)Account account = accountMapper.selectOneWithRelationsByCondition(ACCOUNT.ID.eq(1));System.err.println("==============");System.err.println(account);System.err.println("==============");}
8.selectOneWithRelationsByQuery(queryWrapper):根据查询条件来查询 1 条数据。
/*** selectOneWithRelationsByQuery(queryWrapper):根据查询条件来查询 1 条数据。*/@Testpublic void selectOneWithRelationsByQuery() {// Preparing: SELECT `id`, `user_name`, `age`, `birthday` FROM `tb_account` WHERE `tb_account`.`id` = ? LIMIT 1// Parameters: 1(Integer)QueryWrapper param = new QueryWrapper();param.where(ACCOUNT.ID.eq(1));Account account = accountMapper.selectOneWithRelationsByQuery(param);System.err.println("==============");System.err.println(account);System.err.println("==============");}
9.selectOneWithRelationsByQueryAs(queryWrapper, asType):根据查询条件来查询 1 条数据。
/*** selectOneWithRelationsByQueryAs(queryWrapper, asType):根据查询条件来查询 1 条数据。*/@Testpublic void selectOneWithRelationsByQueryAs() {// Preparing: SELECT `id`, `user_name`, `age`, `birthday` FROM `tb_account` WHERE `tb_account`.`id` = ? LIMIT 1// Parameters: 1(Integer)QueryWrapper param = new QueryWrapper();param.where(ACCOUNT.ID.eq(1));Account account = accountMapper.selectOneWithRelationsByQueryAs(param,Account.class);System.err.println("==============");System.err.println(account);System.err.println("==============");}
多条数据查询
1.selectListByIds(ids):根据多个主键来查询多条数据。
/*** selectListByIds(ids):根据多个主键来查询多条数据。* selectListByIds(@Param("$$primaryValue") Collection<? extends Serializable> var1)*/@Testpublic void selectListByIds() {List<Integer> param = Arrays.asList(1, 2);//Preparing: SELECT `id`, `user_name`, `age`, `birthday` FROM `tb_account` WHERE `id` = ? OR `id` = ?//Parameters: 1(Integer), 2(Integer)//==============//Account(id=1, userName=null, age=20, birthday=2020-01-11T00:00)//Account(id=2, userName=李四, age=19, birthday=2021-03-21T00:00)//==============List<Account> accounts = accountMapper.selectListByIds(param);System.err.println("==============");accounts.forEach(System.err::println);System.err.println("==============");}
2.selectListByMap(whereConditions):根据 Map 来构建查询条件,查询多条数据。
/*** selectListByMap(whereConditions):根据 Map 来构建查询条件,查询多条数据。*/@Testpublic void selectListByMap() {Map<String, Object> param = new HashMap<>();param.put("user_name","剑南山2");//Preparing: SELECT `id`, `user_name`, `age`, `birthday` FROM `tb_account` WHERE `tb_account`.`user_name` = ?//Parameters: 剑南山2(String)//==============//Account(id=99, userName=剑南山2, age=18, birthday=2023-12-29T18:17:31)//Account(id=101, userName=剑南山2, age=19, birthday=2020-01-11T00:00)//==============List<Account> accounts = accountMapper.selectListByMap(param);System.err.println("==============");accounts.forEach(System.err::println);System.err.println("==============");}
相关文章:
mybatis-flex笔记
MyBatis-Flex 的增删改功能 - MyBatis-Flex 官方网站https://mybatis-flex.com/zh/base/add-delete-update.html 代码https://gitee.com/hntianshu/mybatis-flex-test 一 新增数据 不忽略 null 值。 就是允许有null 忽略null 就是不允许有null BaseMapper 的接口提供了 inser…...
Debezium发布历史47
原文地址: https://debezium.io/blog/2019/02/13/debezium-0-9-1-final-released/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Debezium 0.9.1.Final 发布 二月 13, 2019 作者: Gunna…...
Python爬虫抓包常见问题解决
对于Python爬虫和Fiddler抓包,可能遇到的问题及解决: 代理设置错误:如果你在使用Python爬虫时遇到抓不到包的问题,首先应该检查你的浏览器代理设置是否正确。以Chrome为例,代理设置为:右上角菜单按钮>设…...
c++跨平台ui
fltk https://gitee.com/mirrors_fltk/fltk.git codeblock中有fltk项目开发模板,可以快速构建项目 wxwidget https://gitee.com/sofu456/wxWidgets.git git submodule update --init --recursive 打开demo和sample set(wxBUILD_SAMPLES ALL) set(wxBUILD_DEMOS ON) build/…...
stable diffusion 基础教程-提示词之艺术风格用法
展现夕阳 golden hour, (rim lighting):1.2, warm tones, sun flare, soft shadows, vibrant colors, hazy glow, painterly effect, dreamy atmosphere阴影 chiaroscuro, (high contrast):1.2, dramatic shadows, bold highlights, moody atmosphere, captivating inte…...
【日积月累】Java中 正则表达式
目录 日积月累】Java中 正则表达式 1.前言2.基本语法3.Pattern和Matcher类4.校验的表达式大全5.参考文章所属专区 日积月累 1.前言 正则表达式是一种用于匹配文本模式的语法,它通常与编程语言一起使用。在Java中,正则表达式用于匹配字符串,可以使用Pattern和Matcher类来实…...
Java调用百度云语音识别【音频转写】
百度云文档 ttps://ai.baidu.com/ai-doc/SPEECH/Bk5difx01 示例代码: import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.json.JSONObject; import org.springframework.stereotyp…...
pyparamvalidate 项目背景和需求分析
目录 一、前置说明1、总体目录2、本节目标 二、项目背景三、需求分析三、后置说明1、要点小结2、下节预告 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器,从编码到发布全过程》 2、本节目标 阐述 pyparamvalidate 项目背景和需求分析。 二、项目背景…...
Docker Linux快速安装及Nginx部署
前言 最近正在部署一套新的Linux服务器环境,基于Docker来部署所有的应用,顺便整理了一套经过验证的操作手册,以便大家遇到类似需求时,可以直接拿来用。 本文会涉及以下知识点:Docker的Linux安装和卸载、Docker用户组…...
Mac M1 Parallels CentOS7.9 Install Parallels Tools
一、挂载parallels-tools安装包 mkdir /media/cdrom/ mount /dev/cdrom /media/cdrom/ mount: /dev/sr0 写保护,将以只读方式挂载二、GCC升级 yum install -y centos-release-scl yum install -y devtoolset-8-gcc*# 切换当前会话中gcc版本为8 scl enable devtool…...
计算机网络物理层 习题答案及解析
2-1 下列选项中,不属于物理层接口规范定义范畴的是( D )。 A. 引脚功能 B. 接口形状 C. 信号电平 D. 传输媒体 【答案】D 【解析】 2-2 某网络在物理层规定,信号的电平范围为- 15V~15V , 电线长…...
【解决】Unity 设置跨设备分辨率表现
开发平台:Unity 2018版本以上 开发语言:CSharp 编程平台:Visual Studio 2022 问题描述 使用 UnityEngine.dll 中关于设置分辨率的方法时,无法满足应用以设定分辨率进行屏幕显示问题。因而造成画面不同程度的拉伸情况。而这种情…...
基于单片机的智能衣柜设计
一、摘要 随着科技的不断发展,人们对于生活品质的要求越来越高。智能衣柜作为智能家居的一个重要组成部分,能够为用户提供便捷、个性化的衣物管理服务。本文主要研究了基于单片机的智能衣柜设计,通过对硬件系统和软件系统的设计与实现&#…...
HttpSession的使用
1 HttpSession 概述 在 Java Servlet API 中引入 session 机制来跟踪客户的状态。session 指的是在一段时间内,单个客户与 Web 服务器的一连串相关的交互过程。在一个 session 中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同…...
人工智能在金融领域的应用存在的4大挑战
金融服务供应商应该有计划地应对AI面临的难题 金融行业投资人工智能热潮带来有关数据安全和透明度的新问题。由于数据管理实践随着新的 AI 解决方案的引入而不断发展,应对这些新问题以及金融服务领域 AI 面临的其他挑战尤为重要。各组织必须认识到可能面临以下挑战…...
EasyExcel写出包含多个sheet页的Excel
https://blog.csdn.net/qq_38751895/article/details/131852740...
分类预测 | Matlab实现RP-CNN-LSTM-Attention递归图优化卷积长短期记忆神经网络注意力机制的数据分类预测【24年新算法】
分类预测 | Matlab实现RP-CNN-LSTM-Attention递归图优化卷积长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现RP-CNN-LSTM-Attention递归图优化卷积长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述模型描述程…...
【教学类-09-04】20240102《游戏棋N*N》数字填写,制作棋子和骰子
作品展示 背景需求: 最近在清理学具材料库,找到一套1年多前的《N*N游戏棋》,把没有用完的棋盘拿出来,,想给大4班换花样,并把它们用掉。 程序代码在这里 【教学类-09-03】20221120《游戏棋10*10数字如何直接…...
【flink番外篇】9、Flink Table API 支持的操作示例(14)- 时态表的join(java版本)
Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的…...
【leetcode100-30】【链表】两两交换链表节点
【题干】 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 【思路】 先说递归的,退出条件很明显,当剩…...
小秋SLAM入门实战ubuntu所有文章汇总
Ubuntu系统安装详细教程 Ubuntu系统安装ROS详细教程 Ubuntu系统下如何搭建深度学习和SLAM开发环境 Ubuntu系统搭建SLAM开发环境 ubuntu 终端如何停止快速打印的输出以及恢复命令 ubuntu 终端如何快速打开当前路径下的图形化窗口界面? killall -9用途用法 ps -xu | …...
深度学习课程实验二深层神经网络搭建及优化
一、 实验目的 1、学会训练和搭建深层神经网络; 2、掌握超参数调试正则化及优化。 二、 实验步骤 初始化 1、导入所需要的库 2、搭建神经网络模型 3、零初始化 4、随机初始化 5、He初始化 6、总结三种不同类型的初始化 正则化 1、导入所需要的库 2、使用非正则化…...
Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)
这个是继上一篇文章 “Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (一)” 的续篇。在今天的文章中,我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此࿰…...
力扣labuladong——一刷day84
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣743. 网络延迟时间 前言 Dijkstra 算法(一般音译成迪杰斯特拉算法)无非就是一个 BFS 算法的加强版,它们都是从二叉…...
Linux环境vscode clang-format格式化:vscode clang format command is not available
问题现象 vscode安装了clang-format插件,但是使用就报错 问题原因 设置中配置的clang-format插件工具路径不正确。 解决方案 确认本地安装了clang-format工具:终端输入clang-format(也可能是clang-format-13等版本,建议tab自…...
【KingbaseES】实现MySql函数WEEKS_BETWEEN
WEEKS_BETWEEN CREATE OR REPLACE FUNCTION weeks_between(start_date date, end_date date) RETURNS integer AS $$ BEGIN RETURN EXTRACT(WEEK FROM end_date) - EXTRACT(WEEK FROM start_date); END; $$ LANGUAGE plpgsql IMMUTABLE;结果展示...
@Scheduled定时任务现状与改进
项目场景: 定时任务现状:每个项目都会有一些配置信息,这些信息我们是都放在一个配置服务中,这个服务会定时从配置表中加载所有配置存入本地JVM内存,以供调用方获取(调用方集成了配置服务的SDK,…...
python+selenium爬虫笔记
本文只是做例子,具体网站路径麻烦你们换下,还有xpath路径也换下 一、安装所需要的组件(此处采用谷歌) 1、安装驱动 查看你的浏览器版本,去安装对应的版本 下载驱动 下载驱动路径 之前版本的 输入这个路径下载下来解压…...
【LMM 009】MiniGPT-4:使用 Vicuna 增强视觉语言理解能力的多模态大模型
论文描述:MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models 论文作者:Deyao Zhu∗ Jun Chen∗ Xiaoqian Shen Xiang Li Mohamed Elhoseiny 作者单位:King Abdullah University of Science and Techn…...
SpringBoot学习(三)-整合JDBC、Druid、MyBatis
注:此为笔者学习狂神说SpringBoot的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!! 一、整合JDBC使用(理解) 创建项目 勾选依赖启动器 查看依赖 …...
个体工商户做网站/seo专员是什么意思
按照先后顺序:1,静态先于非静态代码库执行(静态代码块随着类的加载而加载,初始化只执行一次)2,父类先于子类3,非静态代码块优于构造函数执行所以执行顺序如下:父类B静态代…...
男子做网站/seo优化网络公司排名
VS2010自定义添加创建者、创建时间等个人信息新建文件模版 地址1:http://www.cr173.com/html/11929_1.html 地址2:http://www.jb51.net/softjc/38451.html VS2010已经成为.NET开发人员的必备工具,相比经典版VS2005,到过渡版vs2008…...
佛山做网站/网络推广外包搜索手机蛙软件
php 获取当前时间戳、日期并精确到毫秒首先,我们封装一个获取时间戳的方法:第一种方法:时间戳13位/*** 获取时间戳到毫秒* return bool|string*/public static function getMillisecond(){list($msec, $sec) explode( , microtime());$msect…...
广州高端网站设计/品牌搜索引擎服务优化
查看报错日志路径:/usr/local/mysql/data/*.err 按照提示修改vi /etc/my.cnf配置文件的lower_case_table_names 0 保存后,重启mysql就可以:service mysql start...
二级目录做网站/三只松鼠网络营销案例分析
一开始,没啥思路,全靠百度,记录一下哈 1 public function demo(){2 //例子3 $astart strtotime("1995-06-16 12:00:00");//第1个开始4 $aend strtotime("2008-06-16 12:00:00");//第1个结…...
网站开发一般多钱/天津seo推广软件
All objects on the heap contain two overhead members: the type object pointer and the sync block index.转载于:https://www.cnblogs.com/zhtf2014/archive/2011/07/29/2121594.html...