ognl

Mybatis 有坑,千万别踩!

假如想象 提交于 2021-01-04 08:30:59
Mybatis是一个开源的轻量级半自动化ORM框架,使得面向对象应用程序与关系数据库的映射变得更加容易。 MyBatis使用xml描述符或注解将对象与存储过程或SQL语句相结合。Mybatis最大优点是应用程序与Sql进行解耦,sql语句是写在Xml Mapper文件中。 OGNL表达式在Mybatis当中应用非常广泛,其表达式的灵活性使得动态Sql功能的非常强大。OGNL是Object-Graph Navigation Language的缩写,代表对象图导航语言。 OGNL是一种EL表达式语言,用于设置和获取Java对象的属性,并且可以对列表进行投影选择以及执行lambda表达式。Ognl类提供了许多简便方法用于执行表达式的。Struts2发布的每个版本都会出现的新的高危可执行漏洞也是因为它使用了灵活的OGNL表达式。 公司后端采用Mybatis作为数据访问层,所使用版本为3.2.3。线上环境业务系统在运行过程中出现了一个令人困惑的异常, 该异常时而出现时而不出现,构造各种OGNL表达式为空等特殊情况均不会重现该异常。 具体异常堆栈信息如下: ### Error querying database. Cause: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'list !=

Struts2和springmvc的区别

久未见 提交于 2020-12-16 15:59:55
一、框架机制 1. spring MVC是通过servlet的方式进行拦截,在第一次请求发送时初始化,并随着容器关闭而销毁。 2. struts2是通过filter(拦截器)的方式进行拦截,在容器初始化时加载。晚于servlet销毁。 二、拦截机制 1.struts2 是类级别上的拦截,每次请求都会创建一个对应的action,一个url对应action中的一个方法,action类中的属性被所有方法共享,所以action在spring只能配置成多例的,因为是多例的,无法使用注解等方式开发。如果有两个请求同时访问action,则会发生线程并发,导致类属性值错乱,线程不安全。struts2通过类属性的方式接收请求参数,并通过get,set方法设置值,也可以通过模型驱动的方式注入值,action类需要继承ActionSupport实现ModelDrivenMO<T>接口。struts2使用的是值栈机制,将页面需要的值压入值栈,则可在页面上通过OGNL表达式获取。Struts2有自己的拦截机制,自定义Interceptor类,然后进行配置,配置文件非常大。 2.spring MVC是方法级别上的拦截,一个请求对应着一个controller中的方法,请求参数会封装到方法参数中,如果是对象类型的参数则需要在参数名前加上@RequestBody注解即可。controller类中的属性被方法所共享

【mybatis】-- if标签判断字符串相等时失效

有些话、适合烂在心里 提交于 2020-12-08 07:44:20
原mapper的sql语句如下: <select id="countOutFinishedOrdersByDeliverSign" resultType="int" > select count(1) cnt from order_customer where status = #{status} <if test="sign!=null and sign!='' and sign=='1'"> AND tms_delivery_flag is null </if> <if test="sign!=null and sign!='' and sign=='2'"> AND tms_delivery_flag = 1 </if> and last_modified_date > #{startDate} and last_modified_date <= #{endDate} </select> 以上:sign是字符串,判断等于的条件时,使用了sign=='1' 和sign=='2' 由于项目暂时还没有集成p6spy,没办法打印出sql,所以,自己按照条件拼接的sql语句到Navicat中执行,条件不一样,执行结果也不一样。但是程序接口返回的结果集却是一样的。 分析原因: sql没有问题,查询结果没有问题。然后尝试去掉了其中的判断条件 AND tms_delivery_flag is

SpringBoot整合Mybatis-Plus 实战之动态SQL,Mybatis最拿得出手的功能之一

