spring+mybatis多数据源(数据库主从)实例

SpringBoot、MyBatis配置多数据源 SpringBoot、Mybatis配置多数据源,本文主要介绍采用直接在spring的配置文件中配置多个数据源,然后分别进行事务的配置方式。 阅读详情

applicationContext.xml

 

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd  
  7.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  8.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  9.         http://www.springframework.org/schema/aop      
  10.         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd    
  11.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
  12.         ">  
  13.   
  14.     <description>Spring公共配置 </description>  
  15.   
  16.     <!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->  
  17.     <context:component-scan base-package="com.test">  
  18.     </context:component-scan>  
  19.   
  20.     <aop:aspectj-autoproxy proxy-target-class="true" />  
  21.     <bean  
  22.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  23.         <property name="locations">  
  24.             <value>classpath:app.properties</value>  
  25.         </property>  
  26.     </bean>  
  27.     <bean id="transactionManager"  
  28.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  29.         <property name="dataSource" ref="dynamicDataSource" />  
  30.     </bean>  
  31.     <!-- 使用annotation定义事务 -->  
  32.     <tx:annotation-driven transaction-manager="transactionManager"  
  33.         proxy-target-class="true" />  
  34.   
  35.     <!-- MyBatis配置 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->  
  36.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  37.         <property name="typeAliasesPackage" value="com.test.model" />  
  38.         <property name="mapperLocations" value="classpath*:/mybatis/*Mapper.xml" />  
  39.         <property name="dataSource">  
  40.             <ref bean="dynamicDataSource" />  
  41.         </property>  
  42.     </bean>  
  43.   
  44.   
  45.   
  46.   
  47.     <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口 -->  
  48.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  49.         <property name="basePackage" value="com.test.dao.mybatis" />  
  50.         <!-- <property name="annotationClass" value="jarlun.framework.core.base.mybatis.MyBatisRepository"   
  51.             /> -->  
  52.     </bean>  
  53.   
  54.     <bean id="dynamicDataSource" class="com.test.holder.DynamicDataSource">  
  55.         <!-- 通过key-value的形式来关联数据源 -->  
  56.         <property name="targetDataSources">  
  57.             <map key-type ="java.lang.String">  
  58.                 <entry value-ref="master" key="master"></entry>  
  59.                 <entry value-ref="slave" key="slave"></entry>  
  60.             </map>  
  61.         </property>  
  62.         <property name="defaultTargetDataSource" ref="master" />  
  63.     </bean>  
  64.   
  65.   
  66.   
  67.   
  68.   
  69.   
  70.     <!-- JSR303 Validator定义 -->  
  71.     <!-- 以下 validator ConversionService 在使用 mvc:annotation-driven 会 自动注册 -->  
  72.   
  73.   
  74.     <!-- 建立视图内拦截器来解决JPA中访问延迟加载属性时产生的无会话异常 LazyInitializationException: could   
  75.         not initialize proxy no session -->  
  76.     <!-- 此拦截器会注入到servlet配置中的DefaultAnnotationHandlerMapping中 -->  
  77.   
  78.     <bean id="master" class="org.apache.commons.dbcp.BasicDataSource"  
  79.         destroy-method="close">  
  80.         <!-- Connection Info -->  
  81.         <property name="driverClassName" value="${master.jdbc.driver}" />  
  82.         <property name="url" value="${master.jdbc.url}" />  
  83.         <property name="username" value="${master.jdbc.username}" />  
  84.         <property name="password" value="${master.jdbc.password}" />  
  85.   
  86.         <!-- Connection Pooling Info -->  
  87.         <property name="maxActive" value="${master.jdbc.pool.maxActive}" />  
  88.         <property name="maxIdle" value="${master.jdbc.pool.maxIdle}" />  
  89.         <property name="initialSize" value="${master.jdbc.pool.initialSize}" />  
  90.         <property name="defaultAutoCommit" value="false" />  
  91.   
  92.         <!-- 连接Idle一个小时后超时 -->  
  93.         <property name="timeBetweenEvictionRunsMillis" value="3600000" />  
  94.         <property name="minEvictableIdleTimeMillis" value="3600000" />  
  95.         <property name="testWhileIdle" value="true" />  
  96.         <property name="testOnBorrow" value="true" />  
  97.         <property name="testOnReturn" value="false" />  
  98.         <property name="validationQuery" value="SELECT 1" />  
  99.         <property name="logAbandoned" value="false" />  
  100.         <property name="removeAbandoned" value="true" />  
  101.         <property name="removeAbandonedTimeout" value="60" />  
  102.     </bean>  
  103.   
  104.   
  105.     <bean id="slave" class="org.apache.commons.dbcp.BasicDataSource"  
  106.         destroy-method="close">  
  107.         <!-- Connection Info -->  
  108.         <property name="driverClassName" value="${slave.jdbc.driver}" />  
  109.         <property name="url" value="${slave.jdbc.url}" />  
  110.         <property name="username" value="${slave.jdbc.username}" />  
  111.         <property name="password" value="${slave.jdbc.password}" />  
  112.   
  113.         <!-- Connection Pooling Info -->  
  114.         <property name="maxActive" value="${slave.jdbc.pool.maxActive}" />  
  115.         <property name="maxIdle" value="${slave.jdbc.pool.maxIdle}" />  
  116.         <property name="initialSize" value="${slave.jdbc.pool.initialSize}" />  
  117.         <property name="defaultAutoCommit" value="false" />  
  118.   
  119.         <!-- 连接Idle一个小时后超时 -->  
  120.         <property name="timeBetweenEvictionRunsMillis" value="3600000" />  
  121.         <property name="minEvictableIdleTimeMillis" value="3600000" />  
  122.         <property name="testWhileIdle" value="true" />  
  123.         <property name="testOnBorrow" value="true" />  
  124.         <property name="testOnReturn" value="false" />  
  125.         <property name="validationQuery" value="SELECT 1" />  
  126.         <property name="logAbandoned" value="false" />  
  127.         <property name="removeAbandoned" value="true" />  
  128.         <property name="removeAbandonedTimeout" value="60" />  
  129.     </bean>  
  130.   
  131.   
  132.   
  133.   
  134.   
  135.   
  136. </beans>  


