9.2. MyBatis框架

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis可以使用XML或者注解配置和原生Map的方式将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

9.2.1. MyBatis核心组件

MyBatis主要包含以下几个核心组件:

  • SqlSessionFactory: 一个SqlSessionFactory实例可以看作是一个数据库连接池,它的作用是创建SqlSession实例。
  • SqlSession: SqlSession是MyBatis的核心,它用于执行持久化操作。在SqlSession中执行的所有操作都是线程不安全的,所以每个线程都应该有自己的SqlSession实例。
  • Mapper: Mapper是一个接口,它的实现是由MyBatis生成的。Mapper中的方法对应着SQL映射文件中的一个SQL语句。这样,我们可以直接调用Mapper中的方法来执行SQL,而无需手动编写JDBC代码。

9.2.2. MyBatis配置

在使用MyBatis时,我们需要进行一些基本配置,包括数据库连接信息、事务管理器、数据源等。这些配置可以通过XML或者Java注解的方式进行。

9.2.2.1. 使用XML配置

以下是一个简单的MyBatis XML配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
                <property name="username" value="root"></property>
                <property name="password" value="password"></property>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

在这个配置文件中,我们配置了一个名为"development"的环境,包括事务管理器、数据源以及数据库连接信息。此外,我们还注册了一个名为"UserMapper"的SQL映射文件。

9.2.2.2. 使用Java注解配置

除了使用XML配置文件,我们还可以使用Java注解进行配置。以下是一个简单的例子:

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

public class AppConfig {

    public static SqlSessionFactory getSqlSessionFactory() {
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setDriver("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
        dataSource.setUsername("root");
        dataSource.setPassword("password");

        Environment environment = new Environment.Builder("development")
                .transactionFactory(new JdbcTransactionFactory())
                .dataSource(dataSource)
                .build();

        Configuration configuration = new Configuration(environment);
        configuration.addMapper(UserMapper.class);

        return new SqlSessionFactoryBuilder().build(configuration);
    }
}

在这个例子中,我们使用Java代码来配置MyBatis的环境、数据源、事务管理器等。注意,我们使用configuration.addMapper()方法来注册Mapper接口。

9.2.3. MyBatis实例

接下来,我们将使用MyBatis框架来实现一个简单的用户管理系统。首先,我们需要创建一个User实体类以及对应的Mapper接口:

User.java:

public class User {
    private int id;
    private String name;
    private intage;

    // getters and setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

UserMapper.java:

import org.apache.ibatis.annotations.*;
import java.util.List;

public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> findAll();

    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(int id);

    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(User user);

    @Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
    void update(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void delete(int id);
}

在这个例子中,我们使用Java注解定义了UserMapper接口,包括查询所有用户、根据ID查询用户、插入用户、更新用户和删除用户等方法。

接下来,我们需要创建一个测试类,以便对UserMapper进行测试:

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public class Main {

    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = AppConfig.getSqlSessionFactory();
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            // Insert a user
            User newUser = new User();
            newUser.setName("John Doe");
            newUser.setAge(25);
            userMapper.insert(newUser);
            sqlSession.commit();
            System.out.println("Inserted user with ID: " + newUser.getId());

            // Find all users
            List<User> users = userMapper.findAll();
            System.out.println("All users: ");
            for (User user : users) {
                System.out.println(user.getId() + " - " + user.getName() + " - " + user.getAge());
            }

            // Find user by ID
            User user = userMapper.findById(newUser.getId());
            System.out.println("Found user by ID: " + user.getId() + " - " + user.getName() + " - " + user.getAge());

            // Update user
            user.setName("Jane Doe");
            user.setAge(28);
            userMapper.update(user);
            sqlSession.commit();
            System.out.println("Updated user with ID: " + user.getId());

            // Delete user
            userMapper.delete(user.getId());
            sqlSession.commit();
            System.out.println("Deleted user with ID: " + user.getId());
        }
    }
}

在这个测试类中,我们首先创建了一个SqlSessionFactory实例,然后打开一个SqlSession。接着,我们通过SqlSession的getMapper()方法获取UserMapper的实例,并调用其中的方法执行数据库操作。最后,不要忘记在插入、更新和删除操作之后调用sqlSession.commit()方法提交事务。

这个例子展示了如何使用MyBatis框架进行基本的数据库操作,希望能帮助你更好地理解MyBatis框架的工作原理。在实际项目中,你可能还需要使用更复杂的查询条件、连接多个表等功能,这些都可以通过MyBatis的XML映射文件或者Java注解实现。 推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

猜你喜欢

转载自blog.csdn.net/u010671061/article/details/131026395
9.2