MyBatis 映射文件

直接使用 JDBC 访问数据库,需要在程序中写 SQL 语句,然后执行,如果是查询语句,必须遍历查询结果,把结果读取到对象中。

MyBatis 的 SQL 语句写在映射文件中。映射文件中的 SQL 语句有很多强大功能,如动态 SQL 可根据不同条件拼接 SQL 语句,结果集映射功能只需配置好参数,MyBatis 会直接把结果集读取到对象中,无需手动读取。

MyBatis 的映射文件是 XML 格式,实践中通常一个 Java model 类对应一个映射文件,如 User 类的对应映射文件是 UserMapper.xml。

在 MyBatis 教程 - 环境搭建中,我们创建好了数据库,数据库中包含了一个用户表。

CREATE DATABASE IF NOT EXISTS `aizws_mybatis` 
USE `aizws_mybatis`;

CREATE TABLE IF NOT EXISTS `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='用户表';

INSERT INTO `user` (`id`, `name`) VALUES
    (1, 'user1'),
    (2, 'user2'),
    (3, 'user3'),
    (4, 'user4'),
    (5, 'user5');

创建一个对应的 Java类:User.java

public class User {
    private long id;
    private String name;

    public User(String name) {
        super();
        this.name = name;
    }

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

映射语句是 MyBatis 映射文件中映射到 SQL 的各种语句,如 select、insert、update 和 delete 等语句。

映射语句的特点:

  • 所有的语句都有唯一的 id。要执行这些语句,只需要将对应 id 传递给 Java 方法。
  • 映射文件避免了 Java 代码中重复编写 SQL 语句。与J DBC 相比,使用 MyBatis 中的映射文件减少了95%的代码量。
  • 所有映射语句都包含在<mapper>标签下,该标签有“namespace”属性。如下所示:
<mapper namespace = "User">
   // 映射语句与结果映射
<mapper> 

1. Insert

MyBatis 中,要将值插入表,必须配置 insert 映射语句。insert 映射语句有各种参数,通常主要使用 id 及 parameterType。

id 是唯一标识符,用于标识 insert 语句。parameterType 表示传递给映射语句的参数类名或别名。

insert映射语句示例:

<insert id = "insert" parameterType = "User">
   INSERT INTO user (NAME) 
   VALUES (#{name});    
</insert>

上面的传入的参数类型是 User (class)。

在映射文件中配置好 insert 映射语句后,在Java代码中就可以根据映射语句的 id 执行该语句。如下所示:

// 假设 session 是 SQL Session 实例
session.insert("User.insert", user);

可以思考一下,比较使用 MyBatis 映射语句与Java代码中直接写 SQL 语句的异同。

2. Update

Update 映射语句用于更新数据库记录。

示例:

<update id = "update" parameterType = "User">
   UPDATE user SET NAME = #{name} WHERE ID = #{id};
</update>

在 Java 代码中就可以根据映射语句的 id 执行该语句。如下所示:

// 假设 session 是  SQL Session 实例 
session.update("User.update", user);

3. Delete

Delete 映射语句用于删除现有记录。

示例:

<delete id = "deleteById" parameterType = "long">
   DELETE from User WHERE ID = #{id};
</delete>

在 Java 代码中就可以根据映射语句的 id 执行该语句。如下所示:

// 假设 session 是  SQL Session 实例   
session.delete("User.deleteById", 3);

4. Select

Select 映射语句用于查询数据。

<select id = "getAll" resultMap = "result">
   SELECT * FROM User; 
</select>

在 Java 代码中就可以根据映射语句的 id 执行该语句,该方法以列表形式返回结果,如下所示:

// 假设 session 是  SQL Session 实例  
List<User> list = session.selectList("User.getAll");

5. resultMaps

resultMaps 即结果映射,是 MyBatis 中最重要、最强大的标签,其作用是把 select SQL 执行结果映射到 Java 对象。

下面是结果映射的例子,例子中将 select 查询的结果映射到User类

<resultMap id = "result" type = "User">
   <result property = "id" column = "id"/>
   <result property = "name" column = "name"/>
</resultMap>

<select id = "getAll" resultMap = "result">
   SELECT * FROM User; 
</select>

<select id = "getById" parameterType = "long" resultMap = "result">
   SELECT * FROM User WHERE ID = #{id};
</select>

如果 property 与 column 相同,column 可省略。

下一章:MyBatis 插入数据

本章将介绍 MyBatis 的数据插入操作。1. 修改 UserMapper.xml 映射文件:UserMapper.xml 映射文件中包含所有 User 相关 SQL 映射语句。我们在 UserMapper.xml 中添加 insert 语句。2. 修改应用程序 main 类。3. 运行程序,输出结果。