Mybatis-Puls实践

蒋寒
2023-12-01

Mybatis-Plus和Mybatis

Mybatis-Plus在Mybatis的基础上做了增强,可以使用Mybatis的全部功能。

  • 另外增加了自己的代码生成,可以生成控制层、服务层、数据访问层的代码。生成代码主要通过模板技术实现的,有点像jsp那样;定义好模板后嵌入一些包名字、类名、要继承的类名、模块名、url路径名字等等
  • 另外增加了VO、DO、PO各层独有的实体生成,各层调用时要进行转换。
  • 各种实体类可选择继承一些通用的BaseEntetity,使得有通用的字段
  • 生成的XML文件中没有Mybatis的代码生成器的大量XML(估计是封装到一些通用的XML里面了)(这里要注意的是自定义查询语句的名字不要和内置的重名,会覆盖掉内置的,排查了我白天没有排查出来/(ㄒoㄒ)/~~)。
  • 生成的Mapper里面也是继承了BaseMapper,封装了大量的通用查询,Mapper层次主要对数据库操作,使用PO模型。
  • 生成的Service里面也是继承了BaseService,封装了大量的通用服务,Service主要对业务逻辑的处理,使用DO模型。
  • 生成的Controller内置了增删改查接口,Controller主要对视图逻辑的处理,使用VO模型。

WEB应用也可以在模板里面封装一些常用的查询参数、结果

  • 封装了通用查询泛型结构R,包含状态码、消息、数据
  • 封装了通用查询参数类Query,主要带了分页和排序字段
  • 封装了通用查询参数类QueryWarpper,主要根据实体类创建对字段的查询条件
  • 封装了通用结果分页插件,在结果里面会带上页数、页码、总数等信息

yml配置扫描和注解配置扫描

  • yml里面可以配置扫描xml文件和对应实体,使用classpath* :com.xx.xx可以扫描依赖jar里面的xml
  • @MapperScan配置根据规则扫描对应包的的mapper,可以免去@Mapper要在每个mapper上注解的问题。
  • 上面两者的配置缺一不可,否则汇报mapper无法映射,可以往上面这两个路径是否错误上排查一下
  • spring有扫描组件@componentScan,feign有扫描组件对应的注解,并不是其中一个扫到就行,具体要看实现,出现错误可以往没有在对应的模块加上扫描注解排查一下
  • 调试想看mytatis日志可以在yml里面mybatis-plus:configtion:log-impl:org.apche.ibatis.logging.stdout.stdouImpl
  • 想调试mybatis自己写sql,写单元测试时导入mybatis的专用调试test包,可以轻量级启动mybaits测试,免去启动服务器的过程。

*mapper.xml SQL语句的使用

  • #{}虽然可以防止sql注入攻击,但是会被解析为字符串,只能用在作为查询条件的值的,插入的值等注入,在其他地方例如动态表名,动态字段,别名,排序字段等只能用${}
  • 使用group聚会函数时,使用聚合函数有可能出现结果为null的想象,会导致mybatis绑定map类型实体时跳过的现象,这时候要加上ifnull函数来处理。
  • 比较时间要用datediff()函数,拼接函数concat()

mybatis调用存储过程的示例

下面内容转载自https://blog.51cto.com/u_9381188/2352543

  • sql创建存储过程示例
- DELIMITER $
CREATE PROCEDURE mybatis.ges_user_count(IN sex_id INT, OUT user_count INT)
BEGIN
IF sex_id=2 THEN
SELECT COUNT() FROM mybatis.p_user WHERE p_user.sex=‘女’ INTO user_count;
ELSE
SELECT COUNT() FROM mybatis.p_user WHERE p_user.sex=‘男’ INTO user_count;
END IF;
END
$
  • mysql客户端调用存储过程
DELIMITER ;
SET @user_count = 0;
CALL mybatis.ges_user_count(1, @user_count);
SELECT @user_count;
  • 另外一种写法,可以直接把入参传给sql的字段
DELIMITER $
CREATE PROCEDURE get_user_count(IN sex_code INT, OUT user_count INT)
BEGIN
SELECT COUNT(*) FROM mybatis.p_user WHERE p_user.code = sex_code INTO user_count;
END
$
  • mysql客户端调用存储过程
SET @user_count = 0;
CALL get_user_count(20, @user_count);
SELECT @user_count;

mybatis 调用sql

<select id=“getUserCount” parameterMap=“getUserCountMap” statementType=“CALLABLE”>
CALL mybatis.ges_user_count(?,?)
</select>
 类似资料: