- DAO 接口的全路径名和 XML 文件中的 SQL标签的 namespace + id 是一样的。其实,这也是建立关联的根本原因。
一句话讲完就是:MyBatis 会先解析这些 XML 文件,通过 XML 文件里面的命名空间 (namespace)跟 DAO 建立关系;然后 XML 中的每段 SQL 会有一个id 跟 DAO 接口的方法名一样,从而进行关联。
Mybatis配置文件:
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage指定要扫描的包,在此包之下的映射器都会被搜索到。可指定多个包,包与包之间用逗号或分号分隔-->
<property name="basePackage" value="com.joonwhee.open.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:config/mapper/*.xml"/>
<property name="configLocation" value="classpath:config/mybatis/mybatis-config.xml"/>
<!--Entity package -->
<property name="typeAliasesPackage" value="com.joonwhee.open.po"/>
</bean>
<!-- dataSource -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
- 1、配置MapperScannerConfigurer类,指定basePackage属性为要扫描的包的包路径,在此包之下的映射器(也就是dao接口)都会被搜索到。
- 2、配置SqlSessionFactoryBean类,指定数据源、mapper.xml所在的包路径、核心配置文件路径等
- 3、配置数据源datasource类,主要包括数据库驱动、数据库url、用户名、密码
通常我们还会有 DAO 类和 对用的 mapper 文件,如下:
package com.joonwhee.open.mapper;
import com.joonwhee.open.po.UserPO;
public interface UserPOMapper {
UserPO queryByPrimaryKey(Integer id);
}
<?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.joonwhee.open.mapper.UserPOMapper" >
<resultMap id="BaseResultMap" type="com.joonwhee.open.po.UserPO">
<result column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
</resultMap>
<select id="queryByPrimaryKey" resultMap="BaseResultMap"
parameterType="java.lang.Integer">
select id, name
from user
where id = #{id,jdbcType=INTEGER}
</select>
</mapper>
1、
SqlSessionFactory
Builder创建SqlSessionFactory
- 但 SqlSessionFactory 是一个接口,它里面其实就两个方法:openSession、getConfiguration
- 其中,openSession 方法是为了获取一个 SqlSession 对象,完成必要数据库增删改查功能。
-
可以看到
getConfiguration
是返回Configuration
类的一个方法。你可以把它当成一个配置管家。MyBatis 所有的配置信息都维持在Configuration
对象之中,配置 mapper 映射文件、SQL 参数、返回值类型、缓存等属性。
/**
* Creates an {@link SqlSession} out of a connection or a DataSource
*
* @author Clinton Begin
*/
public interface SqlSessionFactory {
SqlSession openSession();
SqlSession openSession(boolean autoCommit);
SqlSession openSession(Connection connection);
SqlSession openSession(TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, boolean autoCommit);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType, Connection connection);
Configuration getConfiguration();
}