Java Mybatis中的 ${ } 和 #{ }的区别使用详解

一、举例说明

select * from user where name = "dato";

select * from user where name = #{name};

select * from user where name = '${name}';


二、区别

sql 预编译

指的是数据库驱动在发送 sql 语句和参数给 DBMS 之前对 sql 语句进行编译,这样 DBMS 执行 sql 时,就不需要重新编译。

一般情况下,我们都不会注意到这里面有什么不一样的地方。因为这些sql都可以达到我们的目的,去查询名字叫dato的用户。

select * from user where name = #{name};

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现

#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?;

那么我们使用 ${}的时候

select * from user where name = '${name}';

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "dato";

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上所得:

  •  ${ } 变量的替换是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

这是 #{} 和 ${} 我们能看到的主要的区别,除此之外,还有以下区别:

  • #{ } 方式能够很大程度防止sql注入。
  • ${ } 方式无法防止Sql注入。
  • ${ } 方式一般用于传入数据库对象,例如传入表名.
  • 一般能用#的就别用$.

结论:

  •  #{}:占位符号,好处防止sql注入
  •  ${}:sql拼接符号

所以我们在使用mybatis的时候,尽量的使用#方式!!!这是大家要注意的地方

到此这篇关于Mybatis中的 ${ } 和 #{ }的区别使用详解的文章就介绍到这了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java整合MyBatis和SpringBoot是现在Web应用开发非常常见的一种方式,这种方式可以快速的搭建出一个基本的Web应用框架,同时也可以很方便的进行数据库操作。下面我们来详细的介绍一下Java整合MyBatis和SpringBoot的具体实现。 一、搭建SpringBoot项目 1.1 创建项目 在Eclipse或者IntelliJ IDEA创建一个SpringBoot项目,选择maven方式,选择Web、MySQLMyBatis等相关依赖。 1.2 配置文件 在src/main/resources目录下创建application.properties文件,添加如下配置: ``` # 数据库连接配置 spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver # MyBatis配置 mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.example.demo.entity ``` 二、创建实体类 创建一个实体类,比如User.java,代码如下: ``` package com.example.demo.entity; public class User { private Integer id; private String username; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` 三、创建Mapper接口 创建一个Mapper接口,比如UserMapper.java,代码如下: ``` package com.example.demo.mapper; import java.util.List; import org.apache.ibatis.annotations.Mapper; import com.example.demo.entity.User; @Mapper public interface UserMapper { List<User> findAll(); User findById(Integer id); void insert(User user); void update(User user); void delete(Integer id); } ``` 四、创建Mapper.xml文件 在src/main/resources/mapper目录下创建UserMapper.xml文件,代码如下: ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.example.demo.entity.User"> <id column="id" property="id" /> <result column="username" property="username" /> <result column="password" property="password" /> </resultMap> <select id="findAll" resultMap="BaseResultMap"> SELECT * FROM user </select> <select id="findById" parameterType="java.lang.Integer" resultMap="BaseResultMap"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insert" parameterType="com.example.demo.entity.User"> INSERT INTO user (username, password) VALUES (#{username}, #{password}) </insert> <update id="update" parameterType="com.example.demo.entity.User"> UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id} </update> <delete id="delete" parameterType="java.lang.Integer"> DELETE FROM user WHERE id = #{id} </delete> </mapper> ``` 五、创建Service 创建一个Service,比如UserService.java,代码如下: ``` package com.example.demo.service; import java.util.List; import com.example.demo.entity.User; public interface UserService { List<User> findAll(); User findById(Integer id); void save(User user); void update(User user); void delete(Integer id); } ``` 创建一个ServiceImpl,比如UserServiceImpl.java,代码如下: ``` package com.example.demo.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import com.example.demo.service.UserService; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> findAll() { return userMapper.findAll(); } @Override public User findById(Integer id) { return userMapper.findById(id); } @Override public void save(User user) { userMapper.insert(user); } @Override public void update(User user) { userMapper.update(user); } @Override public void delete(Integer id) { userMapper.delete(id); } } ``` 六、创建Controller 创建一个Controller,比如UserController.java,代码如下: ``` package com.example.demo.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.example.demo.entity.User; import com.example.demo.service.UserService; @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/", method = RequestMethod.GET) public List<User> findAll() { return userService.findAll(); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) public User findById(@PathVariable Integer id) { return userService.findById(id); } @RequestMapping(value = "/", method = RequestMethod.POST) public void save(@RequestBody User user) { userService.save(user); } @RequestMapping(value = "/", method = RequestMethod.PUT) public void update(@RequestBody User user) { userService.update(user); } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public void delete(@PathVariable Integer id) { userService.delete(id); } } ``` 七、启动项目 在Eclipse或者IntelliJ IDEA启动SpringBoot项目,启动成功后就可以通过http://localhost:8080/users/访问到我们创建的接口了。 以上就是Java整合MyBatis和SpringBoot的具体实现,希望对大家有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值