[TOC]

使用示例

首先创建 mybatis-config.xml 配置文件,这是 MyBatis 中的基础配置文件,其中配置了数据库的 URL 地址、数据库用户名密码、别名信息、映射配置文件的位置以及一些全局配置信息。具体格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 定义属性值 -->
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://x.x.x.x:3306/user"/>
        <property name="username" value="xxx"/>
        <property name="password" value="xxx"/>
    </properties>
    <!-- 全局配置信息 -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!-- 别名配置信息,在mapper文件中可直接使用UserInfo这个别名代替org.xl.mybatis.UserInfo这个类 -->
    <typeAliases>
        <typeAlias type="org.xl.mybatis.UserInfo" alias="UserInfo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <!-- 配置事务管理器的类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源的类型, 以及数据库连接的相关信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mybatis/mapper/UserInfoMapper.xml"/>
    </mappers>
</configuration>

了解了 mybatis-config.xml 配置文件的大致结构后,我们来看一下 UserInfoMapper.xml 映射配置文件的结构,具体代码如下:

<?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="org.xl.mybatis.UserInfoMapper">
    <!-- 定义映射规则,这里直接使用别名代替完整类路径 -->
    <resultMap id="UserInfoResultMap" type="UserInfo">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="age" property="age"/>
        <result column="address" property="address"/>
        <result column="creat_time" property="creatTime"/>
    </resultMap>
    <!-- 定义SQL语句 -->
    <select id="getAll" resultMap="UserInfoResultMap">
        SELECT * FROM user_info;
    </select>
</mapper>

最后我们来看一下 Java 程序中如何加载上述配置文件以及如何使用 MyBatis 的 API。

public class MyBatisMain {
    public static void main(String[] args) throws IOException {
        String resourceLocation = "mybatis/config/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourceLocation);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            List<UserInfo> list = sqlSession.selectList("org.xl.mybatis.UserInfoMapper.getAll");
            System.out.println(list);
        } finally {
            sqlSession.close();
        }
    }
}

与 Spring 集成

与 Spring 集成后,无需再通过 SqlSession 来执行 SQL 语句,而是直接以 Bean 的形式注入相应的 Mapper 接口类然后执行方法即可。

@Configuration
@MapperScan(basePackages = {"com.example.mybatis.dao"}, sqlSessionFactoryRef = "sqlSessionFactory")
public class MyBatisConfig {

    @Autowired
    private DataSource dataSource;

    @Bean(name = "sqlSessionFactory")
    @ConditionalOnMissingBean(SqlSessionFactory.class)
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        // 配置数据源
        sessionFactory.setDataSource(dataSource);
        // 用于加载mybatis配置文件
        sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver()
                .getResource("classpath:mybatis-config.xml"));
        // 配置包中类的别名,配置后在XML映射文件中使用时可以省略包名部分,直接用类名
        sessionFactory.setTypeAliasesPackage("com.example.mybatis.domain");
        // 配置XML映射文件的路径
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/*mapper.xml"));
        // mybatis全局配置
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        // 关闭全局二级缓存
        configuration.setCacheEnabled(false);
        // 下划线自动转驼峰映射实体类
        configuration.setMapUnderscoreToCamelCase(true);
        sessionFactory.setConfiguration(configuration);
        return sessionFactory.getObject();
    }
}

其中,@MapperScan 注解用于扫描 Mapper 文件对应的接口,属性含义如下:

  • basePackage:用于配置基本的包路径。每个映射器将会在指定的包路径中递归地被搜索到。
  • annotationClass:用于过滤被扫描的接口,如果设置了该属性,那么 MyBatis 的接口只有包含该注解才会被扫描进去。
  • sqlSessionFactoryRef:指定在 Spring 上下文中有多个 SqlSessionTemplate 的情况下使用。通常只有在有多个数据源时才需要这样做。

MyBatis 映射语句基础

MyBatis 的强大之处在于它的映射语句,这也是它的魔力所在。同时 MyBatis 3.0 支持使用接口来调用方法,通过使用 Java 的动态代理可以直接通过接口来调用相应的方法,不需要提供接口的实现类。另外,当有多个参数时可通过 @Param 注解设置参数的名字省去了手动构造 Map 参数的过程,尤其在 Spring 中使用的时候,可以配置为自动扫描所有的接口类,直接将接口注入需要用到的地方。

1. XML 方式

1.1 select

接口定义如下:

public interface AppInfoDao {
    AppInfo queryById(@Param("id") Long id);
}

相应 Mapper 定义如下:

<mapper namespace="com.example.mybatis.dao.AppInfoDao">
    <resultMap id="appInfoMap" type="com.example.mybatis.domain.AppInfo">
        <id property="id" column="id"/>
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="buName" column="bu_name"/>
        <result property="empEmail" column="emp_email"/>
        <result property="prodFullPath" column="prod_full_path"/>
    </resultMap>
    <select id="queryById" resultMap="appInfoMap">
        select * from app_info where id = #{id}
    </select>
</mapper>