XML映射文件
在日常使用中,通过注释的方式使用简单sql语句可能足够了,但是如果遇到比较复杂的sql语句,注释就显得力不从心了,例如动态sql语句,xml映射文件解决了注释sql的缺点
xm文件规范
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
XML映射文件的namespace属性为Mapper接口全限定名一致
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
一、XML配置文件实现
第1步:创建XML映射文件
在/resources文件夹下创建一个和接口地址一样的包名,然后创建一个同名的文件
例如,我们的项目结构是这样的
我们想将mapper包下的UserMapper的sql语句在xml文件中实现,我们就需要在创建一个同名包,我们可以直接右键选择Copy Reforence
复制文件全名,这里
mapper的全名为com.aboutjianzhe.mapper
,那么我们就需要在resource下同样创建一个同名的包,创建语句是这样的com/aboutjianzhe/mapper
,
这里我们使用斜杠/
而不是点.
,注意,然后创建一个同名的xml文件,图中应该创建UserMapper.xml
这个文件
二、编写XML映射文件
在我们创建的xml文件里添加以下结构基本语句,可以直接区官网复制,传送门
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
解释:
namespace
:填写的是mapper包的全名,这里我们应该填写com.aboutjianzhe.mapper
,这样写是为了让springboot能够找到sql语句的位置id
为Mapper对应的接口函数名resultType
为返回值类型的全类名,注意,是单条记录的类型,例如:List 的返回值类型应该为Emp为不是List
完整代码
<?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.aboutjianzhe.mapper.UserMapper">
<select id="list" resultType="com.aboutjianzhe.pojo.User">
select * from user where name = #{name};
</select>
</mapper>
@Mapper
public interface UserMapper {
List<User> list(String name);
}
解释:
id
:与函数名相同,我们这里的函数名是list,所以id那里填写listresultType
:返回值类型,注意,这里的返回值类型是单个返回值类型,不是List<User>,而是User
,这里同样需要填写User的全名路径com.aboutjianzhe.pojo.User
select
:这个标签表示我们需要执行的操作,我们需要的是查询操作,所以选择select标签
三、插件推荐:MyBatisX
使用
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.EmpMapper">
<select id="getEmpsByPage" resultType="com.example.pojo.Emp">
select * from emp
<where>
<if test="name!= null and name != ''">
and name like concat('%',#{name},'%')
</if>
<if test="gender!= null">
and gender = #{gender}
</if>
<if test="begin != null and end != null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
</mapper>
and #{end}
order by update_time desc