Mybatis中的StatementType与动态解析时#{}和${}的不同

背景,写一个需求,展示数据的结果需要将查询出来的结果列转行,但是发现需要列转行的数据是动态的,没办法确定有多少个,所以需要动态的拼接sql处理。起初设想是在MyBatis里面去动态拼接,然后尝试多次放弃了。。。要动态拼接的sql如下,下面是静态固定的几个列,实际需要查出来循环拼接的:然后选择在java控制层去处理了:【1】java中拼接,重点标注了底色:List<PageData> flNameList = xinchouService.getZiDuanByStatus(p
摘要由CSDN通过智能技术生成

在项目中使用orm框架Mybatis对数据库进行相关操作,使用Mybatis最大的好处是可以使用动态sql。所谓动态sql就是Mybatis对sql进行预编译之前会对sql语句进行动态解析,动态解析处理之后会进行预编译,最后数据库驱动再发送sql和参数到DB执行。

Statement的执行机制

Statement的excute方法直接将SQL语句作为参数传入并提交给数据库执行 -> 数据库引擎对SQL语句进行编译得到数据库可执行代码 -> 执行SQL语句。这就表示,每次提交SQL都需要经过编译再执行。

预编译执行机制

一、预编译语句

通常一条SQL从被数据库接收到执行完毕返回,会经历以下三个过程:

  1. 词法和语义解析;
  2. 优化sql语句,制定执行计划;
  3. 执行并返回结果。

在很多情况下,一条SQL语句可能需要反复执行,或者每次执行的时候只有个别的值不同(比如query的where子句值不同,update的set子句不同,insert的values值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。预编译语句就是将上述sql语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化。

二、PreparedStatement的预编译机制

  1. 获取预编译语句:数据库驱动在发送sql和参数到DB之前,会先调用Connection.prepareStatement(String sql)方法将该sql语句直接提交给MySQL数据库服务器进行编译处理(获取预编译语句可以从三个渠道获取:本地缓存的预编译语句、调用MySQL服务
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值