ε祈祈猫儿з 提交于 2020-12-03 18:52:05
MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? #是将传入的值当做字符串的形式,select id,name,age from test where id =#{id}, 当把id值传入到后台的时候,就相当于 select id,name,age from test where id =‘1’. " "是将传入的数据直接显示生成sql语句,selectid,name,agefromtestwhereid="是将传入的数据直接显示生成sql语句,select id,name,age from test where id = " 是 将 传 入 的 数 据 直 接 显 示 生 成 s q l 语 句 , s e l e c t i d , n a m e , a g e f r o m t e s t w h e r e i d = {id}, 当把id值1,传入到后台的时候,就相当于 select id,name,age from test where id = 1. 使用#可以很大程度上防止sql注入。(语句的拼接) if 标签 mapper select from test where 1=1 and username like concat('%', #

Mybatis学习系列(三)动态SQL

和自甴很熟 提交于 2020-11-22 06:55:29
  在mapper配置文件中,有时需要根据查询条件选择不同的SQL语句,或者将一些使用频率高的SQL语句单独配置,在需要使用的地方引用。Mybatis的一个特性:动态SQL,来解决这个问题。 mybatis动态sql语句是基于OGNL表达式的,主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)、 5. set (主要用于更新时) 6. foreach (在实现 mybatis in 语句查询时特别有用) if标签语句   if标签用来实现根据条件拼接sql语句,下面示例用来判断参数如果不为null,则拼接sql 示例: < select id ="ifTest" resultType ="com.sl.po.Product" > select * from products where < if test ="ProductName!=null" > name like #{ProductName} </ if > < if

java应用线上诊断神器--Arthas

…衆ロ難τιáo~ 提交于 2020-10-28 12:24:14
前言 1、什么是Arthas? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱(截止2020.9.19 github star是23K)。通过Arthas我们可以在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 2、Arthas有哪些特性 实时查看系统的运行状况 查看函数调用的参数,返回值和异常 代码在线热更新 秒解类冲突问题,定位类加载路径 快速定位应用的热点,生成火焰图 在线诊断,点开网页诊断线上应用 3、Arthas能帮我们解决什么问题 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? 怎么快速定位应用的热点,生成火焰图? 4、安装 下载arthas-boot.jar,然后用java -jar的方式启动: curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar

Mybatis系列第十讲 动态SQL,这么多种你都会?

谁都会走 提交于 2020-10-24 04:08:52
Mybatis系列第十讲 案例sql脚本 if元素 choose/when/otherwise元素 where元素 set元素 trim元素 foreach元素 案例:in多值查询 案例:批量插入 sql/include元素 bind元素 #和$ 案例sql脚本 DROP DATABASE IF EXISTS `javacode2018` ; CREATE DATABASE `javacode2018` ; USE `javacode2018` ; DROP TABLE IF EXISTS t_user ; CREATE TABLE t_user ( id int AUTO_INCREMENT PRIMARY KEY COMMENT '用户id' , name VARCHAR ( 32 ) NOT NULL DEFAULT '' COMMENT '用户名' , age SMALLINT NOT NULL DEFAULT 1 COMMENT '年龄' ) COMMENT '用户表' ; INSERT INTO t_user VALUES ( 1 , '路人甲Java' , 30 ) , ( 2 , '张学友' , 50 ) , ( 3 , '刘德华' , 50 ) ; if元素 相当于java中的if判断,语法: < if test = "判断条件" > 需要追加的sql < /

MyBatis if标签判断字符串是否相等

混江龙づ霸主 提交于 2020-10-23 03:30:01
mybatis 映射文件中,if标签判断字符串相等,两种方式: 因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量是否是字符串Y的时候: 1. 可以是: <if test="type=='X'.toString()"> 2. 也可以是: <if test = 'type== "Y"'> 但是注意不能使用: <if test="sex == 'Y'"> </if> 或者 <if test="sex == Y "> </if> 另外注意的是判断等于是需要两个 == 等号的,判断不等于使用 !=,真是坑啊! 来源: oschina 链接: https://my.oschina.net/jacklinnn/blog/4299408