Mapper XML 文件用于将定义的自己定义的mapper接口,映射为对应的sql语句,简化了程序与数据库打交道的过程,能通过配置,直接将查询到的结果装载成你想要的对象返回给你。
本篇文章只讲了从映射器接口的定义到mybatis-config.xml中对mapper的注册,没有细致讲解mapper的用法,如需查看其他用法,等我试试水了再更新。
我把整个映射器的配置分为三个步骤,代码说话。。。
定义映射器接口,增删改查的方法由你自己定义,我定义了一个最简单的selectUser
package com.shenmiu.mapper;
import com.shenmiu.po.UserPO;
public interface UserMapper {
UserPO selectUser(int id);
}
PO定义(持久化对象)
package com.shenmiu.po;
import org.apache.ibatis.type.Alias;
//注解Alias是MyBatis中设置类型别名的一种方式
@Alias("UserPO")
public class UserPO {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id="+ id +", name= "+ name +", age= "+ age +" ]";
}
}
我对应于上面UserMapper接口的Mapper XML 文件命名为UserMapper.xml,该文件的命名可以随便命名,但是我觉得命名就最好以“接口名称.xml”命名。
<mapper namespace="com.shenmiu.mapper.UserMapper">
<select id="selectUser" parameterType="int" resultType="UserPO">
SELECT id, name, age
FROM users
WHERE id = #{id}
select>
mapper>
将namespace设置成接口的完全限定名是有原因的,等下会讲清楚,不要急。
对应于UserMapper接口中的selectUser方法,文件中存在一个id为”selectUser”的select子元素,该id不一定合接口中的方法名一致,但是强烈建议保持一致
parameterType为selectUser方法的参数类型, resultType为selectUser方法的返回值类型
select子元素中的元素内容就是你自己写的sql语句,sql语句的书写要求及格式不进行讲解。
除了select,该文件中还存在其它顶级元素
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
cache
– 给定命名空间的缓存配置。cache-ref
– 其他命名空间缓存配置的引用。resultMap
– 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。sql
– 可被其他语句引用的可重用语句块。insert
– 映射插入语句update
– 映射更新语句delete
– 映射删除语句select
– 映射查询语句本例中只给出了select的用法,其它元素的用法请查阅官方文档。
最后一步涉及到mybatis-config.xml(MyBatis的映射配置文件,你的文件名可能和我的文件名不一样,)中mappers的配置。
下面是我存放的该UserMapper.xml文件的目录结构,该目录结构对于等下配置第一种映射器注册配置有关
对于第一种方法,UserMapper接口不用做任何修改,接着就是在mybatis-config.xml文件中注册映射器
<mappers>
<mapper resource="mapping/UserMapper.xml"/>
mappers>
注意resource的路径,不正确的话会导致MyBatis找不到你的映射文件
类结构目录,与第二种映射器注册的配置有关
这种配置方式需要给你的UserMapper的方法加上注解,该注解的值和UserMapper文件中设置的sql语句一样
public interface UserMapper {
@Select("select * from users where id = #{id}")
UserPO selectUser(int id);
}
在mybatis-config.xml中注册映射器
"com.shenmiu.mapper.UserMapper"/>
注意mapper中class的路径以及package中name的路径,保证正确,我使用的IDEA,会有路径的提示
由于注册方式有两种,那么映射器的使用也有两种方式
package com.shenmiu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtil {
static SqlSessionFactory sqlSessionFactory;
private SqlSessionFactoryUtil(){
}
private static void factoryInit(){
//mybatis的配置文件,该文件路径见上图
String resource = "mybatis-config.xml";
//加载mybatis的配置文件
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//构建sqlSession的工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static final SqlSessionFactory getSqlSessionFactory(){
if(null == sqlSessionFactory){
factoryInit();
}
return sqlSessionFactory;
}
}
package com.shenmiu.daoImpl;
import com.shenmiu.SqlSessionFactoryUtil;
import com.shenmiu.dao.UserDao;
import com.shenmiu.mapper.UserMapper;
import com.shenmiu.po.UserPO;
import org.apache.ibatis.session.SqlSession;
public class UserDaoImpl implements UserDao {
public UserPO getUser(int id) {
SqlSession session = SqlSessionFactoryUtil.getSqlSessionFactory().openSession();
UserPO user = null;
try {
// user = session.selectOne("com.shenmiu.mapper.UserMapper.selectUser", id); 对应第一种注册方法
// user = session.getMapper(UserMapper.class).selectUser(1); 对应第二种注册方法
} finally {
session.close();
}
return user;
}
}
注意:
综上,强烈推荐使用mapper中使用resource属性的注册方法(多写一个UserMapper.xml文件没有坏处)