package com.sys.utils; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import javax.annotation.Resources; import java.io.IOException; import java.io.InputStream; public class GetSqlSession { /** * 获取SqlSession对象 */ public static SqlSession createSqlSession() { SqlSessionFactory sqlSessionFactory = null; InputStream input = null; SqlSession session = null; try{ //获得mybatis的环境配置文件 String resource = "mybatis-config.xml"; //以流的方式获取resource(mybatis的环境配置文件)s input = Resources.class.getResourceAsStream(resource); //创建会话工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(input); //通过工厂得到SqlSession session = sqlSessionFactory.openSession(); return session; } catch (IOException e){ e.printStackTrace(); return null; } } public static void main(String[] args) { System.out.println(createSqlSession()); } }
时间: 2023-06-27 21:02:39 浏览: 94
这是一个获取 MyBatis 中 SqlSession 对象的工具类,其中使用了 MyBatis 提供的 SqlSessionFactory 来创建 SqlSession 对象。SqlSession 是 MyBatis 中用于执行 SQL 语句的主要对象之一。在使用 MyBatis 进行数据库操作时,通常需要先通过 SqlSessionFactory 获取 SqlSession 对象,然后使用 SqlSession 对象执行相应的 SQL 语句。
在这个工具类中,首先通过 `Resources.class.getResourceAsStream(resource)` 方法获取 MyBatis 环境配置文件 `mybatis-config.xml` 的输入流,然后通过 SqlSessionFactoryBuilder 对象的 `build()` 方法创建 SqlSessionFactory,最后通过 SqlSessionFactory 的 `openSession()` 方法创建 SqlSession 对象。如果过程中出现异常,则输出异常信息并返回 null。该工具类可以在项目中方便地获取 SqlSession 对象,从而进行数据库操作。
相关问题
c.s.guns.modular.utils.MySlf4Impl: Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@78e285dd]
根据提供的引用内容,你提到了一个类`c.s.guns.modular.utils.MySlf4Impl`和一个方法`println()`。根据这些信息,我无法直接回答你的问题。但是,我可以告诉你如何关闭非事务性的`SqlSession`。
在MyBatis中,可以通过调用`close()`方法来关闭非事务性的`SqlSession`对象。以下是一个示例代码:
```java
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 执行数据库操作
} finally {
sqlSession.close();
}
```
在这个示例中,我们首先通过`openSession()`方法获取一个`SqlSession`对象,然后在`try`块中执行数据库操作。最后,在`finally`块中调用`close()`方法关闭`SqlSession`对象,以确保资源的正确释放。
按照你说说的方法我实现了,但是报错了,报错信息是:Failed to bind properties under 'mybatis.configuration.interceptors[0]' to org.apache.ibatis.plugin.Interceptor: Property: mybatis.configuration.interceptors[0] Value: com.cvte.utils.interceptor.SqlStatsInterceptor Origin: class path resource [application.yml]:20:9 Reason: No converter found capable of converting from type [java.lang.String] to type [org.apache.ibatis.plugin.Interceptor] Action: Update your application's configuration
根据报错信息,可以看出问题出在将拦截器类注册为 Bean 后,将其添加到 MyBatis 的拦截器列表中时出现了类型转换问题。具体来说,Spring Framework 将拦截器类的类名作为字符串添加到了 `mybatis.configuration.interceptors[0]` 属性中,而 MyBatis 在读取该属性时期望得到 `org.apache.ibatis.plugin.Interceptor` 类型的对象。
解决这个问题的方法是,将拦截器类的实例注入到 `SqlSessionFactory` 中,在创建 `SqlSessionFactory` 时将其添加到 MyBatis 的拦截器列表中。具体的代码如下:
```java
@Configuration
public class MyBatisConfig {
@Autowired
private SqlStatsInterceptor sqlStatsInterceptor;
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 注册拦截器
Interceptor[] interceptors = { sqlStatsInterceptor };
sessionFactory.setPlugins(interceptors);
return sessionFactory.getObject();
}
}
```
在这段代码中,我们将 `SqlStatsInterceptor` 类的实例 `sqlStatsInterceptor` 注入到 `MyBatisConfig` 配置类中,并在创建 `SqlSessionFactory` 时将其添加到 MyBatis 的拦截器列表中。
注意,我们使用了 `SqlSessionFactoryBean` 类而不是 `SqlSessionFactory` 类来创建 `SqlSessionFactory` 。这是因为 `SqlSessionFactoryBean` 类可以方便地支持 Spring Framework 的自动配置和依赖注入机制,而 `SqlSessionFactory` 类则不支持。
另外,如果你的应用程序使用的是 MyBatis 3.5.0 及以上版本,你也可以使用 MyBatis 提供的 `@Interceptors` 注解来将拦截器类注册到 MyBatis 中,这样就可以避免使用 `SqlSessionFactory` 和 `SqlSessionFactoryBean` 。具体的代码如下:
```java
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
@Component
public class SqlStatsInterceptor implements Interceptor {
// 拦截器逻辑代码
}
@Configuration
public class MyBatisConfig {
@Autowired
private SqlStatsInterceptor sqlStatsInterceptor;
@Bean
public Configuration mybatisConfig() {
Configuration config = new Configuration();
// 注册拦截器
config.addInterceptor(sqlStatsInterceptor);
return config;
}
}
```
在这段代码中,我们使用了 `Configuration` 类来创建 MyBatis 的配置对象,并使用 `addInterceptor` 方法将拦截器类的实例 `sqlStatsInterceptor` 添加到 MyBatis 的拦截器列表中。这样,当 MyBatis 创建 `SqlSession` 时,就会自动应用该拦截器。
阅读全文