目标
- 能够使用映射配置文件实现CRUD操作
- 能够使用注解实现CRUD操作
有些数据的属性比较多,在页面表格中无法全部实现,而只会显示部分,而其他属性数据的查询可以通过 查看详情
来进行查询,如上图所示。
查看详情功能实现步骤:
编写接口方法:Mapper接口
参数:id
查看详情就是查询某一行数据,所以需要根据id进行查询。而id以后是由页面传递过来。
结果:Brand
根据id查询出来的数据只要一条,而将一条数据封装成一个Brand对象即可
编写SQL语句:SQL映射文件
执行方法、进行测试
在 BrandMapper
接口中定义根据id查询数据的方法
xxxxxxxxxx
/**
* 查看详情:根据Id查询
*/
Brand selectById(int id);
在 BrandMapper.xml
映射配置文件中编写 statement
,使用 resultMap
而不是使用 resultType
xxxxxxxxxx
<select id="selectById" resultMap="brandResultMap">
select *
from tb_brand where id = #{id};
</select>
注意:上述SQL中的 #{id}先这样写,一会我们再详细讲解
在 test/java
下的 com.itheima.mapper
包下的 MybatisTest类中
定义测试方法
xxxxxxxxxx
public void testSelectById() throws IOException {
//接收参数,该id以后需要传递过来
int id = 1;
//1. 获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 获取Mapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//4. 执行方法
Brand brand = brandMapper.selectById(id);
System.out.println(brand);
//5. 释放资源
sqlSession.close();
}
执行测试方法结果如下:
查询到的结果很好理解就是id为1的这行数据。而这里我们需要看控制台显示的SQL语句,能看到使用?进行占位。说明我们在映射配置文件中的写的 #{id}
最终会被?进行占位。接下来我们就聊聊映射配置文件中的参数占位符。
mybatis提供了两种参数占位符:
#{} :执行SQL时,会将 #{} 占位符替换为?,将来自动设置参数值。从上述例子可以看出使用#{} 底层使用的是 PreparedStatement
${} :拼接SQL。底层使用的是 Statement
,会存在SQL注入问题。如下图将 映射配置文件中的 #{} 替换成 ${} 来看效果
xxxxxxxxxx
<select id="selectById" resultMap="brandResultMap">
select *
from tb_brand where id = ${id};
</select>
重新运行查看结果如下:
==注意:==从上面两个例子可以看出,以后开发我们使用 #{} 参数占位符。
对于有参数的mapper接口方法,我们在映射配置文件中应该配置 ParameterType
来指定参数类型。只不过该属性都可以省略。如下图:
xxxxxxxxxx
<select id="selectById" parameterType="int" resultMap="brandResultMap">
select *
from tb_brand where id = ${id};
</select>
以后肯定会在SQL语句中写一下特殊字符,比如某一个字段大于某个值,如下图
可以看出报错了,因为映射配置文件是xml类型的问题,而 > < 等这些字符在xml中有特殊含义,所以此时我们需要将这些符号进行转义,可以使用以下两种方式进行转义
转义字符
下图的 <
就是 <
的转义字符。