纯 Java MyBatis 映射器?

Posted

技术标签:

【中文标题】纯 Java MyBatis 映射器?【英文标题】:Pure Java MyBatis Mappers? 【发布时间】:2012-12-24 19:19:45 【问题描述】:

我有一个项目使用 Mybatis (v3.0.5) 进行 OR/mapping。典型(功能)设置如下:

    要映射的 POJO - Fruit 一个“MyBatis”映射器 XML 文件 - FruitMapper.xml - 所有 SQL 查询的去向 定义所有相同映射器方法的接口映射器 - FruitMapper.java 具有接口映射器引用的 DAO - FruitDao MyBatis 配置文件 - mybatis-config.xml 使用 Spring config XML 将所有内容链接在一起 - myapp-spring-config.xml

一个示例实现:

public class Fruit 
    private String type = "Orange"; // Orange by default!

    // Getters & setters, etc. This is just a VO/POJO
    // that corresponds to a [fruits] table in my DB.


public interface FruitMapper 
    public List<Fruit> getAllFruits();



public class FruitDao 
    private FruitMapper mapper;

    // Getters & setters

    public List<Fruit> getAllFruits() 
        return mapper.getAllFruits();
    

FruitMapper.xml

<mapper namespace="net.me.myapp.FruitMapper">
    <select id="getAllFruits" resultSetType="FORWARD_ONLY">
        SELECT * FROM fruits
    </select>
</mapper>

mybatis-config.xml

<configuration>
    <!-- Nothing special here. -->
</configuration>

myapp-spring-config.xml:(这是我想要摆脱的)

<bean id="fruitDao" class="net.me.myapp.FruitDao">
    <property name="mapper" ref="fruitMapper" />
</bean>
<bean id="fruitMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
    <property name="mapperInterface" value="net.me.myapp.FruitMapper" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="myDatasource" /> 
    <property name="configLocation" value="classpath:mybatis-config.xml" />
    <property name="mapperLocations" value="classpath:*Mapper.xml" />
</bean>
<bean id="myDatasource" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
    <property name="jndiName">
        <value>java:/comp/env/jdbc/our-mysql-database</value>
    </property>
</bean>

这很好用。但是,我不是 Spring 的忠实粉丝,我想知道如何实现我自己的纯 Java 版本,即 Spring 配置文件中所有 bean 的功能。

所以我问:我需要编写什么“胶水代码”/类才能正确实现FruitMapper.java,以便它在运行时绑定到FruitMapper.xml这样每当我写:

FruitMapperDao dao = new FruitMapperDao();
FruitMapperImpl mapper = new FruitMapperImpl(); // <== this is what I need to implement here
dao.setMapper(mapper);

List<Fruit> allFruits = dao.getAllFruits();

...那么我应该得到我的数据源中所有fruit 记录的列表吗?提前致谢!

更新

我还应该提到,鉴于上述设置,我需要在运行时类路径上同时使用 mybatis.jarmybatis-spring.jar。我想完全摆脱 Spring,并且不需要任何 Spring jar 或类来让我的纯 Java 解决方案工作!

【问题讨论】:

您可以使用包含 SQL 映射注释的 Java 类来避免对 XML 的需求。公共接口 BlogMapper @Select("SELECT * FROM blog WHERE id = #id") 博客 selectBlog(int id); 【参考方案1】:

您需要获取一个SqlSession 实例(例如名为session)并调用方法session.getMapper(FruitMapper.class)。你会得到一个已经实现了mapper接口的对象,然后调用它的方法从DB中获取数据。

附:您可以像这样在没有 Spring 的情况下获取 SqlSession:

InputStream inputStream = Resources.getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = factory.openSession();

【讨论】:

以上是关于纯 Java MyBatis 映射器?的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis sql映射器 Mapper

mybatis精讲--映射器组件

mybatis之映射器

mybatis 映射器

MyBatis配置文件--mappers映射器

MyBatis映射器