app.properties

 

 

[html] view plain copy

  1. master.jdbc.driver=com.mysql.jdbc.Driver  
  2. master.jdbc.url=jdbc:mysql://120.25.155.55:3306/test  
  3. master.jdbc.username=test  
  4. master.jdbc.password=!QAZxsw2  
  5. master.jdbc.pool.maxActive=60  
  6. master.jdbc.pool.maxIdle=20  
  7. master.jdbc.pool.initialSize=10  
  8.   
  9. slave.jdbc.driver=com.mysql.jdbc.Driver  
  10. slave.jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true  
  11. slave.jdbc.username=root  
  12. slave.jdbc.password=  
  13. slave.jdbc.pool.maxActive=60  
  14. slave.jdbc.pool.maxIdle=20  
  15. slave.jdbc.pool.initialSize=10  


DynamicDataSource.java

 

 

 

 

[java] view plain copy

  1. package com.test.holder;  
  2.   
  3. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  
  4.   
  5. public class DynamicDataSource extends AbstractRoutingDataSource{    
  6.     
  7.     @Override    
  8.     protected Object determineCurrentLookupKey() {    
  9.         return DBContextHolder.getDBType();    
  10.     }    
  11. }    


DBContextHolder.java

 

 

 

 

[java] view plain copy

  1. package com.test.holder;  
  2.   
  3. public class DBContextHolder {  
  4.   
  5.         
  6.     private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();    
  7.         
  8.     public static void setDBType(String dbType) {    
  9.         contextHolder.set(dbType);    
  10.     }    
  11.         
  12.     public static String getDBType() {    
  13.         return contextHolder.get();    
  14.     }    
  15.         
  16.     public static void clearDBType() {    
  17.         contextHolder.remove();    
  18. }  
  19. }  


