在MyBatis中,既可以通过注解
的方式配置SQL语句,也可以通过XML映射文件
的方式配置SQL语句。对于简单的SQL语句建议直接通过注解的方式配置SQL语句:
@Delete("delete from user where id=#{id}")
Integer deleteById(Integer id);
但是当实现需求需要复杂的SQL语句时,使用注解往往无法很好的完成需求。此时就需要使用XML映射文件
配置SQL语句。
XML映射文件默认规则
有了XML映射文件之后,定义Mapper接口方法的时候就不需要在方法上使用注解了(一个Mapper接口的方法不能对应两条SQL语句)。以下是XML映射文件的定义规则:
0.XML映射文件中首先需要引入头信息(约束)
,约束信息可以直接在Mybatis官方文档中拷贝:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="your mapper">
<mapper>
1.XML映射文件的名称必须和对应的Mapper接口完全、严格一致,并且XML映射文件必须和Mapper接口放置在相同的包
下 (必须同包同名)。
如图所示,UserMapper
这个Mapper接口和UserMapper.xml
映射文件名称完全一样,并且存放的包的结构也完全一样
。
2.XML映射文件中的namespace属性
必须和对应的Mapper接口
的全限定名完全一致,这样才能正确的进行映射。
如图所示,映射文件中的namespace属性
和对应的Mapper接口
的全限定名一致。
3.XML映射文件中的SQL语句的id必须和Mapper接口中的方法名完全一致,返回类型也必须完全一致。
如图所示,该映射文件的id是selectAll
,代表着这个SQL语句是对应selectAll这个方法;返回的类型也是User
,但是由于selectAll方法的返回值是一个List
,所以说MyBatis会自动将所有查询结果封装为User对象,然后再封装为一个List<User>集合返回给方法。
(注意,这里方法名下的红色波浪线不是报错,只是一个警告,因为这个项目是学习项目,里面有很多模块,模块中有很多同名的包和同名的类,idea在扫描的时候发现了这个问题,报了警告,实际上运行是没问题的。)
使用XML映射文件实现查询全部用户
由于我们使用的是通过XML映射文件
的方式配置SQL,所以说在mapper接口中的代码十分简单:
public List<User> selectAll();
XML映射文件中的代码就相对更加复杂:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wzb.mapper.UserMapper">
<select id="selectAll" resultType="com.wzb.pojo.User">
select * from user
</select>
</mapper>
根据XML映射文件
中定义的SQL语句
可知,该SQL语句会查询user表中的每一个用户,然后将用户的所有字段根据User对象中的属性封装成User实体对象返回;当查询出多条用户记录时,MyBatis框架
会自动将这些一个个创建好的User实体对象封装成一个List
集合。所以说Mapper接口中的方法直接返回List集合
即可。
测试XML映射文件定义SQL语句是否成功:
@Test
public void testSelectAll() {
List<User> userList = userMapper.selectAll();
for (User user : userList) {
System.out.println(user);
}
}
如图所示,成功通过XML
映射文件定义SQL语句
完成了对用户的查询,但是对于这样的简单SQL语句,个人并不推荐使用XML映射文件,而是直接使用注解的方式即可;但是对于动态SQL
这样复杂的SQL语句,就只能使用XML
映射文件进行操作。