前面所有的讲解都是基于XML的方式,接下来几篇文章将使用注解的方式将前面的内容再次实现一下,本篇文章看一下基于注解的CRUD如何实现,需要注意的是,我们使用注解,替代的是映射配置文件,而主配置文件依然还要使用XML来完成。

像之前讲过的一些准备工作再次不在赘述,包括总配置文件的编写、实体类、接口文件的代码都省略了,如果忘了,可以去回顾视频教程或者前面的文章。

##1.查询操作

在Mybatis中,针对查询操作的注解是@Select,它有一个属性value,该属性的值就是SQL语句。当注解只有一个属性的时候,可以直接在括号中写该属性的值:

package com.eastnotes.dao;

import com.eastnotes.domain.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface IUserDao {

    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}

以上就是我们使用注解完成查询所有操作的所有代码,为什么使用注解只写SQL语句就可以呢?这里我们先回顾一下使用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">

<!--namespace的是DAO的全限定类名-->
<mapper namespace="com.eastnotes.dao.IUserDao">
  
    <!--配置查询所有-->
    <select id="findAll" resultTpye="com.eastnotes.domain.User">
        select * from user
    </select>
  
</mapper>

首先,xml配置文件中mapper标签的namespace属性结合select标签的id属性,构成了该抽象方法的唯一标志,包含它的namespace表明了它的包名和类名,id表明了哪一个方法。这个配置在注解里面无需额外指出,首先包名在文件的最上面已经自动写出package com.eastnotes.dao;,方法名就更简单了,那个方法上写的select注解,就对那个方法起作用。

然后再来看结果集的封装,在xml里面,指定封装结果集实体类的是select标签的resultType属性,而在注解中,我们在抽象方法里已经指明了要封装的实体类:List<User>,泛型里的User既是。最后的SQL语句更不必多说。因此,使用注解的形式能省下来很多代码。

根据id查询用户

/**
 * 根据Id查询用户
 * @param id
 * @return
 */
@Select("select * from user where id = #{id}")
User findById(Integer id);

2.保存操作

保存操作所涉及的注解是@Insert

/**
 * 保存操作
 * @param user
 */
@Insert("insert into user(username, address, sex, birthday) values(#{username}, #{address}, #{sex}, #{birthday})")
void saveUser(User user);

传参的方式也是使用#{}

3.更新操作

更新操作所涉及的注解是@Update

/**
 * 更新操作
 * @param user
 */
@Update("update user set username=#{username}, address=#{address}, sex=#{sex}, birthday=#{birthday} where id=#{id}")
void updateUser(User user);

4.删除操作

删除操作所涉及的注解是@Delete

/**
 * 删除操作
 * @param id
 */
@Delete("delete from user where id=#{id}")
void deleteUser(Integer id);