springboot(4) 整合mybatis和hibernate

该篇主要介绍在springboot中整合mybatis和hibernate。该篇需要知道数据源是如何配置的,如果需要了解数据源配置的朋友可以参考我之前的文章:springboot(3) 数据源配置

该文章将讲解如下内容:

  1. 如何整合mybatis
  2. 如何整合hibernate
  3. 如何同时使用hibernate和mybatis

1. 配置数据源:

package com.test.db.conf;

import javax.sql.DataSource;

import org.apache.catalina.Context;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.descriptor.web.ContextResource;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;

@Configuration
public class DataSourceConfig {

	@Bean
	public ServletWebServerFactory servletContainer() {
		TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
			@Override
			protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
				tomcat.enableNaming();
				return super.getTomcatWebServer(tomcat);
			}

			@Override
			protected void postProcessContext(Context context) {
				ContextResource resource1 = new ContextResource();
				resource1.setName("ds1");
				resource1.setType(DataSource.class.getName());
				resource1.setProperty("driverClassName", "org.sqlite.JDBC");
				resource1.setProperty("url", "jdbc:sqlite:dev.db");
				context.getNamingResources().addResource(resource1);
				
				ContextResource resource2 = new ContextResource();
				resource2.setName("ds2");
				resource2.setType(DataSource.class.getName());
				resource2.setProperty("driverClassName", "org.sqlite.JDBC");
				resource2.setProperty("url", "jdbc:sqlite:dev2.db");
				context.getNamingResources().addResource(resource2);
				
				super.postProcessContext(context);
			}
		};
		return tomcat;
	}
	
	@Bean
	public DataSource dataSource() {
		JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
		dataSourceLookup.setResourceRef(true);
		return dataSourceLookup.getDataSource("java:comp/env/ds1");
	}

	@Bean
	public DataSource dataSource2() {
		JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
		dataSourceLookup.setResourceRef(true);
		return dataSourceLookup.getDataSource("java:comp/env/ds2");
	}

}

2. 整合mybatis

2.1  添加依赖

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.2.0</version>
		</dependency>

2.2 增加配置

package com.test.db.conf;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration
@MapperScan(basePackages = "com.test.dao.ds1", sqlSessionFactoryRef = "sqlSessionFactory")
public class MybatisConf {
	/**
	 * sqlSession配置
	 * 
	 * @param dataSource 数据源
	 * @return 返回sqlSession
	 * @throws Exception
	 */
	@Bean
	public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
		final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource);
		return sessionFactory.getObject();
	}

	/**
	 * 事务配置
	 * @param dataSource 数据源
	 * @return 事务配置
	 */
	@Bean
	public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
}

2.3 添加测试类:

package com.test.dao.ds1;

import org.apache.ibatis.annotations.Select;

public interface Ds1TestDao {

	@Select("select 'dev'")
	public String test();
}

2.4 添加测试:

	@Autowired
	private Ds1TestDao ds1TestDao;
	
	@Test
	public void testMybatisDao() {
		System.out.println(ds1TestDao.test());
	}

测试结果:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2019-08-28 15:29:34.814  INFO 6604 --- [           main] com.test.service.ds.DataSourceTest       : Starting DataSourceTest on DEVPNLN15YF127 with PID 6604 (started by c_yinjicheng-002 in E:\Users\c_yinjicheng-002\bqpt_boot\springboot-db)
2019-08-28 15:29:34.814  INFO 6604 --- [           main] com.test.service.ds.DataSourceTest       : No active profile set, falling back to default profiles: default
2019-08-28 15:29:37.096  INFO 6604 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-08-28 15:29:37.518  INFO 6604 --- [           main] com.test.service.ds.DataSourceTest       : Started DataSourceTest in 3.835 seconds (JVM running for 4.807)
dev
2019-08-28 15:29:38.184  INFO 6604 --- [       Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

2.5 以同样的方式添加第二个数据库的测试,代码及运行测试结果如下:

package com.test.db.conf;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration
@MapperScan(basePackages = "com.test.dao.ds2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class MybatisConf2 {
	/**
	 * sqlSession配置
	 * 
	 * @param dataSource 数据源
	 * @return 返回sqlSession
	 * @throws Exception
	 */
	@Bean
	public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
		final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource);
		return sessionFactory.getObject();
	}

	/**
	 * 事务配置
	 * @param dataSource 数据源
	 * @return 事务配置
	 */
	@Bean
	public DataSourceTransactionManager transactionManager2(@Qualifier("dataSource2") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
}
package com.test.dao.ds2;

