lambdaQueryWrapper语句
1.save和insert方法的区别
在 MyBatis-Plus 中,save 和 insert 方法都可以用来向数据库中插入一条新记录,但它们在使用上有以下几个区别:
参数类型不同:
save方法的参数类型是实体对象(Entity),而insert方法的参数类型是 Wrapper 对象或者实体对象(Entity)。返回值不同:
save方法的返回值是一个 boolean 类型,表示插入操作是否成功,而insert方法的返回值是受影响的行数。执行逻辑不同:
save方法会根据实体对象的主键属性是否有值来判断是插入还是更新操作,如果主键属性有值,就执行更新操作,否则执行插入操作;而insert方法只执行插入操作,不进行主键冲突检测。
因此,如果希望在插入新记录的同时进行主键冲突检测,可以使用 save 方法;如果只是简单地插入新记录,可以使用 insert 方法。
2.insert,add和save有什么区别
insert,add和save都是数据库操作中常用的用于插入数据的方法,不同的是在不同的数据库操作框架或者实现中可能有些许差异。
在一些ORM框架中,如Hibernate和MyBatis,它们的含义和用法如下:
insert:insert是Hibernate和MyBatis中用于向数据库中插入数据的方法,用于将一个新的对象保存到数据库中。当使用Hibernate时,insert操作通常是通过Session的save()方法实现的;当使用MyBatis时,insert操作通常是通过Mapper接口的insert()方法实现的。
add:add是Hibernate中用于向数据库中插入数据的方法,与insert类似,都是用于将一个新的对象保存到数据库中。不过,在Hibernate中,add操作通常是通过Session的persist()方法实现的。
save:save是Hibernate中用于向数据库中插入数据的方法,与insert和add类似,都是用于将一个新的对象保存到数据库中。不过,在Hibernate中,save操作通常是通过Session的save()方法实现的,与insert的区别在于,save操作可以用于保存新的对象,也可以用于更新已经存在的对象。
需要注意的是,具体的操作方式和用法可能会因为具体的ORM框架或者实现而有所差异,因此在使用这些方法时,应该根据具体的情况进行使用和选择。
对于insert、add和save这三个方法,哪个更好需要根据具体的使用情况和需求进行选择。
一般来说,如果只是简单的插入一条新的记录,那么使用insert或add都可以,它们的实现方式和性能差异不大。但如果需要同时插入多条记录,或者需要支持一些高级的插入操作,那么就需要根据具体情况选择更为适合的方法。
在使用ORM框架时,一般建议使用ORM框架提供的方法进行操作,以便能够充分利用框架的特性和优化。但在某些特殊情况下,也可以考虑使用原生SQL语句进行操作,以获得更好的性能和控制力。
综上所述,需要根据具体的使用情况和需求进行选择,选择更为适合的方法。
3.除了以上三种方法外的其他插入方法
除了insert、add和save方法,还有其他一些更为适合的方法可以用于向数据库中插入数据,如:
batch insert:批量插入是一种常见的向数据库中插入大量数据的方法,它通常比逐条插入数据要快得多。在使用ORM框架时,一般都会提供批量插入的支持,如Hibernate的batch插入。
JDBC批量插入:使用JDBC进行批量插入是一种比较底层的方法,但是在插入大量数据时,性能通常会更好。在使用JDBC进行批量插入时,需要使用PreparedStatement和addBatch()方法。
使用存储过程:在一些特殊情况下,可以考虑使用存储过程来向数据库中插入数据。存储过程可以将多条SQL语句封装成一个过程,并在数据库中预编译和缓存,从而提高性能。
需要根据具体的使用情况和需求选择更为适合的方法,以获得更好的性能和控制力。
4.lambdaQueryWrapper中.eq和.in的区别
.eq方法是用于创建一个相等条件的查询,例如:
new LambdaQueryWrapper<User>().eq(User::getName, "John");上面的代码表示在User表中查询所有名字等于"John"的记录。
.in方法则用于创建一个包含条件的查询,例如:
new LambdaQueryWrapper<User>().in(User::getId, Arrays.asList(1, 2, 3));上面的代码表示在User表中查询所有id为1、2或3的记录。
因此,.eq用于创建单个条件,而.in用于创建多个条件。
五、方法
eq:等于
ne:不等于
gt:大于
ge:大于等于
lt:小于
le:小于等于
between:区间
notBetween:不在区间
like:模糊匹配
notLike:不模糊匹配
likeLeft:左模糊匹配
likeRight:右模糊匹配
isNull:为空
isNotNull:不为空
in:在集合中
notIn:不在集合中
如果你想通过姓名和身份证获取返回值,但是姓名和身份证不在一张表怎么办,你可能需要使用LambdaQueryWrapper的join方法来连接两张表,然后使用eq方法来指定查询条件。例如:
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.join(User::getId, Staff::getUserId) // 连接User表和Staff表 .eq(User::getName, “张三”) // 查询姓名为张三 .eq(Staff::getIdCard, “123456789”); // 查询身份证为123456789
List<User> list = userService.list(wrapper); // 获取返回值
.join方法是LambdaQueryWrapper中用于实现多表联查的方法,它可以指定要连接的表和连接条件,例如:
wrapper.join(User::getDeptId, Dept::getId)表示连接User表和Dept表,条件是User.dept_id = Dept.id。
wrapper.leftJoin(User::getDeptId, Dept::getId)表示左连接User表和Dept表,条件是User.dept_id = Dept.id。
wrapper.rightJoin(User::getDeptId, Dept::getId)表示右连接User表和Dept表,条件是User.dept_id = Dept.id。
使用.join方法时,需要注意以下几点:
.join方法只能用在自定义的mapper接口中,不能用在mybatis-plus提供的通用mapper接口中。
.join方法需要配合.select方法来指定查询的字段,否则会报错。
.join方法不支持嵌套查询或子查询,如果需要复杂的多表联查,请使用xml文件或注解方式。
5..apply方法
qwPayOrder
.ne( "rec_state" , 200 ) // 排除 rec_state 为 200 的 订单 这边加入了对时间的限制
.in("state", 60, 100) // 筛选 60 状态 和 100 状态 的 订单
.apply( "YEAR(update_time) = {0} AND MONTH(update_time) = {1}", year, month )
.select(
"IFNULL(SUM(CASE WHEN state = 100 THEN total_amount ELSE 0 END) + SUM(CASE WHEN state = 60 THEN total_amount - settled_amount ELSE 0 END), 0) as totalAmount",
"IFNULL(SUM(CASE WHEN state = 100 THEN total_service_amount ELSE 0 END) + SUM(CASE WHEN state = 60 THEN total_service_amount - settled_service_amount ELSE 0 END), 0) as totalServiceAmount",
"company_id"
)
.groupBy("company_id");在这段代码中,apply 方法的作用是将传入的字符串参数应用到查询条件中。这里传入了一个字符串格式化表达式,其中 {0} 和 {1} 分别表示 year 和 month 参数,用来限定 update_time 的年份和月份。在实际查询时,year 和 month 会替换 {0} 和 {1},从而构成查询条件。例如,如果 year 为 2023,month 为 4,则查询条件为 YEAR(update_time) = 2023 AND MONTH(update_time) = 4。这样就实现了对 update_time 时间的限制。