首页 > 其他分享 >Mybatis的#和$的区别

Mybatis的#和$的区别

时间:2022-10-08 22:47:23浏览次数:45  
标签:name 区别 actno where country Mybatis holder id

1. #:占位符,告诉mybatis使用实际的参数值代替。并使用PreparedSatement对象执行sql语句,#{...}代替sql语句的"?"。

这样更安全,更迅速,也是通常的做法。

mapper文件

<select id="selectOneAccountByNo" resultType="com.galaxy.bank.pojo.Account">
        select id, actno, balance, holder_name, country
        from bankdb.t_account
        where actno = #{actno}
    </select>

转化为myabtis的执行则是:

String sql="select id, actno, balance, holder_name, country from bankdb.t_account where actno =?"

PreparedStatement ps=conn.preparedStatement(sql);
ps.setInt(1,1005);

解释:

where id=?就是 where id=#{id}

ps.setInt(1,1005),1005会替换掉#{id}

 

2.$字符串替换符.

$告诉mybatis使用$当中包含的“字符串”替换所在位置。使用statement而不是PreparedStatement把sql语句和${}的内容连接起来。

主要在替换表名,列名,不同列排序等操作。

mapper文件:

 <select id="selectOneAccountByNo" resultType="com.galaxy.bank.pojo.Account">
        select id, actno, balance, holder_name, country
        from bankdb.t_account
        where actno =${actno}
    </select>

${}转化为SQL语句:

select id, actno, balance, holder_name, country from bankdb.t_account where actno =1005

而#{}转换为SQL语句则是:

select id, actno, balance, holder_name, country from bankdb.t_account where actno =?

假设mapper中的SQL语句如下:

select id, actno, balance, holder_name, country from bankdb.t_account where holder_name =${holder_name}

Java测试类调用Java的dao接口中的方法则该如下:

注意:双引号当中有单引号,如果没有单引号则会报错,因为${}是字符串替换。

List<Account> accounts=dao.selectAccountByDollar("'Tom Hanks'");

加上单引号,SQL语句才会变成:

select id, actno, balance, holder_name, country from bankdb.t_account where holder_name ='Tom Hanks';

 

3.$替换列名的操作

假设mapper中的SQL语句:

select id, actno, balance, holder_name, country from bankdb.t_account where balance>1000 order by ${myCountry}

 

Dao接口:

selectAccount$Order(@param("myCountry")String myCountry);

 

测试类:

List<Account> accounts=dao.selectAccount$Order("country);

转化为SQL语句为:

select id, actno, balance, holder_name, country from bankdb.t_account where balance>1000 order by country

注意:

  • 因为${}是字符串替换拼接,所以在到Dao接口中用@Param给参数去了个别名,但是这个别名对mapper无影响。
  •  ${}是用的Statement,而不是PreparedStatement,所以有SQL注入风险。

 

------------------------------------------------------------------------------------------------
2022年10月8日,农历九月十三,星期六,阴天有小雨,气温较冷,上海。
国庆节7天假期后的第一天,今日不调休,不上班.
-------------------------------------------------------------------------------------------------

 

标签:name,区别,actno,where,country,Mybatis,holder,id
From: https://www.cnblogs.com/majestyking/p/16770535.html

相关文章

  • Mybatis传递参数的各种方式:简单类型,@Param,map,java对象等等
    本文演示了给mybatis的mapper文件当中的SQL语句传递参数或者参数值的各种方式.xml格式mapper文件:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapper......
  • MyBatis的三种分页方式
    一、Limit分页<select id="getUserInfo1" parameterType="map" resultType="dayu">    select * from user    <if test="startPos!=null and pageSize!......
  • TCP与UDP的联系与区别
    简介:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。UDP是用户数据报协议,是OSI参考模型中......
  • 修饰符private,public,protected,internal的区别
    1、public的访问不受限制, 对任何类和成员都完全公开,无限制访问。 2、protected虽然 可以被外界看到,但外界却不能调用,只有自己及自己的子类可以调用 (protected的属性和......
  • TCP与UDP的联系和区别
    TCP是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。UDP是与TCP相对应的协议。它是面向非连接的协......
  • MyBatis框架:第三章:传统方式mybatis的增,删,改,查实现
    传统方式mybatis的增,删,改,查实现准备工作创建javaProject项目,建库建表插入数据,到数据库中执行,导入jar包添加mybatis的核心jar添加mysql数据库连接驱动添加log4j日记需......
  • TCP和UDP联系与区别
    TCP和UDP是传输层的两个协议1、UDP的概念:UDP(UserDatagramProtocol用户数据报协议):是OSI(OpenSystemInterconnection开放式系统互联)参考模型中一种无连接的传输层协......
  • .NET Core和.NET Framework中DateTime.Now的区别
    今天和医院的微信公众号接口对接,需要传当前时间,我随手写了一个DateTime.Now传了过去,过了一会那边说时间格式不对,原来.NETCore中DateTime.Now的格式是2022/10/08下午04......
  • web 开发里 SSR,CSR 和 SSG 的区别
    本文介绍这三种Web前端开发领域中的术语的区别。CSR-ClientSideRendering一种在浏览器上执行JavaScript以生成DOM并在挂载后显示内容的方法。页面初始加载不......
  • TCP与UDP的联系与区别
    联系:TCPTCP(TransmissionControlProtocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。TCP仅支持单播传输,面向字节流,提供全双工通信,是......