import org.apache.ibatis.annotations.Select;

public interface Ds2TestDao {

	@Select("select 'dev2'")
	public String test();
}
	@Autowired
	private Ds2TestDao ds2TestDao;
	
	@Test
	public void testMybatisDao2() {
		System.out.println(ds2TestDao.test());
	}
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2019-08-28 15:34:32.211  INFO 5380 --- [           main] com.test.service.ds.DataSourceTest       : Starting DataSourceTest on DEVPNLN15YF127 with PID 5380 (started by c_yinjicheng-002 in E:\Users\c_yinjicheng-002\bqpt_boot\springboot-db)
2019-08-28 15:34:32.211  INFO 5380 --- [           main] com.test.service.ds.DataSourceTest       : No active profile set, falling back to default profiles: default
2019-08-28 15:34:34.874  INFO 5380 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-08-28 15:34:35.236  INFO 5380 --- [           main] com.test.service.ds.DataSourceTest       : Started DataSourceTest in 3.65 seconds (JVM running for 4.614)
dev2
2019-08-28 15:34:36.035  INFO 5380 --- [       Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

如果最终运行正常,则说明配置是没有问题的。

2.6 注意事项

关于mybatis的配置,我们尤其需要注意的是,我们的第一个数据源的 SqlSessionFactory ben名称为sqlSessionFactory,或者有一个SqlSessionFactory的配置上添加@Primary注解,否则会报错。具体错误信息为:

java.lang.IllegalStateException: Failed to load ApplicationContext
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125) ~[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108) ~[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) ~[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) ~[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246) ~[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12]
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12]
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12]
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) [spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) [.cp/:na]
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) [.cp/:na]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) [.cp/:na]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) [.cp/:na]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) [.cp/:na]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209) [.cp/:na]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionTemplate' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionTemplate' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.ibatis.session.SqlSessionFactory' available: expected single matching bean but found 2: sqlSessionFactory1,sqlSessionFactoryDs2
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:509) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1305) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1144) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:127) ~[spring-boot-test-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) ~[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	... 25 common frames omitted
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.ibatis.session.SqlSessionFactory' available: expected single matching bean but found 2: sqlSessionFactory1,sqlSessionFactoryDs2
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:221) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1225) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1167) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	... 43 common frames omitted

3. 整合hibernate

3.1 添加jpa依赖


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

3.2 增加配置

package com.test.db.conf;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@EnableJpaRepositories(basePackages = "com.test.jpa.ds1", entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "jpaTransactionManager")
public class JPAConfig {

	@Bean
	public PlatformTransactionManager jpaTransactionManager(
			@Qualifier("entityManagerFactory") LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
		EntityManagerFactory factory = localContainerEntityManagerFactoryBean.getObject();
		return new JpaTransactionManager(factory);
	}
	
	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Value("com.test.jpa.ds1")String pkg, @Qualifier("dataSource")DataSource dataSource) {
		LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
		factory.setDataSource(dataSource);
		factory.setPackagesToScan(pkg);
		factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
		Properties jpaProperties = new Properties();
		jpaProperties.put("hibernate.show-sql", "true");
		jpaProperties.put("hibernate.connection.show_sql", "true");
		jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
		factory.setJpaProperties(jpaProperties);
		return factory;
	}
}
package com.test.db.conf;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@EnableJpaRepositories(basePackages = "com.test.jpa.ds2", entityManagerFactoryRef = "entityManagerFactory2", transactionManagerRef = "jpaTransactionManager2")
public class JPAConfig2 {

	@Bean
	public PlatformTransactionManager jpaTransactionManager2(
			@Qualifier("entityManagerFactory2") LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
		EntityManagerFactory factory = localContainerEntityManagerFactoryBean.getObject();
		return new JpaTransactionManager(factory);
	}
	
	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory2(@Value("com.test.jpa.ds2")String pkg, @Qualifier("dataSource2")DataSource dataSource) {
		LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
		factory.setDataSource(dataSource);
		factory.setPackagesToScan(pkg);
		factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
		Properties jpaProperties = new Properties();
		jpaProperties.put("hibernate.show-sql", "true");
		jpaProperties.put("hibernate.connection.show_sql", "true");
		jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
		factory.setJpaProperties(jpaProperties);
		return factory;
	}
}

