1.<b>下面以“MyCinema”数据库作为示范来讲解MyBatis的使用</b>
2.在项目中导入MyBatis框架jar包
使用MyBatis开发数据访问层,只需要导入mybatis-3.x.x.jar和对应的JDBC驱动即可。以下使用两种方式导入相关依赖。
(1)直接导入
(2)使用Maven
<dependencies>
<!-- JDBC MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
<!-- MyBatis 核心依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.5</version>
</dependency>
</dependencies>
3.设置MyBatis框架的配置信息
MyBatis框架需要两种配置文件:“主配置文件”和“查询映射配置文件”。
主配置文件(mybatis.xml),用于配置“数据库会话工厂”,主要作包括:1)数据库连接(连接池)信息;2)指定其他查询映射配置文件的位置。
查询映射配置文件(CategoryMapper.xml),一般用于配置某实体类(Category.java)的CURD操作所涉及的SQL语句。
如果是Maven项目,这些配置信息都应该放在Resources目录中。
(1)创建“MyBatis主配置文件”
在“类目录”下创建名为mybatis.xml(文件名可自定)的文件,配置内容如下:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/MyCinema" />
<property name="username" value="root" />
<property name="password" value="1234" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/CategoryMapper.xml" />
</mappers>
</configuration>
其中,“红色字体”部份用于配置数据库的连接信息(JDBC驱动、数据库url、用户名和密码);而“蓝色字体”部分用于指定针对实体类的查询映射配置文件的位置。
(2)创建查询映射配置文件
创建数据实体类Category.java和实体映射文件CategoryMapper.xml。
以下实体类表示电影分类,与数据库的Category表对应。
public class Category {
private int id;
private String name;
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;
}
}
Category的查询映射文件的结构如下所示:
<?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="mycinema.dao.CategoryMapper">
<select id="fetchById" parameterType="int" resultType="mycinema.entity.Category">
select * from Category where id=#{id}
</select>
</mapper>
每添加一个实体配置文件,就应该在主配置文件(mybatis.xml)中加入一个<mapper>元素,以告知框架要把该实体加入到映射中,详见上一节mybatis.xml配置中的蓝色字体部份。
注意点:
1)mapper元素的namespace与select元素的id共同决定了一个SQL语句的“坐标”,在MyBatis框架执行查询时,使用坐标标识所调用的SQL
2)SQL语句中的参数通过“#{参数名}”的方式声明,而参数类型需要通过select元素的parameterType来声明
3)select元素通过resultType来声明返回类型(实体对象)
4.创建MyBatis数据库会话(SqlSession)并执行查询
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
try {
Category c = (Category)session.selectOne("mycinema.dao.CategoryMapper.fetchById",1);
System.out.println(c.getName());
} finally {
session.close();
}
5.使用映射器(Mapper)接口操作SQL语句
上述的查询中,使用映射语句“mycinema.dao.CategoryMapper.fetchById”指定要执行的SQL,这种弱类型的使用方式容易出问题:缺乏编程提示和编译检查。为此,MyBatis还提供了强类型的使用方式——映射器(Mapper)方式。
实际上,MyBatis中所谓的“映射器”接口就是我们所说的“数据访问对象”(DAO)接口。
该使用方式的具体做法如下:
(1)在查询配置文件CategoryMapper.xml中,把mapper元的namespace属性指定为一个映射器接口(CategoryMapper)的完全限定类名。
<?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="mycinema.dao.CategoryMapper">
<select id="fetchById" parameterType="int" resultType="mycinema.entity.Category">
select * from Category where id = #{id}
</select>
</mapper>
(2)在映射器接口(mycinema.dao.CategoryMapper)中声明方法(fetchById),该方法的签名与配置文件的select元素匹配(方法名与select元素id相同,返回值类型和参数类型也必须对应)。
public interface CategoryMapper {
public Category fetchById(int id);
}
(3)按上设置后,我们就可以通过CategoryMapper接口实现前面的查询了:
SqlSession session = factory.openSession();
try {
CategoryMapper mapper = session.getMapper(CategoryMapper.class);
Category c = mapper.fetchById(1);
System.out.println(c.getName());
} finally {
session.close();
}
这种调用方式是通过接口动态代理来实现的,并不需要为接口添加实现类。映射器的调用方式是强类型的,符合对象化思想,不容易出错,在实际中更为常用。