MyBatis的传参是怎么完成的:
传入参数 : 从java代码中把数据传入到mapper文件的xml中
/*
parameterType : 写在mapper文件中的一个属性 , 表示dao接口中方法的参数的数据类型
值 : 是java的数据类型的全限定名称 , java.lang.Integer
或者是mybatis定义的别名 int
resultType : 规定返回值的数据类型
值 : 是java的数据类型的全限定名称
或者是mybatis定义的别名
注意 : parameterType :不是强制的 , mybatis通过反射机制能够发现接口参数的数据类型
所以可以没有 , 一般我们也不写
一个简单类型的参数 :
/*
简单类型 :
mybatis把java的基本数据类型 , 和String 都叫做简单数据类型
在mapper中 , 文件获取简单数据类型的一个参数的值 , 使用 #{任意字符}
使用 #{}之后 , mybatis执行sql是使用jdbc中的PreparedStatement对象
由mybatis执行下面的代码
1. mybatis创建 Connection , PreparedStatement 对象
*/
String sql = "select * from student where id = ? ";
PreparedStatement pst = conn.preparedStatement(sql);
pst.setInt(1,1003);
//2.执行sql封装为 resultType="org.sichen.domain.Student" 这个对象
ResultSet rs = ps.executeQuery();
Student student = null;
while(rs.next()){
//从数据库中取表的行数据 , 存到一个java对象的属性中
student = new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setEmail(rs.getString("email"));
student.setAge(rs.getInt("age"));
}
return student; //给了dao方法调用的返回值
//接口定义 :
public Student findOne(int id);
<!--mapper中的定义-->
<select id="findOne" resultType="org.sichen.domain.Student">
select * from student where id = #{id}; <!--这个可以是任意的字符-->
</select>
<!--(parameterType可以忽略不写)-->
多个参数 :
多个参数 : 使用 @Param :
@Param : 命名参数
//接口 :
public List<Student> findTwo(@Param("myname") String name , @Param("myage") Integer age);
//使用@Param命名参数
@Param("参数名") String name , @Param("参数名") Integer age
<!--mapper文件中 :-->
<select id="findTwo" resultType="org.sichen.domain.Student">
select *
from student
where name = #{myname}
or id = #{myid};
</select>
多个参数 : 使用对象 :
使用java对象传递参数 , java的属性值就是SQL需要的参数值 , 每一个属性就是一个参数 ,
创建一个bean对象用来存储属性 QueryParam.java
这个类型是没有限制的 , 什么类型都可以
public class QueryParam {
private String myname;
private Integer myage;
//提供get和set方法
}
//接口 :
List<Student> findThree (QueryParam param);
<!--mapper文件中
使用对象的语法 :
完整语法 : #{属性名 , javaType=类型名称 , jdbcType=数据库类型 }
例如 : #{myname , javaType=java.lang.String , jdbcType=VARCHAR}
开发中一般使用的语法 :
#{属性名} 其他两个值 , mybatis反射能够获取 , 不用提供
-->
<select id="findThree" resultType="org.sichen.domain.Student">
select *
from student
where name = #{myname}
or id = #{myage};
</select>
多个参数 : 按位置 :(不常用)
语法 :
#{arg0} , #{arg1} ,这种格式
按照传递参数从左往右数的位置, 在后边加上下标
多个参数 : 使用Map: (不常用)
语法 :
#{key的名称}
#和$的区别:
/*
# : 叫做占位符 , 告诉MyBatis使用实际的参数值替代 , 并使用 PrepareStatement对象执行sql 语句 , #{...}代替sql语句中的 ?
这样做更安全(避免sql注入) , 便捷 ,通常也是首选做法
select * from student where id = ?;
$ : 字符串替换 ,告诉MyBatis使用$包含的字符串替换所在位置 , 使用Statement把SQL语句 和${}的内容连接起来 ,
主要用在替换表名 , 列名 , 不同列排序等操作
select * from student where id = 1001;
使用$替换列名.或表名
select * from ${传递的表名} where id = ?;