MyBatis中也适用了动态代理模式:使用SqlSession.getMapper(dao接口.class),获取这个dao接口的对象
传入参数:从java代码中把数据传入到mapper文件的sql语句
parameterType
写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型
例如UserDao接口
public User selectUserById(Integer id):该方法需要传递一个整型的参数
那么在mapper.xml中配置
<select id="selectUserById" parameterType="java.lang.Integer" resultType="com.itheima.domain.User"> select * from user where id=#{id} </select>
parameterType它的值是java的数据类型的全限定名称或者是mybatis定义的别名
例如: parameterType="java.lang.Integer"
注意:parameterType不是强制的,因为mybatis通过反射机制能够发现接口参数的数据类型,所以可以没有,一般我们也不写。
一个简单类型的参数
简单类型:mybatis把java的基本数据类型和String都叫简单类型
在mapper文件中获取简单类型的一个参数的值,使用#{任意字符}
使用#{}之后,mybatis执行sql是使用的jdbc中的PreparedStatement对象
由mybatis执行下面的代码:
1、mybatis创建Connection、PreparedStatement对象
String sql = “select * from user where id=?”;
PreparedStatement pst = conn.preparedStatement(sql);
pst.setInt(1,1001);
2、执行sql封装为ResultType=“com.itheima.domain.User”
ResultSet rs = pst.executrQuery();
while(rs.next()){
//从数据库取表的行数据,存到一个java对选属性中
}
多个参数-使用@Param
当Dao接口方法多个参数,需要通过名称使用参数,在方法形参前面加入@Param{"自定义参数名"},mapper文件中使用#{自定义参数名}
例如UserDao中有这么一个方法:
public List<User> selectMutilParam(@Param("myname") String name,@Param("myage") Integer age)
使用@Param("参数名") String name
mapper文件:
<select>
select * from user where name=#{myage} or age=#{myage}
</select>
多个参数-使用对象
使用java对象传递参数,java的属性值就是sql需要的参数值,每一个属性就是一个参数
格式:#{属性名,javaType=类型名称,jdbcType=数据类型} 这种合适很少用
javaType:指java中的属性数据类型
jdbcType:在数据库中的数据类型
例如:#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
简化方式:#{属性名},javaType和jdbcType的值,Mybatis反射能够获取,不用提供了
#{}和${}占位符的区别
#:使用?做占位符,告诉mybatis使用实际的参数值代替,并使用PrepareStatement对象执行sql语句,#{...}代替sql语句中的“?”,这样做更安全,更迅速,通常这也是首选做法。
$:字符串替换,告诉mybatis使用$包含的“字符串”替换所在位置,使用Statement把sql语句和${}的内容连接起来,主要用在替换表名、别列名、不同列排序等操作。