MyBatis 教程

文章列表
简介 准备工作 回顾 JDBC 数据准备 查找id为1的用户信息 自定义连接池 不用MyBatis配置文件 查询密码为123的所有用户 如果Bean中成员变量和表中字段命名不一致 更多查询用户的方式 对查询结果排序 日志 添加、删除、修改数据 事务 动态SQL 一对一和一对多的实现 一对一和一对多的延迟加载 多对多的实现 分页查询 把SQL写在注解中 自动生成Mapper代码和映射XML mybatis generator 生成 select for update mybatis generator 支持数据版本号

MyBatis: 把SQL写在注解中


之前我们使用了xml映射文件配置SQL语句。另一个方案是通过注解(Annotation)。还一个方案是XML和注解结合。注解看起来更方便,但在复杂的SQL上表现力不如 XML。

本节示例代码在 mybatis-demo-015

数据准备

数据准备

项目结构

使用 IDEA 创建 gradle 项目,最终结构如下:

示例

在 UserMapper 接口中增加方法,并添加注解

package mapper;

import bean.User;
import org.apache.ibatis.annotations.*;

import java.util.Map;

public interface UserMapper {

    /**
     * 根据 id 查询用户
     */
    @Select("select * from blog_db.user where id=#{id}")
    User findById(Long id);

    /**
     * 下面的函数都是根据 name 和 password 查询用户
     */

    @Select("select * from blog_db.user where name=#{param1} and password=#{param2}")
    @Results({
                    @Result(id = true, column = "id", property = "id"),
                    @Result(column = "name", property = "name"),
                    @Result(column = "email", property = "email"),
                    @Result(column = "password", property = "password")
            })
    User findByNameAndPasswordV1(String name, String password);

    User findByNameAndPasswordV2(@Param("username") String name, @Param("password") String password);

    @Select("select * from blog_db.user where name=#{username} and password=#{password}")
    User findByNameAndPasswordV3(Map<String,Object> data);

    @Select("select * from blog_db.user where name=#{param1.username} and password=#{param2}")
    User findByNameAndPasswordV4(Map<String,Object> data, String password);

    @Select("select * from blog_db.user where name=#{data.username} and password=#{password}")
    User findByNameAndPasswordV5(@Param("data") Map<String,Object> data, @Param("password") String password);

    @Select("select * from blog_db.user where name=#{name} and password=#{password}")
    User findByNameAndPasswordV6(User user);

    @Select("select * from blog_db.user where name=#{user.name} and password=#{user.password}")
    User findByNameAndPasswordV7(@Param("user") User user);

    /**
     * 插入用户
     * @param user
     */
    @Insert("insert into blog_db.user (name, email, password) VALUES (#{name}, #{email}, #{password})")
    @Options(useGeneratedKeys=true, keyProperty="id")
    void insertUser(User user);

}

findByNameAndPasswordV2方法并没有加注解,在 UserMapper.xml 中有映射的SQL配置:

<select id="findByNameAndPasswordV2" resultType="bean.User">
    select * from blog_db.user where name=#{username} and password=#{password}
</select>

注意,对于一个方法基于注解的SQL配置和基于方法的SQL配置,只能存在一个。

在 Main 中编写示例:

@Test
public void test_findById() throws IOException {
    try ( SqlSession sqlSession = getSqlSession() ) {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findById(1L);
        log.info("{}", user);
    }
}

private SqlSession getSqlSession() throws IOException {
    SqlSessionFactory sessionFactory;
    sessionFactory = new SqlSessionFactoryBuilder()
            .build(Resources.getResourceAsReader("mybatis-config.xml"));
    return sessionFactory.openSession();
}

运行结果:

 INFO [main] - User(id=1, name=letian, email=letian@111.com, password=123)

更多示例见 Main 类代码。


( 本文完 )

文章目录