DataSource.java

 

 

 

 

[java] view plain copy

  1. package com.test.holder;  
  2.   
  3. import java.lang.annotation.Documented;  
  4. import java.lang.annotation.ElementType;  
  5. import java.lang.annotation.Retention;  
  6. import java.lang.annotation.RetentionPolicy;  
  7. import java.lang.annotation.Target;  
  8.   
  9.   
  10. @Retention(RetentionPolicy.RUNTIME)  
  11. @Target(ElementType.METHOD)  
  12. @Documented  
  13. public @interface DataSource {  
  14.       
  15.   
  16.     Source value() default Source.master;  
  17.   
  18. }  


Source.java

 

 

[java] view plain copy

  1. package com.test.holder;  
  2.   
  3. public enum Source {  
  4.   
  5.     /* 主库 */master, /* 从库 */slave  
  6.   
  7. }  

UserMapper.java

 

 

[java] view plain copy

  1. package com.test.dao.mybatis;  
  2.   
  3. import org.apache.ibatis.annotations.Param;  
  4.   
  5. import com.test.model.UserModel;  
  6.   
  7. public interface UserMapper {  
  8.       
  9.     UserModel findByUserId(@Param("userId")Long userId);  
  10.   
  11. }  


UserModel.java

 

 

[java] view plain copy

  1. package com.test.model;  
  2.   
  3. public class UserModel {  
  4.       
  5.     private long id;  
  6.       
  7.     private String nickname;  
  8.   
  9.     public long getId() {  
  10.         return id;  
  11.     }  
  12.   
  13.     public void setId(long id) {  
  14.         this.id = id;  
  15.     }  
  16.   
  17.     public String getNickname() {  
  18.         return nickname;  
  19.     }  
  20.   
  21.     public void setNickname(String nickname) {  
  22.         this.nickname = nickname;  
  23.     }  
  24.       
  25.       
  26.       
  27.   
  28. }  


UserMapper.xml

 

 

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.     <!DOCTYPE mapper    
  3.       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    
  4.       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="com.test.dao.mybatis.UserMapper">  
  6.       
  7.     <resultMap  id="userModel"  type="com.test.model.UserModel" >  
  8.             <result property="id" column="id" />  
  9.             <result property="nickname" column="nickname" />  
  10.         </resultMap>  
  11.           
  12.         <select id="findByUserId"  resultMap="userModel" >   
  13.         select id , nickname from db_user where id=#{userId}  
  14.         </select>  
  15. </mapper>    

 


UserService.java

 

 

 

[java] view plain copy

  1. package com.test.service;  
  2.   
  3. import com.test.model.UserModel;  
  4.   
  5. public interface UserService {  
  6.       
  7.   
  8.      UserModel findByMasterUserId(long userId);  
  9.       
  10.       
  11.      UserModel findBySlaveUserId(long userId);  
  12.   
  13. }  


UserServiceImpl.java

 

 

[java] view plain copy

  1. package com.test.service.impl;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.stereotype.Service;  
  5. import org.springframework.transaction.annotation.Transactional;  
  6.   
  7. import com.test.dao.mybatis.UserMapper;  
  8. import com.test.holder.DataSource;  
  9. import com.test.holder.Source;  
  10. import com.test.model.UserModel;  
  11. import com.test.service.UserService;  
  12.   
  13. @Service("userServiceImpl")  
  14. public class UserServiceImpl implements UserService{  
  15.       
  16.     @Autowired  
  17.     private UserMapper userMapper;  
  18.     @Transactional(rollbackFor={Exception.class})  
  19.     @DataSource(value=Source.master)  
  20.     public UserModel findByMasterUserId(long userId){  
  21.         return this.userMapper.findByUserId(userId);  
  22.     }  
  23.       
  24.       
  25.     @Transactional(rollbackFor={Exception.class})  
  26.     @DataSource(value=Source.slave)  
  27.     public UserModel findBySlaveUserId(long userId){  
  28.         return this.userMapper.findByUserId(userId);  
  29.     }  
  30.   
  31. }  


