mybatis框架中传参的使用#{}和${}的区别
-
先看这个例子:
-
方式一
select * from user01 where name like #{value}
-
经过编译后:
select * from user01 where name like ?
-
方式二
select * from user01 where name like '${value}%'
-
经过编译后:
select * from user01 where name like '王%'
-
我们对比这两个sql语句,发现#{value} 和 $ {value} 这两个sql语句,经过编译后,可以发现#{value}经过编译后,它变成了 “?”,可以防止sql注入,${value} 经过编译后,它变成" ‘王%’ "。我们发现这个是值直接进去了,这种方式就有可能发生sql注入的问题。
-
#{}, ${}----主要就在我们进行数据库的 sql的拼接的时候使用
- #{} 使用它来完成我们sql语句中占位使用; 和preparstaterment 当中的?是一样的; 他里边可以传递简单类型和你的类; 他可以防止sql注入;
- ${}他是用来进行sql语句的拼接;他里边可以传递简单类型和你的类; 他不可以防止sql注入。
-
mybatis框架中进行模糊查询案例及其说明
- 这是映射配置文件
<?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"> <!-- namespace这里的工作空间要和你的mapper层的接口路径对应,否则使用 sqlsession.getMapper()方法就会报错--> <mapper namespace="com.wdhcr.mybatisSelectLike.mapper.UserSelectLike"> <select id="selectLike" parameterType="string" resultType="com.wdhcr.mybatisSelectLike.po.User"> <!-- 使用#{}占位符,用来传参,可以防止sql注入--> select * from user01 where name like #{value} </select> <select id="selectLike1" parameterType="string" resultType="com.wdhcr.mybatisSelectLike.po.User"> <!-- 使用${}用来传参,不能防止sql注入--> <!-- 注意这里的接收值的参数为基本数据类型时,参数名必须为value--> select * from user01 where name like '${value}%' </select> </mapper>
- po中的实体类
/* * 这是实体类,对应你数据库表中的字段 * 并生成get set方法,和tostring方法 * * */ public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
- 这是核心全局配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="dev"> <environment id="dev"> <!-- 设置事务类型--> <transactionManager type="JDBC"></transactionManager> <!-- 设置数据源类型--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="你的用户名"/> <property name="password" value="你的密码"/> </dataSource> </environment> </environments> <!-- 注入你的映射文件--> <mappers> <mapper resource="UserSelectLike.xml"></mapper> </mappers> </configuration>
- 这是测试类代码
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Test { public static void main(String[] args) throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("ConfigMapper.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = build.openSession(); //这是使用#{}fan方式进行模糊查询 // List<User> users=sqlSession.selectList("com.wdhcr.mybatisSelectLike.mapper.UserSelectLike.selectLike","王 "); // for (User user : users) { // System.out.println(user); // } //这是使用${}方式进行模糊查询 // List<User> userList=sqlSession.selectList("com.wdhcr.mybatisSelectLike.mapper.UserSelectLike.selectLike1" ,"王"); // for (User user : userList) { // System.out.println(user); // } } }
-
以上就是mybatis框架进行模糊查询时的两种传参方式,以及其中存在问题。
-
下面我们来说我们正常开发中使用的方式,如下:
select * from user01 where name like concat('%',#{name},'%');
- 使用以上这种方式 进行sql语句的拼接。