Java中#和$占位符对比区别

1.#占位符

语法 :#{id}占位符

mybatis处理#{}使用jdbc对象PrepareStatment对象

<select id="selectStudentById" resultType="ssm.Entity.Student" parameterType="java.lang.Integer">
select * from tb_student where sid =#{sid}

例如 mybatis创建PrepareStatment对象,执行sql语句
String sql6=“ssm.dao.StudentDao”+"."+“QuertStudentParam”;
PrepareStatment pst=conn.prepareStatement(sql);
pst.setIn(1,1001);
resultSet rs=pst.executeQuery();//执行sql语句

主要特点有:

1.1

@1. PrepareStatment对象执行sql语句效率高
@2. 使用PrepareStatment对象 ,执行sql语句可以有效避免sql注入,提高代码的安全性
@3. #{}常常位于=的右侧位置,与数据类型有关

1.2

#{}: 表示一个占位符号,实现向PreparedStatement占位符中设置值(#{}表示一个占位符?),自动进行Java类型到JDBC类型 的转换(因此#{}可以有效防止SQL注入).#{}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,#{}花括号中可以是value或其它名称.

2. $占位符

语法 : ${id} 占位符

select * from tb_student where sid =${sid}

statement st=conn.createStatement(sql);
resultSet rs=st.executeQuery();//执行sql语句

主要特点有:

2.1

@1. Statement对象执行sql语句效率低
@2. ${}占位符的值需要字符串进行链接使用 ,有sql注入的风险,存在一定提高代码 的风险性
@3. ${}是原样进行使用的,无关数据类型问题
@4. ${}常用作表名,或者列名,在能保障数据安全的情况下进行使用

2.2

: 表 示 拼 接 S Q L 串 , 通 过 {}: 表示拼接SQL串,通过 :SQL,{}可将parameterType内容拼接在SQL中而不进行JDBC类型转换, 可 以 接 收 简 单 类 型 或 P O 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 的 是 单 个 简 单 类 型 值 , {}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值, PO,parameterType,{}花括号中只能是value.

区分使用

@3.1

     {}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入
     在JDBC能使用占位符的地方,最好优先使用#{}
     比如 有两张表,分别是emp_2017 和 emp_2018 .如果需要在查询语句中 动态指定表名,就只能使用${}
     再比如MyBatis 排序时使用order by 动态参数时,此时也只能使用${}
### QuickBI 中占位符的使用方法 在 QuickBI 中,占位符是一种动态参数化的工具,用于增强报表的交互性灵活性。通过设置占位符,用户可以根据不同的输入条件生成个性化的分析结果。以下是关于 QuickBI 占位符使用的详细介绍: #### 1. 创建占位符 要创建占位符,需进入 QuickBI 的报表编辑界面并按照以下流程操作: - **导航到数据集配置区域**:在报表设计页面中找到“参数管理”选项卡。 - **新增参数**:点击“新建参数”,定义占位符名称及其默认值[^4]。 - **设定类型**:可以选择数值型、字符串型或其他支持的数据类型。 #### 2. 配置占位符属性 为了使占位符能够正常工作,需要为其分配合适的属性: - **范围限定**:可以指定该占位符的作用域(全局或局部),以及其可接受的有效取值区间。 - **关联字段**:将占位符绑定至特定维度或者度量列上,从而影响查询逻辑[^5]。 #### 3. 应用场景实例 假设有一个销售数据分析表单,其中包含时间轴作为主要过滤器之一,则可以通过如下方式应用占位符来优化用户体验: ```sql SELECT * FROM sales_data WHERE sale_date BETWEEN ${start_date} AND ${end_date}; ``` 在此 SQL 查询语句里 `${start_date}` `${end_date}` 就代表两个预先声明好的日期类型的占位变量[^6]。 #### 常见错误及解决方案 当遇到与占位符有关的问题时,通常可以从以下几个方面排查原因: - 如果发现某些条件下返回的结果为空,请确认所设限值是否合理,并且检查是否有遗漏必要的约束条件; - 对于性能瓶颈问题,考虑调整索引策略或是减少不必要的复杂计算过程。 ```python def validate_placeholder_usage(query, placeholders): """ Validate that all placeholders used in the query are defined. Args: query (str): The SQL query string containing placeholder references. placeholders (list of str): List of valid placeholder names. Returns: bool: True if no undefined placeholders exist; False otherwise. """ for ph in re.findall(r&#39;\$\{(\w+)\}&#39;, query): if ph not in placeholders: return False return True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值