MyBatis中的占位符入参方法有哪些

本篇内容主要讲解“MyBatis中的占位符入参方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MyBatis中的占位符入参方法有哪些”吧!

    前言

    #{}占位符会被解析为JDBC中的预编译语句(Prepared Statement)中的参数占位符?,一个#{}会被解析为一个?

    ${}占位符标识的位置会直接被替换为入参,是简单的字符串替换。

    正文

    一. 入参是基本类型并且参数个数为1

    映射接口中查询单条记录的方法定义如下。

    // 使用#{}作为参数占位符
    MyInfo getMyInfoByNameUseWell(String infoName);
    // 使用${}作为参数占位符
    MyInfo getMyInfoByNameUseDollar(String infoName);

    与之对应的映射文件中的查询标签定义如下。

    <select id="getMyInfoByNameUseWell" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = #{name}
    </select>
    <select id="getMyInfoByNameUseDollar" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = '${name}'
    </select>

    入参是基本类型(示例中是String类型)且参数个数只有一个时,使用#{}${}占位符均不要求占位符指定的名称与映射接口中的参数名相等,但是#{}进行占位符替换后参数会添加上''号,而${}进行占位符替换是直接进行字符串替换,所以上述示例中,使用${}占位符时需要在占位符两侧添加''号。

    二. 入参是基本类型并且参数个数大于1

    映射接口中查询单条记录的方法定义如下。

    // 使用#{}作为参数占位符
    MyInfo getMyInfoByNameTypeUseWell(@Param("infoName") String infoName, @Param("infoType") String infoType);
    // 使用${}作为参数占位符
    MyInfo getMyInfoByNameTypeUseDollar(@Param("infoName") String infoName, @Param("infoType") String infoType);

    与之对应的映射文件中的查询标签定义如下。

    <select id="getMyInfoByNameTypeUseWell" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType}
    </select>
    <select id="getMyInfoByNameTypeUseDollar" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}'
    </select>

    入参是基本类型且参数个数大于一个时,此时需要在映射接口的方法中使用@Param注解定义参数的名称,并且要求占位符指定的名称需要与@Param注解定义的名称相等,否则报错

    三. 入参是自定义类型

    映射接口中查询单条记录的方法定义如下。

    // 使用#{}作为参数占位符
    MyInfo getMyInfoByQueryParamUseWell(QueryParam queryParam);
    // 使用${}作为参数占位符
    MyInfo getMyInfoByQueryParamUseDollar(QueryParam queryParam);

    其中自定义类型QueryParam定义如下。

    @Data
    public class QueryParam {
        private String infoName;
        private String infoType;
        public QueryParam(String infoName, String infoType) {
            this.infoName = infoName;
            this.infoType = infoType;
        }
    }

    与之对应的映射文件中的查询标签定义如下。

    <select id="getMyInfoByQueryParamUseWell" resultMap="myInfoMap"
            parameterType="com.learn.mybatis.dynamic.entity.QueryParam">
        SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType}
    </select>
    <select id="getMyInfoByQueryParamUseDollar" resultMap="myInfoMap"
            parameterType="com.learn.mybatis.dynamic.entity.QueryParam">
        SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}'
    </select>

    入参是自定义类型时,占位符指定的名称需要与自定义类型中的字段名相同,否则报错

    四. 入参是Map类型

    映射接口中查询单条记录的方法定义如下。

    // 使用#{}作为参数占位符
    MyInfo getMyInfoByMapUseWell(Map<String, Object> queryParamMap);
    // 使用${}作为参数占位符
    MyInfo getMyInfoByMapUseDollar(Map<String, Object> queryParamMap);

    与之对应的映射文件中的查询标签定义如下。

    <select id="getMyInfoByMapUseWell" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType}
    </select>
    <select id="getMyInfoByMapUseDollar" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}'
    </select>

    入参是Map时,占位符指定的名称需要与Map的key相等,这样才能将key对应的value与占位符进行替换

    五. 只能使用${}的场景

    通过上面几点分析,发现大多数能够使用${}占位符的场景都可以使用#{}占位符,而且#{}占位符相比${}占位符还具有能够防止SQL注入提高执行速度的功能,但是如下几种场景,只能够使用${}占位符。

    1. 入参是表名

    当入参是表名时,此时如果表名的参数占位符使用#{},会报错,因为表名不确定时,是无法进行预编译SQL的,所以这种场景只能使用${}作为表名的参数占位符。下面是示例。

    映射接口中的示例方法定义如下。

    // 传入表名实现动态创建表
    void createMyInfoTable(String tableName);
    // 传入表名动态指定被查询的表
    MyInfo getMyInfoByNameUseWellDynmic(@Param("tableName") String tableName, @Param("infoName") String infoName);

    与之对应的映射文件中的标签定义如下。

    <update id="createMyInfoTable">
        CREATE TABLE ${tableName} (
            id INT(11) PRIMARY KEY AUTO_INCREMENT,
            info_name VARCHAR(255),
            info_type ENUM('USER', 'HOUSE', 'CAR'),
            info_detail VARCHAR(255),
            info_seq INT(11)
        )
    </update>
    <select id="getMyInfoByNameUseWellDynmic" resultMap="myInfoMap">
        SELECT * FROM ${tableName} WHERE info_name = #{infoName}
    </select>
    2. 入参是列名

    当入参是列名时,此时也只能使用${}作为列名的参数占位符。下面是示例。

    映射接口中的方法定义如下。

    // 为数据库表创建索引
    // 表名,索引名,加索引的列的列名全部动态指定
    void createIndex(@Param("tableName") String tableName, 
                     @Param("indexName") String indexName, 
                     @Param("columnNames") List&lt;String&gt; columnNames);
    // 对查询结果集进行排序并动态指定排序的列名
    List&lt;MyInfo&gt; getMyInfosSorted(String columnName);

    与之对应的映射文件中的标签定义如下。

    <update id="createIndex">
        CREATE INDEX
            ${indexName}
        ON
            ${tableName}
        <foreach collection="columnNames" item="columnName"
                    open="(" separator="," close=")">
            ${columnName}
        </foreach>
    </update>
    <select id="getMyInfosSorted" resultMap="myInfoMap">
        SELECT * FROM myinfo ORDER BY ${columnName} DESC
    </select>

    在为数据库表创建索引的示例中,表名,索引名和加索引的列的列名全部都需要使用${}作为参数占位符,否则会报错。在对查询结果集进行排序的示例中,如果列名占位符不使用${}而使用#{},不会报错,但是无法实现根据指定列进行排序的功能。

    到此,相信大家对“MyBatis中的占位符入参方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程之家网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    1.pom.xml引入依赖 &lt;dependency&gt; &lt;groupId&gt;com.github.pagehelper&lt;/groupId&gt; &lt;artifactId&gt;pagehelper&lt;/artifactId&gt; &lt;version&gt;5
    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; &lt;!DOCTYPE configuration PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot; &qu
    准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREATE DATABASE `dbtest1`; ## 创建数据表 CREATE TABLE `t_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) DEF
    MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。 创建逆向工程的步骤 1、添加依赖&amp;插件 &lt;!-- 控制Mave
    MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
    resultMap作用是处理数据表中字段与java实体类中属性的映射关系。 准备工作 ① 创建数据库&amp;数据表 CREATE DATABASE `dbtest1`; CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `em
    EHCache缓存针对于MyBatis的二级缓存。 MyBatis默认二级缓存是SqlSessionFactory级别的。 添加依赖 &lt;!-- MyBatis-EHCache整合包 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.cac
    MyBatis 提供了一级缓存和二级缓存的支持,用于提高数据库查询的性能,减少不必要的数据库访问。 一级缓存(SqlSession 级别的缓存) 一级缓存是 MyBatis 中最细粒度的缓存,也称为本地缓存。它存在于每个 SqlSession 的生命周期中,当 SqlSession 被关闭或清空时,
    动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。 这主要通过 &lt;if&gt;、&lt;choose&gt;、&lt;when&gt;、&lt;otherwise&gt;、&lt;foreach&gt;等标签实现。 查询场景 /** * 根据条件查询员工
    本教程操作系统:windows10系统、DELL G3电脑。 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,配置数据库连接是非常重要的第一步。下面将详细介绍如何配置 MyBatis 的
    今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。
    今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
    本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1 前言1.1 集成spring前使用mybat...
    今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
    本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis...
    这篇文章主要介绍了mybatisforeach怎么传两个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatisforeach怎...
    这篇“MyBatis映射文件中parameterType与resultType怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的...
    这篇文章主要介绍“MyBatis怎么获取自动生成的键值”,在日常操作中,相信很多人在MyBatis怎么获取自动生成的键值问题上存在疑惑,小编查阅了各式资料,整理出
    这篇文章主要讲解了“怎么去掉IntelliJIDEA中mybatis对应的xml文件警告”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入...
    这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这...