aop拦截

 

DataSourceContextAop.Java

 

[java] view plain copy

  1. package com.test.aop;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import org.aspectj.lang.JoinPoint;  
  6. import org.aspectj.lang.ProceedingJoinPoint;  
  7. import org.aspectj.lang.annotation.Around;  
  8. import org.aspectj.lang.annotation.Aspect;  
  9. import org.aspectj.lang.reflect.MethodSignature;  
  10. import org.springframework.core.annotation.Order;  
  11. import org.springframework.stereotype.Component;  
  12.   
  13. import com.test.holder.DBContextHolder;  
  14. import com.test.holder.DataSource;  
  15.   
  16. @Aspect  
  17. @Order(value=1)  
  18. @Component  
  19. public class DataSourceContextAop {  
  20.   
  21.     @Around("execution(@com.test.holder.DataSource * com.test.service.impl.*.*(..))")  
  22.     public Object setDynamicDataSource(ProceedingJoinPoint pjp) throws Throwable {  
  23.         Method method = this.getMethod(pjp);  
  24.         DataSource dataSource = method.getAnnotation(DataSource.class);  
  25.         if (dataSource != null) {  
  26.             DBContextHolder.setDBType(dataSource.value().name());  
  27.         }  
  28.             return pjp.proceed();  
  29.     }  
  30.   
  31.       
  32.     public Method getMethod(JoinPoint pjp) {  
  33.         Method method = null;  
  34.         MethodSignature signature = (MethodSignature) pjp.getSignature();  
  35.         method = signature.getMethod();  
  36.         return method;  
  37.     }  
  38.   
  39. }  


最后测试

 

Test.java

 

[java] view plain copy

  1. package test;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. import com.test.service.UserService;  
  7.   
  8. public class Test {  
  9.   
  10.       
  11.     public static void main(String[] args) {  
  12.          ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");    
  13.          UserService userService = (UserService) ac.getBean("userServiceImpl");    
  14.          System.out.println(userService.findByMasterUserId(1000001).getNickname());    
  15.          System.out.println(userService.findBySlaveUserId(1000001).getNickname());    
  16.   
  17.     }  
  18.       
  19.       
  20. }  


谢谢

