【3】mybatis映射器
映射器是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),这些语句称为映射语句或映射 SQL 语句。
1,核心对象,MyBatis 有三个基本要素:
核心接口和类(SqlSessionFactoryBuilder 对象--》 SqlSessionFactory 对象--》SqlSession 对象)
MyBatis核心配置文件(mybatis-config.xml)
SQL映射文件(mapper.xml)
程序运行时,根据 XML 配置文件(mybatis-config.xml)构建SqlSessionFactoryBuilder对象,然后通过 SqlSessionFactoryBuilder 对象获取 SqlSessionFactory 对象,有了 SqlSessionFactory 对象之后,就可以进而获取 SqlSession 对象,SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection。它提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。它们的产生顺序是:SqlSessionFactoryBuilder 对象--》 SqlSessionFactory 对象--》SqlSession 对象,在这里,
SqlSession 的用途主要有两种。
a). 获取映射器。让映射器通过命名空间和方法名称找到对应的 SQL,并发送给数据库,执行后返回结果。
b). 直接通过“命名空间(namespace)+SQL id”的方式执行 SQL,不需要获取映射器
2,映射器mapper
映射器是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),这些语句称为映射语句或映射 SQL 语句,如前面用到的WebsiteMapper.xml就是一个映射文件,用于sql相关操作,它的作用如下。
- 定义参数类型
- 配置缓存
- 提供 SQL 语句和动态 SQL
- 定义查询结果和 POJO 的映射关系
映射器有以下两种实现方式。
- 通过 XML 文件方式实现,比如我们在 mybatis-config.xml 文件中描述的 XML 文件WebsiteMapper.xml,用来生成 mapper。
- 通过注解的方式实现,使用 Configuration 对象注册 Mapper 接口
2.1 XML映射器
1》复制【mybatis尝鲜】这一节中的项目全部代码,生成mybatisDemoA2项目,在net.biancheng.mapper包中添加一个接口类,代码如下:
package net.biancheng.mapper;
import java.util.List;
public interface WebsiteMapper {
public List<Website> selectAllWebsite();
}
2》修改net.biancheng.mapper包下的WebsiteMapper.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 属性,该属性值通常设置为“包名+SQL映射文件名”,用于指定唯一的命名空间。 -->
<mapper namespace="net.biancheng.mapper.WebsiteMapper">
<!-- 查询所有网站信息 -->
<select id="selectAllWebsite"
resultType="net.biancheng.po.Website">
select * from website
</select>
</mapper>
3》修改net.biancheng.test包中的test类代码如下:
package net.biancheng.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import net.biancheng.po.Website;
import net.biancheng.po.WebsiteMapper;
public class test {
public static void main(String[] args) {
InputStream config;
try {
//读取配置文件
config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
.build(config);
//创建sqlsession对象
SqlSession ss = ssf.openSession();
//获取指定对象
WebsiteMapper websiteMapper = ss.getMapper(WebsiteMapper.class);
//调用对象方法
List<Website> websitelist = websiteMapper.selectAllWebsite();
for (Website site : websitelist) {
System.out.println(site.show());
}
ss.commit();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
项目结构如图:

运行结果如下:

注意:关于 MyBatis 的 SQL 映射文件中的 mapper 元素的 namescape 属性有如下要求。
a) namescape 的命名必须跟某个 DAO 接口同名,同属于 DAO 层,因此代码结构上,映射文件与该接口应放置在同一 package 下 ,并且习惯上是以 Mapper 结尾(如 WebsiteMapper.java、WebsiteMapper.xml)。
b) 不同的 mapper 文件中子元素的 id 可以相同,MyBatis 通过 namescape 和子元素的 id 联合区分。接口中的方法与映射文件中的 SQL 语句 id 应一 一对应。
2.2 注解实现映射器
使用注解的方式实现映射器,只需要在接口中使用 Java 注解,注入 SQL 即可,
1》在net.biancheng.mapper中添加一个接口WebsiteMapper2,代码如下:
package net.biancheng.mapper;
import java.util.List;
import net.biancheng.po.Website;
import org.apache.ibatis.annotations.Select;
public interface WebsiteMapper2 {
//使用了与xml相同的select语句,如果使用注解和 XML 文件两种方式同时定义,那么 XML 方式将覆盖掉注解方式
@Select(value = "select * from website")
public List<Website> selectAllWebsite();
}
2》修改mybatis-config.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>
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
<!-- 配置mybatis运行环境 -->
<!-- 在 environments 标签中,可以配置 MyBatis 的多套运行环境,将 SQL 映射到多个不同的数据库上。 -->
<environments default="development">
<!-- 环境变量 -->
<!-- environment 标签提供了两个子标签,即 transactionManager 和 dataSource -->
<!-- environment 是 environments 的子标签,用来配置 MyBatis 的一套运行环境,需指定运行环境 ID、事务管理、数据源配置等相关信息。 -->
<environment id="development">
<!--transactionManager事务, 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<!-- dataSource数据源 ,用于配置数据库的连接属性,例如要连接的数据库的驱动程序名称、URL、用户名和密码等。 -->
<dataSource type="POOLED">
<!-- MySQL数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 连接数据库的URL -->
<property name="url"
value="jdbc:mysql://localhost:3306/cctv?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 将mapper文件加入到配置文件中 -->
<!-- 映射器, mappers 标签用于指定 MyBatis SQL 映射文件的路径 -->
<mappers>
<!-- resource 属性用于指定 SQL 映射文件的路径(类资源路径) -->
<mapper resource="net/biancheng/mapper/WebsiteMapper.xml" />
<!-- 采用接口方式配置,class指向一个完全名称空间下的接口类 -->
<mapper class="net.biancheng.mapper.WebsiteMapper2" />
</mappers>
</configuration>
3》在net.biancheng.test包中添加测试类test2,代码如下:
package net.biancheng.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import net.biancheng.mapper.WebsiteMapper;
import net.biancheng.mapper.WebsiteMapper2;
import net.biancheng.po.Website;
public class test2 {
public static void main(String[] args) {
InputStream config;
try {
//读取配置文件
config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
.build(config);
//创建sqlsession对象
SqlSession ss = ssf.openSession();
//获取指定接口对象
WebsiteMapper2 websiteMapper2 = ss.getMapper(WebsiteMapper2.class);
//调用对象的方法
List<Website> websitelist = websiteMapper2.selectAllWebsite();
for (Website site : websitelist) {
System.out.println(site.show());
}
ss.commit();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
最后项目结构如图:

4》运行结果,内容如下:

本节代码:mybatisDemoA2,下节继续

浙公网安备 33010602011771号