#叫做占位符

Mybatis是封装的JDBC 增强版 内部还是用的jdbc

每遇到一个#号 这里就会变为?占位符

一个#{}就是对应一个问号 一个占位符

用这个对象执行sql语句没有sql注入的风险

八、多个参数使用@Param

当 Dao 接口方法有多个参数,需要通过名称使用参数: 在方法形参前面加入@Param(“自定义参数名 ”) mapper 文件使用#{自定义参数名}

8.1、sql映射文件,StudentDao.xml:
select id,name,email,age from student where name = #{myname} or age = #{myage}
8.2、StudentDao接口:
 public List selectMulitParam(@Param("myname") String name, @Param("myage") Integer age);
8.3、测试代码及结果:
@org.junit.Testpublic void test04(){SqlSession sqlSession = MybatisUtils.getSqlSession();StudentDao dao = sqlSession.getMapper(StudentDao.class);List students = dao.selectMulitParam("李四",23);students.forEach(student -> System.out.println(student));}

九、多个参数使用对象

使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。灵活又方便

语法格式: #{ property属性名,javaType=java 数据类型的全限定名称,jdbcType=Mybatis定义的数据库中类型的名称 }

javaType, jdbcType 的类型 MyBatis 可以通过反射获取,一般不需要设置。

常用格式 #{ property }

9.1、代表数据的实体类:
public class QueryParam {private String queryName;private Integer queryAge;
9.2、sql映射文件,StudentDao.xml:
 select id,name,email,age from student where name = #{queryName} or age =#{queryAge} 
9.3、StudentDao接口:
 public List selectMultiObject(QueryParam queryParam);
9.4、测试代码及结果:
 @org.junit.Testpublic void test05(){SqlSession sqlSession = MybatisUtils.getSqlSession();StudentDao dao = sqlSession.getMapper(StudentDao.class);QueryParam queryParam = new QueryParam("王五",23);List students = dao.selectMultiObject(queryParam);students.forEach(student -> System.out.println(student));}
9.5、总结:

所以我们传参的时候灵活一点,参数可以是现成的java对象,如Student;或者用自定义的java对象QueryParam:

public List selectMultiObject(QueryParam queryParam);public List selectMultiStudent(Student student);
select id,name,email,age from student where name = #{queryName} or age =#{queryAge}select id,name,email,age from student wherename = #{name} or age = #{age}

十、多个参数使用对象