而外加个hibernate和mybatis混用的配置

 

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd  
  7.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  8.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  9.         http://www.springframework.org/schema/aop      
  10.         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd    
  11.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
  12.         ">  
  13.   
  14.     <description>Spring公共配置 </description>  
  15.   
  16.     <!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->  
  17.     <context:component-scan base-package="com.test">  
  18.     </context:component-scan>  
  19.   
  20.     <aop:aspectj-autoproxy proxy-target-class="true" />  
  21.     <bean  
  22.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  23.         <property name="locations">  
  24.             <value>classpath:app.properties</value>  
  25.         </property>  
  26.     </bean>  
  27.     <bean id="transactionManager"  
  28.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  29.         <property name="dataSource" ref="dynamicDataSource" />  
  30.     </bean>  
  31.       
  32.         <!-- Jpa Entity Manager 配置 -->  
  33.     <bean id="entityManagerFactory"  
  34.         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
  35.         <property name="dataSource" ref="dynamicDataSource" />  
  36.         <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />  
  37.         <property name="packagesToScan" value="com.test.entity" />  
  38.         <property name="jpaProperties">  
  39.             <props>  
  40.                 <!-- <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory  
  41.                 </prop>  
  42.                 <prop key="net.sf.ehcache.configurationResourceName">ehcache/ehcache-hibernate.xml</prop> -->  
  43.                 <!-- 命名规则 My_NAME->MyName -->  
  44.                 <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>  
  45.                 <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
  46.             </props>  
  47.         </property>  
  48.     </bean>  
  49.     <bean id="hibernateJpaVendorAdapter"  
  50.         class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
  51.         <property name="databasePlatform">  
  52.             <bean factory-method="getDialect"  
  53.                 class="org.springside.modules.persistence.Hibernates">  
  54.                 <constructor-arg ref="dynamicDataSource" />  
  55.             </bean>  
  56.         </property>  
  57.     </bean>  
  58.     <!-- 使用annotation定义事务 -->  
  59.     <tx:annotation-driven transaction-manager="transactionManager"  
  60.         proxy-target-class="true" />  
  61.   
  62.     <!-- MyBatis配置 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->  
  63.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  64.         <property name="typeAliasesPackage" value="com.test.model" />  
  65.         <property name="mapperLocations" value="classpath*:/mybatis/*Mapper.xml" />  
  66.         <property name="dataSource">  
  67.             <ref bean="dynamicDataSource" />  
  68.         </property>  
  69.     </bean>  
  70.   
  71.   
  72.   
  73.   
  74.     <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口 -->  
  75.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  76.         <property name="basePackage" value="com.test.dao.mybatis" />  
  77.         <!-- <property name="annotationClass" value="jarlun.framework.core.base.mybatis.MyBatisRepository"   
  78.             /> -->  
  79.     </bean>  
  80.   
  81.     <bean id="dynamicDataSource" class="com.test.holder.DynamicDataSource">  
  82.         <!-- 通过key-value的形式来关联数据源 -->  
  83.         <property name="targetDataSources">  
  84.             <map key-type ="java.lang.String">  
  85.                 <entry value-ref="master" key="master"></entry>  
  86.                 <entry value-ref="slave" key="slave"></entry>  
  87.             </map>  
  88.         </property>  
  89.         <property name="defaultTargetDataSource" ref="master" />  
  90.     </bean>  
  91.   
  92.   
  93.   
  94.   
  95.   
  96.   
  97.     <!-- JSR303 Validator定义 -->  
  98.     <!-- 以下 validator ConversionService 在使用 mvc:annotation-driven 会 自动注册 -->  
  99.   
  100.   
  101.     <!-- 建立视图内拦截器来解决JPA中访问延迟加载属性时产生的无会话异常 LazyInitializationException: could   
  102.         not initialize proxy no session -->  
  103.     <!-- 此拦截器会注入到servlet配置中的DefaultAnnotationHandlerMapping中 -->  
  104.   
  105.     <bean id="master" class="org.apache.commons.dbcp.BasicDataSource"  
  106.         destroy-method="close">  
  107.         <!-- Connection Info -->  
  108.         <property name="driverClassName" value="${master.jdbc.driver}" />  
  109.         <property name="url" value="${master.jdbc.url}" />  
  110.         <property name="username" value="${master.jdbc.username}" />  
  111.         <property name="password" value="${master.jdbc.password}" />  
  112.   
  113.         <!-- Connection Pooling Info -->  
  114.         <property name="maxActive" value="${master.jdbc.pool.maxActive}" />  
  115.         <property name="maxIdle" value="${master.jdbc.pool.maxIdle}" />  
  116.         <property name="initialSize" value="${master.jdbc.pool.initialSize}" />  
  117.         <property name="defaultAutoCommit" value="false" />  
  118.   
  119.         <!-- 连接Idle一个小时后超时 -->  
  120.         <property name="timeBetweenEvictionRunsMillis" value="3600000" />  
  121.         <property name="minEvictableIdleTimeMillis" value="3600000" />  
  122.         <property name="testWhileIdle" value="true" />  
  123.         <property name="testOnBorrow" value="true" />  
  124.         <property name="testOnReturn" value="false" />  
  125.         <property name="validationQuery" value="SELECT 1" />  
  126.         <property name="logAbandoned" value="false" />  
  127.         <property name="removeAbandoned" value="true" />  
  128.         <property name="removeAbandonedTimeout" value="60" />  
  129.     </bean>  
  130.   
  131.   
  132.     <bean id="slave" class="org.apache.commons.dbcp.BasicDataSource"  
  133.         destroy-method="close">  
  134.         <!-- Connection Info -->  
  135.         <property name="driverClassName" value="${slave.jdbc.driver}" />  
  136.         <property name="url" value="${slave.jdbc.url}" />  
  137.         <property name="username" value="${slave.jdbc.username}" />  
  138.         <property name="password" value="${slave.jdbc.password}" />  
  139.   
  140.         <!-- Connection Pooling Info -->  
  141.         <property name="maxActive" value="${slave.jdbc.pool.maxActive}" />  
  142.         <property name="maxIdle" value="${slave.jdbc.pool.maxIdle}" />  
  143.         <property name="initialSize" value="${slave.jdbc.pool.initialSize}" />  
  144.         <property name="defaultAutoCommit" value="false" />  
  145.   
  146.         <!-- 连接Idle一个小时后超时 -->  
  147.         <property name="timeBetweenEvictionRunsMillis" value="3600000" />  
  148.         <property name="minEvictableIdleTimeMillis" value="3600000" />  
  149.         <property name="testWhileIdle" value="true" />  
  150.         <property name="testOnBorrow" value="true" />  
  151.         <property name="testOnReturn" value="false" />  
  152.         <property name="validationQuery" value="SELECT 1" />  
  153.         <property name="logAbandoned" value="false" />  
  154.         <property name="removeAbandoned" value="true" />  
  155.         <property name="removeAbandonedTimeout" value="60" />  
  156.     </bean>  
  157.   
  158.   
  159.   
  160.   
  161.   
  162.   
  163. </beans> 
