MyBatis 中如何执行 SQL 语句
作者:mmseoamin日期:2023-12-21

MyBatis 中如何执行 SQL 语句

MyBatis 是一个基于 Java 的持久层框架,它提供了多种方式来执行 SQL 语句,包括直接使用 SqlSession 执行、使用映射器(Mapper)执行、使用 SqlSessionTemplate 执行等。本文将介绍 MyBatis 中常见的 SQL 执行方式及其使用方法。

MyBatis 中如何执行 SQL 语句,在这里插入图片描述,第1张

1. 直接使用 SqlSession 执行 SQL 语句

在 MyBatis 中,可以通过 SqlSession 对象直接执行 SQL 语句。SqlSession 是 MyBatis 的核心类之一,它负责与数据库进行交互和管理事务。SqlSession 提供了多个方法来执行 SQL 语句,比如 selectOne、selectList、insert、update 和 delete 等。下面是一个简单的示例

public class MyBatisTest {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            // 执行查询语句
            User user = sqlSession.selectOne("com.example.mapper.UserMapper.getUserById", 1);
            System.out.println(user);
            // 执行插入语句
            User newUser = new User();
            newUser.setName("Tom");
            newUser.setAge(20);
            int result = sqlSession.insert("com.example.mapper.UserMapper.addUser", newUser);
            System.out.println(result);
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
}

在上面的示例代码中,首先读取了配置文件 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 将配置文件解析为 SqlSessionFactory 对象,最后通过 SqlSessionFactory 创建 SqlSession 对象。在 SqlSession 中,可以通过 selectOne、selectList、insert、update 和 delete 等方法执行 SQL 语句。其中,selectOne 方法用于查询单个结果,selectList 方法用于查询多个结果,insert、update 和 delete 方法用于执行更新或删除操作。这些方法的第一个参数为 SQL 语句的 ID,格式为 “namespace.statementId”,其中 namespace 为映射器的命名空间,statementId 为 SQL 语句的 ID。

2. 使用映射器(Mapper)执行 SQL 语句

除了直接使用 SqlSession 执行 SQL 语句外,还可以通过映射器(Mapper)执行 SQL 语句。映射器是 MyBatis 中用于定义 SQL 语句和 Java 对象之间映射关系的接口,它可以通过 XML 或注解的方式进行定义。下面是一个简单的映射器示例:

public interface UserMapper {
    // 查询用户信息
    User getUserById(int id);
    // 添加用户信息
    int addUser(User user);
}

在上面的示例代码中,定义了一个名为 UserMapper 的映射器接口,其中包含了两个方法:getUserById 和 addUser。这两个方法的实现方式与直接使用 SqlSession 执行 SQL 语句的方式类似,只不过将 SQL 语句和参数映射的工作放在了映射器接口中。下面是一个使用映射器执行 SQL 语句的示例:

public class MyBatisTest {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 执行查询语句
            User user = userMapper.getUserById(1);
            System.out.println(user);
            // 执行插入语句
            User newUser = new User();
            newUser.setName("Tom");
            newUser.setAge(20);
            int result = userMapper.addUser(newUser);
            System.out.println(result);
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
}

在上面的示例代码中,首先读取了配置文件 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 将配置文件解析为SqlSessionFactory 对象,最后通过 SqlSessionFactory 创建 SqlSession 对象。在 SqlSession 中,通过 getMapper 方法获取映射器接口的实例,然后就可以直接调用映射器接口中的方法执行 SQL 语句了。

3. 使用 SqlSessionTemplate 执行 SQL 语句

除了直接使用 SqlSession 和映射器执行 SQL 语句外,还可以使用 SqlSessionTemplate 执行 SQL 语句。SqlSessionTemplate 是 MyBatis-Spring 模块提供的一个类,它封装了 SqlSession 的常用操作,可以方便地在 Spring 框架中使用。下面是一个简单的示例:

public class UserServiceImpl implements UserService {
    private SqlSessionTemplate sqlSessionTemplate;
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
    @Override
    public User getUserById(int id) {
        return sqlSessionTemplate.selectOne("com.example.mapper.UserMapper.getUserById", id);
    }
    @Override
    public int addUser(User user) {
        return sqlSessionTemplate.insert("com.example.mapper.UserMapper.addUser", user);
    }
}

在上面的示例代码中,通过注入 SqlSessionTemplate 对象来执行 SQL 语句。SqlSessionTemplate 提供了多个方法来执行 SQL 语句,包括 selectOne、selectList、insert、update 和 delete 等。这些方法的使用方式与直接使用 SqlSession 执行 SQL 语句的方式类似。

4. SQL 语句的参数映射

在执行 SQL 语句时,需要将 SQL 语句中的参数映射到 Java 对象中。MyBatis 提供了多种方式来实现参数映射,包括基本类型参数、JavaBean 参数、Map 参数和注解参数等。下面是一个简单的示例:

public interface UserMapper {
    // 查询用户信息
    User getUserById(int id);
    // 添加用户信息
    int addUser(User user);
    // 查询用户信息,使用 Map 参数
    User getUserByIdMap(Map paramMap);
    // 添加用户信息,使用注解参数
    @Insert("insert into user(name, age) values(#{user.name}, #{user.age})")
    int addUserAnnotation(@Param("user") User user);
}

在上面的示例代码中,getUserById 和 addUser 方法使用了 JavaBean 参数,getUserByIdMap 方法使用了 Map 参数,addUserAnnotation 方法使用了注解参数。在使用 JavaBean 参数和 Map 参数时,需要将 SQL 语句中的参数与 Java 对象的属性进行映射。在使用注解参数时,需要在 SQL 语句中使用 #{paramName} 的方式,其中 paramName 为注解参数的名称。

5. SQL 语句的返回结果映射

在执行 SQL 语句时,需要将 SQL 语句中的返回结果映射到 Java 对象中。MyBatis 提供了多种方式来实现返回结果映射,包括基本类型返回、JavaBean 返回、Map 返回和注解返回等。下面是一个简单的示例:

public interface UserMapper {
    // 查询用户信息,返回 JavaBean
    User getUserById(int id);
    // 查询用户信息,返回 Map
    Map getUserByIdMap(int id);
    // 查询用户信息,使用注解返回
    @Select("select name, age from user where id=#{id}")
    @Results({
            @Result(property = "name", column = "name"),
            @Result(property = "age", column = "age")
    })
    User getUserByIdAnnotation(int id);
}

在上面的示例代码中,getUserById 方法返回了一个 JavaBean,getUserByIdMap 方法返回了一个 Map,getUserByIdAnnotation 方法使用了注解返回。在使用注解返回时,需要在 SQL 语句中使用 @Results 和 @Result 注解将查询结果与 JavaBean 的属性进行映射。

6. 总结

MyBatis 提供了多种方式来执行 SQL 语句,包括直接使用 SqlSession 执行、使用映射器执行、使用 SqlSessionTemplate 执行等。在执行 SQL 语句时,需要将 SQL 语句中的参数和返回结果