在使用Mybatis
操作数据库时,往往脱离不了相关Mapper
文件的编写。今天我们就说说几种Mapper
文件编写的方式及相关路径规则。
如有问题还请大家进行及时纠正。
使用注解方式
如下定义一个操作用户的Mapper
接口:
@Mapper
public interface UserMapper{
@Select("SELECT * FROM user WHERE username = #{username} And age = #{age}")
public User findByUsernameAndAge(
@Param("username") String username),
@Param("age") String age
);
@Select("SELECT * FROM user")
@MapKey(value="id")
public Map<String,User> findAllOfMap();
}
如上代码所示没有特殊路径要求,只需将Mapper
接口注册到MyBatis
上下文即可,无需关系其他。
使用XML文件方式
如下定义一个操作用户的Mapper
接口:
@Mapper
public interface UserMapper{
public User findByUsernameAndAge(
@Param("username") String username),
@Param("age") String age
);
@MapKey(value="id")
public Map<String,User> findAllOfMap();
}
与之对应一个UserMapper.xml
文件编写SQL
片段:
<?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.test.dao.UserMapper">
<select id="findByUsernameAndAge">
SELECT * FROM user WHERE username = #{username} And age = #{age}
</select>
<select id="findAllOfMap" resultType="map">
SELECT * FROM user
</select>
</mapper>
如上代码所示,使用一个Mapper
接口和一个对应的xml
文件编写时,必须保证xml
文件名称必须和对应的Mapper
接口相同,同时保证Mapper
接口和对应的xml
在同一个包下.相关解析源码如下:
private void loadXmlResource() {
// Spring 可能不知道真正的资源名称,所以我们检查一个标志以防止再次加载资源两次,
// 这个标志是在 XMLMapperBuilderbindMapperForNamespace 设置的。
// namespace:org.apache.test.dao.RoleDao:判断mapper接口对应的mapper.xml文件是否加载过
if (!configuration.isResourceLoaded("namespace:" + type.getName())) {
// 通过mapper接口名称获取同包下mapper.xml文件
// interface org.apache.test.dao.RoleDao -> org/apache/test/dao/RoleDao.xml
String xmlResource = type.getName().replace('.', '/') + ".xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(type.getClassLoader(), xmlResource);
} catch (IOException e) {
// ignore, resource is not required
}
// 如果没有加载到mapper接口对应的xml文件时,则通过全注解模式加载mapper信息.
if (inputStream != null) {
// 通过XMLMapperBuilder解析mapper.xml文件
XMLMapperBuilder xmlParser = new XMLMapperBuilder(inputStream, assistant.getConfiguration(), xmlResource,
configuration.getSqlFragments(), type.getName());
xmlParser.parse();
}
}
}
使用MyBatis-Config.xml文件方式
此方式后续进行补充。