使用Mybatis实现多表添加数据之多对一实例(含代码及解释) 多对一插入实例(本文是接着上一篇查询写的,其余文件都在上一篇博客中) 本文实现的插入: 是指有一个新的部门,然后招了新人.这时候,我们需要先插入部门名以及部门编号.再插入新人的编号,新人的姓名,以及新人的部门编号.数据库中两个表的id都加了主键以及自增属性.并且为员工表设置了外键,参照部门表的主键. 我们为了方便,设置自增策略,写插入的时候,也不会写id那一列,利用自增赋值.但是插入员工的... 阅读详情

相关推荐

MyBatis-Plus多数据源——如何在一个项目中使用多个MySQL数据库(1)

2.基于mybatisPlus实现在一个项目中使用多数据源;primary: mysql_centos #配置主数据源。1.mybatisPlus多数据源的使用场景;由注解确定去哪个数据源进行查找。创建一个数据用户,控制其权限。可能需要查不同数据源的数据库。的作用如下,默认数据库。

2501_90255635的博客 274

xml文件配置多数据源

application.xml文件种配置 –java 在这里插入代码片 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc...

weixin_44449775的博客 1430

ssm框架下的多数据源主从数据库配置

主从数据库SSM框架配置 原理:动态的使用不同的datasource我们就可以动态的使用不同的数据源,问题来了怎样动态的使用不同的datasource呢,----在spring中有一个类叫做AbstractRoutingDataSource,顾名思义叫做路由选择datasource,这个类继承AbstractDataSource,AbstractDataSource实现DataSource,因此...

qq_34592810的博客 2054

配置多个数据源,spring profile 多环境配置管理

针对生产环境,测试环境,以及本地调试开发有时会配置多套数据库,在一个数据配置文件进行修改,往往有时发布到生成环境会忘记修改,或者本地调试时还是生产环境的库,会导致生产环境数据被污染。 ps--刚开始配完发现在Myeclipse一直是“development”模式,后来发现tomcat配置完之后要myeclise中进行jdk配置。 1.这里我们可以配置多个数据源配置文件: application.development.properties 作为开发环境; application.local.pr

jasonhongcn的专栏 854

Spring Boot入门教程(九): MyBatis多数据源(主从数据库)

1. 引入依赖 &lt;dependency&gt; &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt; &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt; &lt;version&gt;1.3.2&lt;/version&g

人不风流枉少年 1526

