风雨同行 发表于 2024-11-12 11:26:55

深入探索MyBatis中的SqlSessionFactory对象:从根本到高级应用

深入探索MyBatis中的SqlSessionFactory对象:从根本到高级应用

引言

在Java开发中,MyBatis是一个广泛使用的持久层框架,它简化了数据库操作的复杂性。而在MyBatis的核心组件中,SqlSessionFactory对象扮演着至关紧张的角色。本文将带你深入探索MyBatis中的SqlSessionFactory对象,从根本概念到高级应用,让你轻松掌握这个关键组件的工作原理及实际应用。
什么是SqlSessionFactory?

根本概念

SqlSessionFactory是MyBatis中的一个核心接口,用于创建SqlSession对象。SqlSession是MyBatis中用于执行SQL语句、提交事务、获取映射器实例的主要接口。SqlSessionFactory对象是线程安全的,通常在应用程序启动时创建一次,并在整个应用程序生命周期中使用。
SqlSessionFactory的作用



[*]创建SqlSession对象:SqlSessionFactory负责创建SqlSession对象,每个SqlSession对象代表一个数据库会话。
[*]管理数据库毗连:SqlSessionFactory负责管理数据库毗连池,确保数据库毗连的高效使用。
[*]配置管理:SqlSessionFactory负责加载MyBatis配置文件,并根据配置文件初始化数据库毗连、事务管理等。
创建SqlSessionFactory对象

前置知识:MyBatis配置文件

在创建SqlSessionFactory对象之前,你需要相识MyBatis的配置文件。MyBatis的配置文件通常是一个XML文件,用于配置数据库毗连、映射器文件、事务管理等。
以下是一个典型的MyBatis配置文件示例:
<?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"/>
      <dataSource type="POOLED">
      <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
      <property name="username" value="root"/>
      <property name="password" value="password"/>
      </dataSource>
    </environment>
</environments>
<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
使用XML配置文件创建SqlSessionFactory

你可以使用MyBatis提供的SqlSessionFactoryBuilder类,通过加载XML配置文件来创建SqlSessionFactory对象。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
      try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      } catch (Exception e) {
            e.printStackTrace();
      }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
      return sqlSessionFactory;
    }
}
使用Java配置类创建SqlSessionFactory

除了使用XML配置文件,你还可以使用Java配置类来创建SqlSessionFactory对象。
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 MyBatisConfig {
    public static SqlSessionFactory getSqlSessionFactory() {
      PooledDataSource dataSource = new PooledDataSource();
      dataSource.setDriver("com.mysql.cj.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
      dataSource.setUsername("root");
      dataSource.setPassword("password");

      Environment environment = new Environment("development", new JdbcTransactionFactory(), dataSource);
      Configuration configuration = new Configuration(environment);
      configuration.addMapper(UserMapper.class);

      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
      return sqlSessionFactory;
    }
}
使用SqlSessionFactory

创建SqlSession对象

SqlSessionFactory的主要作用是创建SqlSession对象。你可以通过openSession()方法来创建一个新的SqlSession对象。
import org.apache.ibatis.session.SqlSession;

public class UserService {
    private SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();

    public User getUserById(int id) {
      try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            return userMapper.getUserById(id);
      }
    }
}
事务管理

SqlSession对象还负责管理数据库事务。你可以通过commit()和rollback()方法来提交或回滚事务。
public void updateUser(User user) {
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      userMapper.updateUser(user);
      sqlSession.commit();
    } catch (Exception e) {
      sqlSession.rollback();
      e.printStackTrace();
    }
}
获取映射器实例

SqlSession对象可以通过getMapper()方法获取映射器实例。映射器实例是MyBatis中用于执行SQL语句的接口。
public interface UserMapper {
    User getUserById(int id);
    void updateUser(User user);
}
SqlSessionFactory的高级应用

多数据源配置

在某些情况下,你可能需要配置多个数据源。你可以通过创建多个SqlSessionFactory对象来实现多数据源配置。
public class DataSourceConfig {
    public static SqlSessionFactory getPrimarySqlSessionFactory() {
      // 配置主数据源
    }

    public static SqlSessionFactory getSecondarySqlSessionFactory() {
      // 配置次数据源
    }
}
自界说拦截器

MyBatis支持通过拦截器(Interceptor)来扩展功能。你可以通过自界说拦截器来实现日记记录、性能监控等功能。
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Connection;
import java.util.Properties;

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class MyInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
      // 自定义逻辑
      return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
      return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
      // 设置属性
    }
}
动态SQL

MyBatis支持动态SQL,你可以通过<if>、<choose>、<when>、<otherwise>等标签来实现动态SQL语句的生成。
<select id="getUserList" resultType="User">
    SELECT * FROM users
    <where>
      <if test="name != null">
            AND name = #{name}
      </if>
      <if test="age != null">
            AND age = #{age}
      </if>
    </where>
</select>
总结

SqlSessionFactory是MyBatis中的一个核心组件,负责创建SqlSession对象、管理数据库毗连和配置管理。通过本文的介绍,你应该已经掌握了SqlSessionFactory的根本概念、创建方法和高级应用。无论你是初学者照旧资深开发者,理解和熟练使用SqlSessionFactory都将极大地提升你的MyBatis开发效率。
参考资料



[*]MyBatis官方文档
[*]MyBatis GitHub堆栈
希望这篇文章能资助你更好地理解和使用MyBatis中的SqlSessionFactory对象,让你的MyBatis开发之旅更加顺畅!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 深入探索MyBatis中的SqlSessionFactory对象:从根本到高级应用