parameterType(输入类型)
#{}和${}
<!-- 根据id查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
#{}
使用占位符#{}可以有效防止 sql 注入,在使用时不需要关心参数值的类型,mybatis 会自动进行 java 类型和 jdbc 类型的转换。#{}可以接收简单类型值或 pojo 属性值,如果 parameterType传输单个简单类型值,#{}括号中可以是 value 或其它名称。
${}
${}和#{}不同,通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转
换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}
括号中只能是 value。使用${}不能防止 sql 注入,但是有时用${}会非常方便。比如对姓名的模糊查询
<!-- 根据名称模糊查询用户信息 -->
<select id="selectUserByName" parameterType="string" resultType="user">
select * from user where username like '%${value}%'
</select>
但是用${}方法容易被SQL注入,所以我们只在一些特定的场合才用${},比如说在用order by排序时,将排序方式用参数传入sql(desc,asc)时,只能用${}才能做到。
传递POJO对象
示例如下:
<!—传递pojo对象综合查询用户信息 -->
<select id="findUserByUser" parameterType="user" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
传递自定义包装对象
定义一个包装对象
public class QueryVo {
private User user;
//自定义用户扩展类
private UserCustom userCustom;
mapper映射文件
<!—- 查询用户列表根据姓名和性别查询 -->
<select id="findUserList" parameterType="queryVo" resultType="user">
select * from user where useranme = #{user.username} and gender = #{user.gender}
</select>
传递hashmap
<!-- 传递hashmap综合查询用户信息 -->
<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
resultType(输出类型)
简单输出类型
查询结果有且只有能有一条记录,并且是将查询结果的第一个字段的值作为输出的值
mapper文件:
<!-- 获取用户列表总数 -->
<select id="findUserCount" parameterType="user" resultType="int">
select count(1) from user
</select>
mapper接口:
public int findUserCount(User user) throws Exception;
调用:
Public void testFindUserCount() throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUsername("管理员");
//传递Hashmap对象查询用户列表
int count = userMapper.findUserCount(user);
//关闭session
session.close();
}
输出简单类型必须查询出来的结果集有一条记录(且只能是一条记录),最终将第一个字段的值转换为输出类型