RK3588 MPP视频编码实战:从环境搭建到高效封装

本文详细介绍了在RK3588平台上利用MPP(Media Process Platform)进行硬件视频编码的完整实战流程。从MPP库的环境搭建、编译安装,到核心编码参数(如码率控制、GOP、图像对齐)的深入解析,并提供了一个可复用的C++编码器类封装方案,帮助开发者快速实现高效的H.264/H.265视频编码,显著降低CPU占用。

weixin_29192211的博客 346

mybatis 配置多数据源 java_springboot + mybatis配置多数据源示例

在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。代码结构:简要原理:1)DatabaseType列出所有的数据源的key---key2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法3)DynamicDataSource继承AbstractRoutingDataSource...

weixin_39893042的博客 331

VMware共享磁盘配置实战:从零搭建多机共享存储环境

本文详细介绍了在VMware环境中从零开始配置共享磁盘的完整实战流程。通过创建共享磁盘、挂载至多台虚拟机并修改.vmx配置文件等关键步骤,帮助用户搭建可用于数据库集群(如Oracle RAC)测试的多机共享存储环境,并提供了核心参数设置与常见问题排查指南。

weixin_29284201的博客 490

Spring Mybatis 实现主从数据库/多数据源切换配置

开发项目用到数据库 db2 某个功能需要从SQL server数据库取数据 对比 在此把代码整理 发上来 不然 都忘了 一、配置文件 注意: 数据库连接池 看项目不同 做对应调整即可 <!-- base dataSource --> <bean name="baseDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ...

Kricss|Code的卢浮宫 1254

C++详解 二叉树的三种遍历方式