3.3 新建表

	
	@Autowired
	private DataSource dataSource;
	
	@Test
	public void createTable() throws Exception {
		Connection conn = dataSource.getConnection();
		Statement st = conn.createStatement();
		st.executeUpdate("create table user(user_name varchar(60),password varchar(60))");
		st.close();
		conn.close();
	}
	
	@Autowired
	private DataSource dataSource2;
	
	@Test
	public void createTable2() throws Exception {
		Connection conn = dataSource2.getConnection();
		Statement st = conn.createStatement();
		st.executeUpdate("create table user(user_name varchar(60),password varchar(60))");
		st.close();
		conn.close();
	}

3.4 创建实体类和新建dao(省略其中一个):

package com.test.jpa.ds1.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user")
public class User {
	@Id
	@Column(name = "user_name")
	private String userName;
	@Column
	private String password;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [userName=" + userName + ", password=" + password + "]";
	}

}
package com.test.jpa.ds1;

import org.springframework.data.jpa.repository.JpaRepository;

import com.test.jpa.ds1.entity.User;

public interface UserDs1Dao extends JpaRepository<User, String> {
}

3.5 运行测试

	@Autowired
	private UserDs1Dao userDs1Dao;
	
	@Test
	public void testUserDs1Dao() {
		User user = new User();
		user.setUserName("testuser1");
		user.setPassword("111111");
		userDs1Dao.save(user);
		System.out.println(userDs1Dao.findAll());
	}
	
	@Autowired
	private UserDs2Dao userDs2Dao;
	
	@Test
	public void testUserDs2Dao() {
		com.test.jpa.ds2.entity.User user = new com.test.jpa.ds2.entity.User();
		user.setUserName("testuser1");
		user.setPassword("111111");
		userDs2Dao.save(user);
		System.out.println(userDs2Dao.findAll());
	}

运行结果:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2019-08-28 15:59:27.809  INFO 6156 --- [           main] com.test.service.ds.JpaTest              : Starting JpaTest on DEVPNLN15YF127 with PID 6156 (started by c_yinjicheng-002 in E:\Users\c_yinjicheng-002\bqpt_boot\springboot-db)
2019-08-28 15:59:27.809  INFO 6156 --- [           main] com.test.service.ds.JpaTest              : No active profile set, falling back to default profiles: default
2019-08-28 15:59:28.607  INFO 6156 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-08-28 15:59:28.716  INFO 6156 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 93ms. Found 1 repository interfaces.
2019-08-28 15:59:28.716  INFO 6156 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-08-28 15:59:28.732  INFO 6156 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 16ms. Found 1 repository interfaces.
2019-08-28 15:59:29.466  INFO 6156 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$f2ab5327] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-08-28 15:59:29.690  INFO 6156 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
	name: default
	...]
2019-08-28 15:59:29.784  INFO 6156 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.7.Final}
2019-08-28 15:59:29.784  INFO 6156 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2019-08-28 15:59:30.003  INFO 6156 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-08-28 15:59:30.518  INFO 6156 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
2019-08-28 15:59:30.566  INFO 6156 --- [           main] o.h.e.j.e.i.LobCreatorBuilderImpl        : HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [2] less than 4
2019-08-28 15:59:31.254  INFO 6156 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-08-28 15:59:31.269  INFO 6156 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
	name: default
	...]
2019-08-28 15:59:31.285  INFO 6156 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
2019-08-28 15:59:31.285  INFO 6156 --- [           main] o.h.e.j.e.i.LobCreatorBuilderImpl        : HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [2] less than 4
2019-08-28 15:59:31.316  INFO 6156 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-08-28 15:59:32.613  INFO 6156 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-08-28 15:59:33.003  INFO 6156 --- [           main] com.test.service.ds.JpaTest              : Started JpaTest in 6.184 seconds (JVM running for 7.315)
2019-08-28 15:59:33.596  INFO 6156 --- [           main] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
[User [userName=testuser1, password=111111]]
2019-08-28 15:59:34.441  INFO 6156 --- [       Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
2019-08-28 15:59:34.441  INFO 6156 --- [       Thread-2] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2019-08-28 15:59:34.441  INFO 6156 --- [       Thread-2] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'

 

以上就是本文的全部内容,本文讲解了如何在springboot多数据源中配置mybatis和hibernate,以及如何测试,另外,在mybatis中需要注意我们的第一个数据源的 SqlSessionFactory ben名称必须为sqlSessionFactory或者含有@Primary注解,否则将导致配置失败。

本文的项目下载地址:

springboot(4) 整合mybatis和hibernate

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值