MyBatis 注解开发

MyBatis 最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到了 MyBatis3 提供了新的基于注解的配置。

我们可以使用 XML 方式编写 SQL 映射语句,实现对数据库的增删改查操作。MyBatis 提供另外一种方式,使用 Java 注解编写 SQL 映射语句。

1. 准备数据

在 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');

2. 创建 Java POJO 类 User

User 类位于 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;
    }
}

3. 创建映射类 UserMapper

在前面章节中,使用 XML 方式编写sql映射语句,映射文件是 UserMapper.xml,类似的,使用注解方式,映射文件可命名为 UserMapper.java。

UserMapper 是一个接口,我们通过给接口函数加注解编写 SQL 映射语句。

可比较一下注解方式与 XML 方式编写 SQL 映射语句的异同。

UserMapper 类位于 UserMapper.java 文件:

public interface UserMapper {

   final String getAll = "SELECT * FROM User"; 
   final String getById = "SELECT * FROM User WHERE id = #{id}";
   final String deleteById = "DELETE from User WHERE id = #{id}";
   final String insert = "INSERT INTO User (name) VALUES (#{name})";
   final String update = "UPDATE User SET name = #{name} WHERE id = #{id}";

   @Select(getAll)
   @Results(value = {
      @Result(property = "id", column = "id"),
      @Result(property = "name", column = "name")
   })
   List<User> getAll();

   @Select(getById)
   @Results(value = {
      @Result(property = "id", column = "ID"),
      @Result(property = "name", column = "NAME")
   })
   User getById(long id);

   @Update(update)
   void update(User user);

   @Delete(deleteById)
   void delete(long id);

   @Insert(insert)
   @Options(useGeneratedKeys = true, keyProperty = "id")
   void insert(User user);
}

3. 修改 Config.xml

修改 MyBatis Config.xml 中的 mapper 标签,MyBatis Config.xml中的 <mapper> 指向映射文件位置,按如下修改:

<mappers>
    <mapper class = "com.aizws.demo.mapper.UserMapper"/>
</mappers>

4. 修改 main类

修改 App.java 文件中的应用程序 main类。

package com.aizws.demo;

import java.io.IOException;
import java.io.Reader;
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 com.aizws.demo.mapper.UserMapper;

public class App {

    public static void main(String args[]) throws IOException {

        Reader reader = Resources.getResourceAsReader("MyBatis Config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class); 

        System.out.println("------------ 数据插入 -----------");
        // 创建用户对象
        User user = new User("newUser100");

        // 插入新用户到数据库
        mapper.insert(user);
        session.commit();
        System.out.println("数据插入成功");

        System.out.println("------------ 读取用户列表 -----------");
        List<User> userList = mapper.getAll();

        for (User u : userList) {
            System.out.println(u.getId());
            System.out.println(u.getName());
        }

        System.out.println("读取用户列表成功");

        System.out.println("------------ 读取用户详情 -----------");
        User user1 = (User) mapper.getById(user.getId());

        System.out.println(user1.getId());
        System.out.println(user1.getName());

        System.out.println("读取用户详情成功");

        System.out.println("------------ 修改用户 -----------");
        user1.setName("userNameUpdated");
        mapper.update(user1);
        session.commit();

        // 查询修改后的用户详情
        User user2 = (User) mapper.getById(user.getId());

        System.out.println(user2.getId());
        System.out.println(user2.getName());
        System.out.println("修改用户成功");

        System.out.println("------------ 删除用户 -----------");
        mapper.delete(user.getId());
        System.out.println("删除用户成功");

        session.commit();
        session.close();
    }

}

运行结果:

------------ 数据插入 -----------
数据插入成功
------------ 读取用户列表 -----------
1
user1
2
userNameUpdated
3
user3
4
user4
5
user5
6
newUser100
8
newUser100
9
newUser100
10
newUser100
11
newUser100
12
newUser100
13
newUser100
14
newUser100
读取用户列表成功
------------ 读取用户详情 -----------
14
newUser100
读取用户详情成功
------------ 修改用户 -----------
14
userNameUpdated
修改用户成功
------------ 删除用户 -----------
删除用户成功

下一章:MyBatis 与 Hibernate 对比、区别

MyBatis 与 Hibernate 比较和区别:MyBatis 和 Hibernate 之间有很大的区别,Hibernate 以 Java 对象为中心,是一种 ORM,MyBatis 以 SQL 为中心,是加强版 SQL,两者适用场景不一样。Hibernate 与 MyBatis 都可以是通过 SessionFactoryBuider 由 XML 配置文件生成 SessionFactory。