上一篇文章,讲了二叉树的创建——C++实现 链表存储二叉树 接下来讲解二叉树的三种遍历方式:先序(前序)遍历、中序遍历、后序遍历,三种方式都是DFS(Depth First Search)深度优先搜索,核心思想都是函数的递归(栈),如果你能理解上面这篇文章中创建二叉树的具体过程,那么遍历就轻而易举 1.先序遍历 Former_Order_Traversel(BinTree_Node* p) { ...

weixin_43335392的博客 5371

跟着Cell学单细胞转录组分析(五):单细胞转录组marker基因鉴定及细胞群注释

书接上回(跟着Cell学单细胞转录组分析(四):单细胞转录组测序UMAP降维聚类)。完成数据降维和细胞聚类后,最主要的环节和工作就是确定各个细胞群,明确是什么类型的细胞,正群的细胞定群很关键,涉及到整个研究,所以这一步宁愿多费时间,也不要出错。当然,这也不是一蹴而就的,需要反复的确认。 要确定各个群是什么细胞,首先需要了解细胞群的marker基因,因为不同类型的细胞突出 表达的基因也是不同的。这里使用FindAllMarkers鉴定各个细胞群的高表达基因。 DefaultAssay(scedata)

qq_42090739的博客 1万+

MyBatis-Plus多数据源——如何在一个项目中使用多个MySQL数据库

2.基于mybatisPlus实现在一个项目中使用多数据源;primary: mysql_centos #配置主数据源。1.mybatisPlus多数据源的使用场景;由注解确定去哪个数据源进行查找。创建一个数据用户,控制其权限。可能需要查不同数据源的数据库。的作用如下,默认数据库。

2501_90255664的博客 287

apt-get update时出现GPG error:... bionic InRelease:The following signatures were invalid: EXPKEYS解决方案

本文主要介绍了apt-get update时出现W: GPG error: … bionic InRelease: The following signatures were invalid: EXPKEYSIG B7B3B788A8D3785C MySQL Release Engineering E: The repository ‘… bionic InRelease’ is not signed.解决方案,希望能对使用Ubuntu系统的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

mybatis mysql 主从_mybatis主从数据库配置文件

第三章 : JavaORM框架之Mybatis篇(Ibatis)欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系。本系列教程希望您能站在上帝的角度去观察(了解)Java体系。使Java的各种后端技术在你心中模块化;让你在工作中能将Java...文章jimisun2018-10...

weixin_31830691的博客 1390

Python爬虫教程:抓取Android或iOS应用中的数据

随着智能手机的普及,移动应用程序已经成为我们生活中不可或缺的一部分。从社交媒体、在线购物到金融服务和健康管理,几乎所有领域都有相应的手机应用程序(App)服务用户。而这些应用程序通常会存储大量的数据,例如用户行为、产品信息、订单记录等。如果我们能有效地抓取这些数据,可以为数据分析、商业智能、用户行为分析等提供有力支持。本文将重点介绍如何使用Python爬虫技术抓取Android或iOS应用中的数据,尤其是如何从这些应用的后端接口、存储、或网页中提取数据。我们将探讨如何通过反向工程技术访问移动应用中的API接

2201_76125261的博客 801

全新YOLOv11有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

YOLOv11专栏持续更新500+种创新改进方案,涵盖卷积优化、注意力机制、主干网络、Neck特征融合、检测头、小目标检测等核心模块。提供独家创新点组合方案、模型轻量化改进及最新Mamba架构融合技术,配套完整实验代码和训练参数解析。订阅用户可加入专属答疑群,获取一键运行项目支持。专栏包含YOLOv11网络结构详解、配置文件解读等入门必读内容,助力科研论文发表与模型性能提升。限时开放订阅通道,提供多种涨点改进方案组合,满足不同研究需求。

Ai缝合怪、助力小伙伴高效发论文 3996

springboot整合mybatis主从数据库读取(一)

前面文章已经介绍过数据库到主从复制功能,不懂到同学可以看下主从复制实现机制 也可以参考 https://blog.csdn.net/u014399489/article/details/88710429 博客,废话不多说, 直接上代码实现今天到主题课程,有错误到地方欢迎指出 一:课程到技术要求 1) 对springboot 有一定到基础 2)对mybatis有一定基础 3)对mav...

零点 3186

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1730

mysql druid数据源配置_详解Spring Boot整合Mybatis实现 Druid多数据源配置

一、多数据源的应用场景目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢?Druid 是 Java 的数据库连接池组件。Druid 能够提供强大的监控和扩展功能。比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等。Druid 核心主要包括三部分:1. DruidDriver 代理 Driver,能够提供基于 Filter-Chain 模式的插件体系。2. Dru...

weixin_39621427的博客 263

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 多数据源使用入门

承接上篇文章,数据库已经实现主从复制,接下来我们就需要在java程序中使用spring+mybatis的多数据源特性实现项目的读写分离,提高项目性能。 目的 现在我们有两个数据一样的数据库信息,我们可以在slave数据库上根据我们的需求添加索引提升查询效率,如果项目有增删改的动作,我们就使用master数据库,大部分情况下,我们都是优化项目的查询功能,如果觉得slave数据库加索引后还满足不了...

niguolaiya的博客 922

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mybatis-plus(多数据源配置)

多数据源配置

懒散的蜗牛 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

spring + mybatis 配置多数据源

1.这里说到的是非主从关系的多数据源,就是两个完全独立的数据库 2.下面说一下配置过程,主要参考资料: http://www.cnblogs.com/digdeep/p/4512368.html 首先是spring配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="htt

qq465235530的专栏 356

springboot多数据源_搞定!用多套源策略解决SpringBoot多数据源

1. 引言在开发过程中,避免不了需要同时操作多个数据库的情况,通常的应用场景如下 :数据库高性能场景:主从,包括一主一从,一主多从等,在主库进行增删改操作,在从库进行读操作。数据库高可用场景:主备,包括一往一备,多主多备等,在数据库无法访问时可以切换。同构或异构数据的业务处理:需要处理的数据存储在不同的数据库中,包括同构(如都是 MySQL ),异构(如一个MySQL ,另外是 PG 或者 Ora...

weixin_39798031的博客 386
上一篇: spring jar包详解
下一篇: FastJson的基本使用
farmering
博客等级 码龄15年 18粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值