0%

MybatisPlus汇总

Basic Knowledge

各种查询条件组装

参考:https://mynews.likecoder.com/News/54208

mybaties数据源配置类型(POOLED、JNDI、UNPOOLED)

  • dataSource的类型可以配置成其内置类型之一,如UNPOOLED、POOLED、JNDI。
    • 如果将类型设置成UNPOOLED,mybaties会为每一个数据库操作创建一个新的连接,并关闭它。该方式适用于只有小规模数量并发用户的简单应用程序上。
    • 如果将属性设置成POOLED,mybaties会创建一个数据库连接池,连接池的一个连接将会被用作数据库操作。一旦数据库操作完成,mybaties会将此连接返回给连接池。在开发或测试环境中经常用到此方式。
    • 如果将类型设置成JNDI。mybaties会从在应用服务器向配置好的JNDI数据源DataSource获取数据库连接。在生产环境中优先考虑这种方式。

自动分页要开启PaginationInterceptor插件

https://mybatis.plus/guide/page.html

1
2
3
4
5
6
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}

${} vs #{}

1
2
3
#方式能够很大程度防止sql注入。
#方式会在外面加一层字符串标识的包装:"xxx" or 'xxx'
$方式无法防止Sql注入。

mybatis的二级缓存 vs redis

Mybatis一级缓存作用域是session,session commit之后缓存就失效了。

Mybatis二级缓存作用域是sessionFactory,该缓存是以namespace为单位的(也就是一个Mapper.xml文件),不同namespace下的操作互不影响。所有对数据表的改变操作都会刷新缓存。但是一般不要用二级缓存,例如在UserMapper.xml中有大多数针对user表的操作。但是在另一个XXXMapper.xml中,还有针对user单表的操作。这会导致user在两个命名空间下的数据不一致。如果在UserMapper.xml中做了刷新缓存的操作,在XXXMapper.xml中缓存仍然有效,如果有针对user的单表查询,使用缓存的结果可能会不正确,读到脏数据。

Redis比之一、二级缓存的好处很多,Redis可以搭建在其他服务器上,缓存容量可扩展。Redis可以灵活的使用在需要缓存的数据上,比如一些热点数据。
来源

Problem Solution

mapping xml映射文件中order by后面的参数如果是变量传进去的话

排序如果直接这样写:

1
order by #{params.orderBy} #{params.order}

会报错:

1
order by ? ?; nested exception is java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'rder by ? ?', expect QUES

升降序不能通过变量#{}传进去,因为这样会被底层解释为:

1
2
order by xxx 'desc'
order by xxx 'asc'