映射器接口,Mpper XML 文件及mappers配置

映射器接口,Mpper XML 文件及mappers配置


Mapper XML 文件用于将定义的自己定义的mapper接口,映射为对应的sql语句,简化了程序与数据库打交道的过程,能通过配置,直接将查询到的结果装载成你想要的对象返回给你。

本篇文章只讲了从映射器接口的定义到mybatis-config.xml中对mapper的注册,没有细致讲解mapper的用法,如需查看其他用法,等我试试水了再更新。

我把整个映射器的配置分为三个步骤,代码说话。。。

    • 映射器接口Mpper XML 文件及mappers配置
      • 映射器接口的定义
      • Mapper XML 文件
      • mappers的配置
      • 使用映射器
        • 使用单例模式创建SqlSessionFactory
        • 在DaoImpl中使用映射器

映射器接口的定义

定义映射器接口,增删改查的方法由你自己定义,我定义了一个最简单的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 +" ]";
    }
}

Mapper XML 文件

我对应于上面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的用法,其它元素的用法请查阅官方文档。


mappers的配置

最后一步涉及到mybatis-config.xml(MyBatis的映射配置文件,你的文件名可能和我的文件名不一样,)中mappers的配置。

下面是我存放的该UserMapper.xml文件的目录结构,该目录结构对于等下配置第一种映射器注册配置有关

Mapper XML 文件存放位置

对于第一种方法,UserMapper接口不用做任何修改,接着就是在mybatis-config.xml文件中注册映射器

<mappers>
    <mapper resource="mapping/UserMapper.xml"/>
mappers>

注意resource的路径,不正确的话会导致MyBatis找不到你的映射文件



类结构目录,与第二种映射器注册的配置有关

映射器接口,Mpper XML 文件及mappers配置_第1张图片

这种配置方式需要给你的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,会有路径的提示


使用映射器

由于注册方式有两种,那么映射器的使用也有两种方式

使用单例模式创建SqlSessionFactory

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;
    }
}

在DaoImpl中使用映射器

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;
    }

}

注意:

  1. 第一种使用方法中的selectOne的参数为UserMapper.xml文件中的namespace+id,这种限定名唯一指定了所要执行的sql语句
  2. 第二种使用方法中的getMapper的参数为UserMapper.class,即你的映射器的class对象
  3. 当你使用第一种注册方法的时候,如果namespace是完全限定的类名以及id是对应类的方法名的,你就同样能用getMapper的方法获取到需要的mapper对象
  4. 当你使用第二种注册方法的时候,却必须且只能使用getMapper的方法

综上,强烈推荐使用mapper中使用resource属性的注册方法(多写一个UserMapper.xml文件没有坏处)

你可能感兴趣的:(MyBatis)