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】【链表】两两交换链表节点
【题干】 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 【思路】 先说递归的,退出条件很明显,当剩…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
