MyBatis 参数中的 #{param} 和 ${param}

栏目: Java · 发布时间: 6年前

内容简介:创建User表填充数据使用MyBatis的过程中,向SQL语句中传参是必不可少的。在使用MyBatis的大多数情况下是使用

创建User表

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(12) COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名称',
  `password` varchar(80) COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
  `last_token` text COLLATE utf8mb4_general_ci COMMENT '登陆时的token',
  `status` tinyint(4) DEFAULT '0' COMMENT '用户状态 -1代表已删除 0代表正常 1代表冻结',
  `created_at` bigint(20) DEFAULT NULL COMMENT '创建时间',
  `updated_at` bigint(20) DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
复制代码

填充数据

BEGIN;
INSERT INTO `users` VALUES (1, 'test1', '$2y$10$.mzu/iNaNDJRex.vA06IQu7xg5vwvE8PYhsPQPaIV74uK4BcrzUUm', NULL, 0, 20190625075319, 20190625075319);
INSERT INTO `users` VALUES (2, 'test2', '$2y$10$P5ALENaHchjrwN8NXUrDAeuVGQmcoyuSzvfhaC073cgPh2slPEzZ.', NULL, 0, 20190625075639, 20190625075639);
INSERT INTO `users` VALUES (3, 'test3', '$2y$10$0fqd.LhBt4CBjM4W2X/Dse1i2jer1iJ8gtTjS4S7ZwF5wkxNpbqDC', NULL, 0, 20190625075644, 20190625075644);
INSERT INTO `users` VALUES (4, 'test4', '$2y$10$2NJQKm2XhGvxfLNJtEnZ7evKZyopCOvEpRsJlr0.TvDSezUu08FqG', NULL, 0, 20190625075647, 20190625075647);
INSERT INTO `users` VALUES (5, 'test5', '$2y$10$BfRNt3G9CXeiVjHTDrhTQ.5qkzxkXzWTft1w3qF4NlQG4eg/3lv5S', NULL, 0, 20190625075649, 20190625075649);
INSERT INTO `users` VALUES (6, 'test6', '$2y$10$13PeW77Ew9xT6xiK64FNp.Fg8BC2niYmT3Ad6mMxdG/2Rh4i028bG', NULL, 0, 20190625075655, 20190625075655);
INSERT INTO `users` VALUES (7, 'test7', '$2y$10$9pLgW11lDgvbOLM26GfEieR00i0EAiY.OvaG8N/pbbLXEZ/vbEW6u', NULL, 0, 20190625075658, 20190625075658);
INSERT INTO `users` VALUES (8, 'test8', '$2y$10$9vL5kyKK9AXQR6D1pHsUSuQ2j.iAktYLiqZgYMsXUDKqZUBDKG3KG', NULL, 0, 20190625075702, 20190625075702);
INSERT INTO `users` VALUES (9, 'test9', '$2y$10$xZpmI/sy8Imiqw42K6zdDOKqvxNvjGhZrIZQxcnECWYs14zDBR9v.', NULL, 0, 20190625075705, 20190625075705);
INSERT INTO `users` VALUES (10, 'test10', '$2y$10$bkQuVvfCasSvLbXoZrdq7eT3ki.689KqQXMadFQ0xpMukTwgta9l6', NULL, 0, 20190625075709, 20190625075709);
INSERT INTO `users` VALUES (11, 'test11', '$2y$10$2E4Nr6dqjAIK/sDh20a9AO1EpoI/VRgoiV4MlLLUhK8Tn7tZDO/lq', NULL, 0, 20190625085421, 20190625085421);
INSERT INTO `users` VALUES (12, 'test12', '$2y$10$buSHoWkLe/NoLWLwO67C4u04nYBCrGsVwsdAS6YYWj/LV9UqD41eS', NULL, 0, 20190625085518, 20190625085518);
INSERT INTO `users` VALUES (13, 'test13', '$2y$10$TPQgLzKoU1kAveN2Xi5NGuqwTj804SlXt6R3X3VfuRHiEULdl8SKK', NULL, 0, 20190625085528, 20190625085528);
COMMIT;
复制代码

2.使用#{param}

使用MyBatis的过程中,向 SQL 语句中传参是必不可少的。在使用MyBatis的大多数情况下是使用 #{} 来接收参数。

2.1.根据Name查询用户信息

编写根据用户ID查询用户信息的查询接口:

UserPo selectUserByName(@Param("name") String name);
复制代码

接口对应的XML文件 UserMapper.XML 中对应的 <select> 标签如下:

<select id="selectUserByName" parameterType="string" resultMap="BaseResult">
    SELECT
    *
    FROM USERS
    WHERE name = #{name}
</select>
复制代码

selectUserByName 的SQL语句接收一个String类型的参数,参数符号 #{name}

调用 selectUserByName("test1") 方法,根据Name查询用户信息,实际执行SQL如下:

SELECT * FROM USERS WHERE name = 'test1'
复制代码

运行截图:

MyBatis 参数中的 #{param} 和 ${param}

2.2.等效JDBC代码

String selectUserByName = "SELECT * FROM USERS WHERE name=?";
PreparedStatement ps = conn.prepareStatement(selectUserByName);
ps.setInt(1,name);
复制代码

3.使用${param}

在MyBatis XML中使用 ${} 来接收参数。

3.1.根据Name查询用户信息

使用 2.1.根据Name查询用户信息 的查询方法,修改 UserMapper.xmlselectUserByName 的参数符号为 ${name} 。 再次调用 selectUserByName("test1") 方法,实际执行SQL如下:

SELECT * FROM USERS WHERE name = test1 
复制代码

但是SQL执行失败,此时的错误信息如下:

### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'test1' in 'where clause'
### The error may exist in file [/Users/heng/worker/java/springboot_practice/springboot_mybatis/target/classes/mapper/UserDao.xml]
### The error may involve com.example.mybatis.dao.UserDao.selectUserByName-Inline
### The error occurred while setting parameters
### SQL: SELECT         *         FROM USERS         WHERE name = test1
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'test1' in 'where clause'
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'test1' in 'where clause'] with root cause
复制代码

SQL语句错误, test1 不是 Users 表中的字段。

修改调用方法 selectUserByName("'test1'") ,实际执行SQL如下:

SELECT * FROM USERS WHERE name = 'test1'
复制代码

运行截图:

MyBatis 参数中的 #{param} 和 ${param}

3.2.等效JDBC代码

String selectUserByName = "SELECT * FROM USERS WHERE name=" + name;
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能

智能

[法]弗雷德里克·马特尔 / 君瑞图、左玉冰 / 商务印书馆 / 2015-8 / 59.90

揭示数字化主流大趋势的最新权威论著 《主流》作者的最新力作!与法国秋季新版同步上市! 面对数字化时代的到来,美国、欧盟、中国、俄罗斯、印度、巴西、古巴、伊朗、南非、韩国、新加坡、肯尼亚、墨西哥、日本等世界各国各地区正在如何应对? 在国际地缘政治格局下如何把握数字化主流的大趋势? 谷歌、苹果、脸书、亚马逊、阿里巴巴、腾讯、中兴、华为等大家熟知的网络巨头接受了作者的采访。作者的......一起来看看 《智能》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具