[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>