直接从现有连接创建 SqlSession

Create SqlSession from existing Connection directly

我正在使用现有的 Java 代码,其中在已部署的系统上有一个现有的 JDBC 连接池机制和一个已经存在的设置来获取 JDBC 连接。我想利用它来创建一个 MyBatis SqlSession 对象,而无需创建 Configuration、DataSource 和其他东西

我的代码已经创建了一个 java.sql.Connection 对象并获得了所需的资源。我想利用它并获得 SqlSession 对象并从那时起使用 MyBatis。

我不想让MyBatis管理连接池,决定使用哪个数据源等等,这可以吗?

恐怕你无法避免创建 Configuration 对象。它由内部 mybatis 机器使用,如执行程序。但即使你可以,它也不会对你有多大帮助。在这种情况下,您将需要自己实现大部分 Configuration 功能,因此这样做没有意义。

您的主要目标是能够使用 SqlSessionFactory.openSession(Connection connection) 方法。为此,您需要 SqlSessionFactory。最简单的方法是像 mybatis documentation:

中描述的那样创建 Configuration
TransactionFactory transactionFactory = new JdbcTransactionFactory();

Environment environment = new Environment("development", transactionFactory, dataSource);

Configuration configuration = new Configuration(environment);

// set properties to configuration here

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(configuration);

现在,如果您的连接池确实实现了 DataSource,您可以直接使用它来创建环境。如果没有,您需要在实现 javax.sql.DataSource.

的池周围创建一个适配器

我的解决方案与上面 Roman 的解决方案类似,但我需要创建一个 Oracle 数据源。由于各种原因,需要使用 Class.forName 类型序列

创建连接
Class.forName("oracle.jdbc.driver.OracleDriver");
String connectionString = "jdbc:oracle:thin:@//yadayada";
String username = "myusername"; 
String password = "mypassword";
OracleDataSource oracleDataSource = new OracleDataSource();
oracleDataSource.setURL(connectionString);
oracleDataSource.setPassword(password);
oracleDataSource.setUser(username);
environment = new Environment("dev",transactionFactory,oracleDataSource);
configuration = new Configuration(environment);
configuration.addMappers("MyMybatisMapper");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
return sqlSessionFactory.openSession();

我缺少的是 OracleDataSource 对象。