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

打印 上一主题 下一主题

主题 866|帖子 866|积分 2598

深入探索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配置文件示例:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3.   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4.   "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.   <environments default="development">
  7.     <environment id="development">
  8.       <transactionManager type="JDBC"/>
  9.       <dataSource type="POOLED">
  10.         <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  11.         <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
  12.         <property name="username" value="root"/>
  13.         <property name="password" value="password"/>
  14.       </dataSource>
  15.     </environment>
  16.   </environments>
  17.   <mappers>
  18.     <mapper resource="com/example/mapper/UserMapper.xml"/>
  19.   </mappers>
  20. </configuration>
复制代码
使用XML配置文件创建SqlSessionFactory

你可以使用MyBatis提供的SqlSessionFactoryBuilder类,通过加载XML配置文件来创建SqlSessionFactory对象。
  1. import org.apache.ibatis.io.Resources;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  4. import java.io.InputStream;
  5. public class MyBatisUtil {
  6.     private static SqlSessionFactory sqlSessionFactory;
  7.     static {
  8.         try {
  9.             String resource = "mybatis-config.xml";
  10.             InputStream inputStream = Resources.getResourceAsStream(resource);
  11.             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  12.         } catch (Exception e) {
  13.             e.printStackTrace();
  14.         }
  15.     }
  16.     public static SqlSessionFactory getSqlSessionFactory() {
  17.         return sqlSessionFactory;
  18.     }
  19. }
复制代码
使用Java配置类创建SqlSessionFactory

除了使用XML配置文件,你还可以使用Java配置类来创建SqlSessionFactory对象。
  1. import org.apache.ibatis.datasource.pooled.PooledDataSource;
  2. import org.apache.ibatis.mapping.Environment;
  3. import org.apache.ibatis.session.Configuration;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
  7. public class MyBatisConfig {
  8.     public static SqlSessionFactory getSqlSessionFactory() {
  9.         PooledDataSource dataSource = new PooledDataSource();
  10.         dataSource.setDriver("com.mysql.cj.jdbc.Driver");
  11.         dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
  12.         dataSource.setUsername("root");
  13.         dataSource.setPassword("password");
  14.         Environment environment = new Environment("development", new JdbcTransactionFactory(), dataSource);
  15.         Configuration configuration = new Configuration(environment);
  16.         configuration.addMapper(UserMapper.class);
  17.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
  18.         return sqlSessionFactory;
  19.     }
  20. }
复制代码
使用SqlSessionFactory

创建SqlSession对象

SqlSessionFactory的主要作用是创建SqlSession对象。你可以通过openSession()方法来创建一个新的SqlSession对象。
  1. import org.apache.ibatis.session.SqlSession;
  2. public class UserService {
  3.     private SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
  4.     public User getUserById(int id) {
  5.         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
  6.             UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  7.             return userMapper.getUserById(id);
  8.         }
  9.     }
  10. }
复制代码
事务管理

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

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

多数据源配置

在某些情况下,你可能需要配置多个数据源。你可以通过创建多个SqlSessionFactory对象来实现多数据源配置。
  1. public class DataSourceConfig {
  2.     public static SqlSessionFactory getPrimarySqlSessionFactory() {
  3.         // 配置主数据源
  4.     }
  5.     public static SqlSessionFactory getSecondarySqlSessionFactory() {
  6.         // 配置次数据源
  7.     }
  8. }
复制代码
自界说拦截器

MyBatis支持通过拦截器(Interceptor)来扩展功能。你可以通过自界说拦截器来实现日记记录、性能监控等功能。
  1. import org.apache.ibatis.executor.statement.StatementHandler;
  2. import org.apache.ibatis.plugin.*;
  3. import java.sql.Connection;
  4. import java.util.Properties;
  5. @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
  6. public class MyInterceptor implements Interceptor {
  7.     @Override
  8.     public Object intercept(Invocation invocation) throws Throwable {
  9.         // 自定义逻辑
  10.         return invocation.proceed();
  11.     }
  12.     @Override
  13.     public Object plugin(Object target) {
  14.         return Plugin.wrap(target, this);
  15.     }
  16.     @Override
  17.     public void setProperties(Properties properties) {
  18.         // 设置属性
  19.     }
  20. }
复制代码
动态SQL

MyBatis支持动态SQL,你可以通过<if>、<choose>、<when>、<otherwise>等标签来实现动态SQL语句的生成。
  1. <select id="getUserList" resultType="User">
  2.     SELECT * FROM users
  3.     <where>
  4.         <if test="name != null">
  5.             AND name = #{name}
  6.         </if>
  7.         <if test="age != null">
  8.             AND age = #{age}
  9.         </if>
  10.     </where>
  11. </select>
复制代码
总结

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



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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表