传入参数: 从java代码中把数据传入到mapper文件的sql语句中。
# 和 $ 的区别
一.深入理解参数
(1)parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,
因为 MyBatis 可以推断出具体传入语句的参数,默认值为未设置(unset)。
接口中方法的参数从 java 代码传入到 mapper 文件的 sql 语句。
例如:
<select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.zsz.domain.Student">
select id,name,email,age from student where id=#{id}
</select>
/**
* 一个简单类型的参数:
* 简单类型:mybatis把java的基本数据类型和String都叫做简单数据类型。
*
* 在mapper文件中想要获取简单数据类型的值我们使用的是#{任意字符}
*
*
*/
public Student selectStudentById(Integer id);
mapper 文件:
<select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.zsz.domain.Student">
select id,name,email,age from student where id=#{id}
</select>
<!--
parameterType:表示dao接口中方法参数的数据类型。
parameterType它的值是java数据类型全限定名称或者是mybatis定义的别名
例如:parameterType="java.lang.Integer"(全限定名称)
parameterType="int"(mybatis定义的别名)
parameterType不是强制的,mybatis通过反射能够发现接口参数的数据类型。
所以可以没有,一般我们也不写。
使用#{}之后,mybatis执行sql是使用jdbc中的PreparedStatement对象
由mybatis执行下面的代码:
1.mybatis创建Connection和PrepareStatement对象
String sql=" select id,name,email,age from student where id=?";
PreparedStatement pst=con.preparedStatement(sql);
pst.setInt(1,1001);
2.执行sql封装为resultType=“com.zsz.domain.Student”这个对象
Result re=ps.executeQuery();
Student student=null;
while(rs.next()){
//从数据库取表的一行数据,存到一个java对象的属性中
student=new Student();
student.setId(rs.getInt("id"));
...
}
return student;//赋给了dao方法调用的返回值
-->
测试方法:
@Test
public void testSelectStudentById(){
SqlSession sqlSession= MybatisUtils.getSqlSession();
StudentDao dao=sqlSession.getMapper(StudentDao.class);
//调用dao的方法来执行数据库的操作
Student student= dao.selectStudentById(61005);
System.out.println("student="+student);
}
/**
* 多个参数:命名参数,在形参定义的前面加入@Param("自定义参数名称")
*
*/
List<Student> selectMultiParam(@Param("myname")String name,
@Param("myage")Integer age);
mapper文件:
<!--多个参数使用@Param命名-->
<select id="selectMultiParam" resultType="com.zsz.domain.Student">
select id,name,email,age from student where name =#{myname} or age=#{myage}
</select>
测试方法:
@Test
public void testselectMultiParam(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> studentList = dao.selectMultiParam("张三", 20);
for (Student student:studentList) {
System.out.println("学生="+student);
}
sqlSession.close();
}
![](https://i-blog.csdnimg.cn/blog_migrate/1b932deb03bd6dce2d29ad57514a4335.png)
多个参数,使用java对象的属性值,作为参数实际值
使用对象语法:#{属性名,javaType=类型名称,jdbcType=数据类型} 很少用。
javaType:指java中的属性的数据类型。
jdbcType:在数据库中的数据类型。
例如:#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
我们使用的是简化的方式:#{属性名} javaType和jdbcType的值mybatis反射可以获取,不用提供。
/**
* 多个参数:使用java对象作为接口中方法的参数
*
*/
List<Student> selectMultiObject(QueryParam queryParam);
mapper文件:
<!--
<select id="selectMultiObject" resultType="com.zsz.domain.Student">
select id,name,email,age from student where name =#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
or age=#{paramAge,javaType=java.lang.Integer,jdbcType=Integer}
</select>
-->
<select id="selectMultiObject" resultType="com.zsz.domain.Student">
select id,name,email,age from student where name =#{paramName}
or age=#{paramAge}
</select>
测试方法:
@Test
public void testSelectMultiObject(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
QueryParam queryParam=new QueryParam();
queryParam.setParamAge(20);
queryParam.setParamName("李四");
List<Student> studentList = dao.selectMultiObject(queryParam);
for (Student student:studentList) {
System.out.println("学生="+student);
}
sqlSession.close();
}
3.# 和 $
select id,name, email,age from student where id=#{studentId}
# 的结果: select id,name, email,age from student where id=?
select id,name, email,age from student where id=${studentId}
$ 的结果:select id,name, email,age from student where id=1001
String sql="select id,name, email,age from student where id=" + "1001";
使用的Statement对象执行sql, 效率比PreparedStatement低。
$:可以替换表名或者列名, 你能确定数据是安全的。可以使用$
# 和 $区别
1. #使用 ?在sql语句中做站位的, 使用PreparedStatement执行sql,效率高
2. #能够避免sql注入,更安全。
3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
4. $有sql注入的风险,缺乏安全性。
5. $:可以替换表名或者列名