1. Spring整合MyBatis切换SqlSessionFactory有两种方法,第一、 继承SqlSessionDaoSupport,重写获取SqlSessionFactory的方法。第二、继承SqlSessionTemplate 重写getSqlSessionFactory、getConfiguration和SqlSessionInterceptor这个拦截器。其中最为关键还是继承SqlSessionTemplate 并重写里面的方法。

我们一般使用第二种方法,第二种方法有2 种配置:

单个sqlSessionFactory情况:需要在程序中(action 里面动态指定使用那个数据库连接池)

spring-mybatis.xml配置如下:

  1. <!-- ========================================配置数据源========================================= -->
  2. <!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->
  3. <bean name="pepos" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  4. <property name="url" value="${pepos.url}" />
  5. <property name="username" value="${pepos.username}" />
  6. <property name="password" value="${pepos.password}" />
  7. <!-- 密码解密-->
  8. <property name="filters" value="config" />
  9. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${pepos.publickey}" />
  10. <!-- 初始化连接大小 -->
  11. <property name="initialSize" value="0" />
  12. <!-- 连接池最大使用连接数量 -->
  13. <property name="maxActive" value="20" />
  14. <!-- 连接池最大空闲 <property name="maxIdle" value="20" /> -->
  15. <!-- 连接池最小空闲 -->
  16. <property name="minIdle" value="0" />
  17. <!-- 获取连接最大等待时间 -->
  18. <property name="maxWait" value="60000" />
  19. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
  20. <property name="poolPreparedStatements" value="true" />
  21. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  22. <property name="validationQuery" value="SELECT 1" />
  23. <property name="testOnBorrow" value="false" />
  24. <property name="testOnReturn" value="false" />
  25. <property name="testWhileIdle" value="true" />
  26. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  27. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  28. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  29. <property name="minEvictableIdleTimeMillis" value="25200000" />
  30. <!-- 打开removeAbandoned功能 -->
  31. <property name="removeAbandoned" value="true" />
  32. <!-- 1800秒,也就是30分钟 -->
  33. <property name="removeAbandonedTimeout" value="1800" />
  34. <!-- 关闭abanded连接时输出错误日志 -->
  35. <property name="logAbandoned" value="true" />
  36. </bean>
  37. <!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->
  38. <bean name="payment" class="com.alibaba.druid.pool.DruidDataSource"
  39. init-method="init" destroy-method="close">
  40. <property name="url" value="${payment.url}" />
  41. <property name="username" value="${payment.username}" />
  42. <property name="password" value="${payment.password}" />
  43. <!-- 密码解密 -->
  44. <property name="filters" value="config" />
  45. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" />
  46. <!-- 初始化连接大小 -->
  47. <property name="initialSize" value="0" />
  48. <!-- 连接池最大使用连接数量 -->
  49. <property name="maxActive" value="20" />
  50. <!-- 连接池最大空闲 <property name="maxIdle" value="20" /> -->
  51. <!-- 连接池最小空闲 -->
  52. <property name="minIdle" value="0" />
  53. <!-- 获取连接最大等待时间 -->
  54. <property name="maxWait" value="60000" />
  55. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
  56. <property name="poolPreparedStatements" value="true" />
  57. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  58. <property name="validationQuery" value="SELECT 1" />
  59. <property name="testOnBorrow" value="false" />
  60. <property name="testOnReturn" value="false" />
  61. <property name="testWhileIdle" value="true" />
  62. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  63. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  64. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  65. <property name="minEvictableIdleTimeMillis" value="25200000" />
  66. <!-- 打开removeAbandoned功能 -->
  67. <property name="removeAbandoned" value="true" />
  68. <!-- 1800秒,也就是30分钟 -->
  69. <property name="removeAbandonedTimeout" value="1800" />
  70. <!-- 关闭abanded连接时输出错误日志 -->
  71. <property name="logAbandoned" value="true" />
  72. </bean>
  73. <!-- 需要基础spring的 AbstractRoutingDataSource 来实现动态设置数据库连接池  -->
  74. <bean id="dynamicDataSource" class="com.threeweidu.mallmanage.utils.DynamicDataSource">
  75. <property name="targetDataSources">
  76. <map key-type="java.lang.String">
  77. <entry value-ref="pepos" key="pepos"></entry>
  78. <entry value-ref="payment" key="payment"></entry>
	<!-- ========================================配置数据源========================================= -->
&lt;!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 --&gt;
&lt;bean name="pepos" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"&gt;
&lt;property name="url" value="${pepos.url}" /&gt;
&lt;property name="username" value="${pepos.username}" /&gt;
&lt;property name="password" value="${pepos.password}" /&gt; &lt;!-- 密码解密--&gt;
&lt;property name="filters" value="config" /&gt;
&lt;property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${pepos.publickey}" /&gt; &lt;!-- 初始化连接大小 --&gt;
&lt;property name="initialSize" value="0" /&gt;
&lt;!-- 连接池最大使用连接数量 --&gt;
&lt;property name="maxActive" value="20" /&gt;
&lt;!-- 连接池最大空闲 &lt;property name="maxIdle" value="20" /&gt; --&gt;
&lt;!-- 连接池最小空闲 --&gt;
&lt;property name="minIdle" value="0" /&gt;
&lt;!-- 获取连接最大等待时间 --&gt;
&lt;property name="maxWait" value="60000" /&gt; &lt;!-- 打开PSCache,并且指定每个连接上PSCache的大小 --&gt;
&lt;property name="poolPreparedStatements" value="true" /&gt;
&lt;property name="maxPoolPreparedStatementPerConnectionSize" value="20" /&gt; &lt;property name="validationQuery" value="SELECT 1" /&gt;
&lt;property name="testOnBorrow" value="false" /&gt;
&lt;property name="testOnReturn" value="false" /&gt;
&lt;property name="testWhileIdle" value="true" /&gt;
&lt;!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&gt;
&lt;property name="timeBetweenEvictionRunsMillis" value="60000" /&gt;
&lt;!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&gt;
&lt;property name="minEvictableIdleTimeMillis" value="25200000" /&gt;
&lt;!-- 打开removeAbandoned功能 --&gt;
&lt;property name="removeAbandoned" value="true" /&gt;
&lt;!-- 1800秒,也就是30分钟 --&gt;
&lt;property name="removeAbandonedTimeout" value="1800" /&gt;
&lt;!-- 关闭abanded连接时输出错误日志 --&gt;
&lt;property name="logAbandoned" value="true" /&gt;
&lt;/bean&gt; &lt;!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 --&gt;
&lt;bean name="payment" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close"&gt;
&lt;property name="url" value="${payment.url}" /&gt;
&lt;property name="username" value="${payment.username}" /&gt;
&lt;property name="password" value="${payment.password}" /&gt; &lt;!-- 密码解密 --&gt;
&lt;property name="filters" value="config" /&gt;
&lt;property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" /&gt; &lt;!-- 初始化连接大小 --&gt;
&lt;property name="initialSize" value="0" /&gt;
&lt;!-- 连接池最大使用连接数量 --&gt;
&lt;property name="maxActive" value="20" /&gt;
&lt;!-- 连接池最大空闲 &lt;property name="maxIdle" value="20" /&gt; --&gt;
&lt;!-- 连接池最小空闲 --&gt;
&lt;property name="minIdle" value="0" /&gt;
&lt;!-- 获取连接最大等待时间 --&gt;
&lt;property name="maxWait" value="60000" /&gt; &lt;!-- 打开PSCache,并且指定每个连接上PSCache的大小 --&gt;
&lt;property name="poolPreparedStatements" value="true" /&gt;
&lt;property name="maxPoolPreparedStatementPerConnectionSize" value="20" /&gt; &lt;property name="validationQuery" value="SELECT 1" /&gt;
&lt;property name="testOnBorrow" value="false" /&gt;
&lt;property name="testOnReturn" value="false" /&gt;
&lt;property name="testWhileIdle" value="true" /&gt;
&lt;!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&gt;
&lt;property name="timeBetweenEvictionRunsMillis" value="60000" /&gt;
&lt;!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&gt;
&lt;property name="minEvictableIdleTimeMillis" value="25200000" /&gt;
&lt;!-- 打开removeAbandoned功能 --&gt;
&lt;property name="removeAbandoned" value="true" /&gt;
&lt;!-- 1800秒,也就是30分钟 --&gt;
&lt;property name="removeAbandonedTimeout" value="1800" /&gt;
&lt;!-- 关闭abanded连接时输出错误日志 --&gt;
&lt;property name="logAbandoned" value="true" /&gt;
&lt;/bean&gt; &lt;!-- 需要基础spring的 AbstractRoutingDataSource 来实现动态设置数据库连接池 --&gt;
&lt;bean id="dynamicDataSource" class="com.threeweidu.mallmanage.utils.DynamicDataSource"&gt;
&lt;property name="targetDataSources"&gt;
&lt;map key-type="java.lang.String"&gt;
&lt;entry value-ref="pepos" key="pepos"&gt;&lt;/entry&gt;
&lt;entry value-ref="payment" key="payment"&gt;&lt;/entry&gt;
</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 496px; top: 2131px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=16&amp;height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/map&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"defaultTargetDataSource"</span><span>&nbsp;ref=</span><span class="string">"pepos"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;id=<span class="string">"jdbcTemplate"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.springframework.jdbc.core.JdbcTemplate"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"dataSource"</span><span>&nbsp;ref=</span><span class="string">"dynamicDataSource"</span><span>&gt;&lt;/property&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;!--&nbsp;MyBatis配置&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class=""><span>&lt;bean&nbsp;id=<span class="string">"sqlSessionFactory"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.mybatis.spring.SqlSessionFactoryBean"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"dataSource"</span><span>&nbsp;ref=</span><span class="string">"dynamicDataSource"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;自动扫描entity目录,&nbsp;省掉Configuration.xml里的手工配置&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"typeAliasesPackage"</span><span>&nbsp;value=</span><span class="string">"com.threeweidu.mallmanage.entity"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;显式指定Mapper文件位置&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"mapperLocations"</span><span>&nbsp;value=</span><span class="string">"classpath:/com/threeweidu/mallmanage/dao/mybatis/mapper/*Mapper.xml"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&lt;!--&nbsp;配置扫描器&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;bean&nbsp;<span class="keyword">class</span><span>=</span><span class="string">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;扫描me.gacl.dao这个包以及它的子包下的所有映射接口类&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"basePackage"</span><span>&nbsp;value=</span><span class="string">"com.threeweidu.mallmanage.dao.mybatis"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"sqlSessionFactoryBeanName"</span><span>&nbsp;value=</span><span class="string">"sqlSessionFactory"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;!--&nbsp;配置Spring的事务管理器&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class=""><span>&lt;bean&nbsp;id=<span class="string">"transactionManager"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"dataSource"</span><span>&nbsp;ref=</span><span class="string">"dynamicDataSource"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:annotation-driven&nbsp;transaction-manager=<span class="string">"transactionManager"</span><span>&nbsp;proxy-target-</span><span class="keyword">class</span><span>=</span><span class="string">"true"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&lt;!--&nbsp;拦截器方式配置事务&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;tx:advice&nbsp;id=<span class="string">"transactionAdvice"</span><span>&nbsp;transaction-manager=</span><span class="string">"transactionManager"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:attributes&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"get*"</span><span>&nbsp;&nbsp;&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"true"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"find*"</span><span>&nbsp;&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"true"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"load*"</span><span>&nbsp;&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"true"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"init*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"save*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"add*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"register*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"update*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"delete*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"remove*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"*"</span><span>&nbsp;propagation=</span><span class="string">"SUPPORTS"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tx:attributes&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;/tx:advice&gt;&nbsp;&nbsp;</span></li><li class=""><span>&lt;aop:config&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;aop:pointcut&nbsp;id=<span class="string">"transactionPointcut"</span><span>&nbsp;expression=</span><span class="string">"execution(*&nbsp;com.threeweidu.mallmanage.service..*Impl.*(..))"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;aop:advisor&nbsp;pointcut-ref=<span class="string">"transactionPointcut"</span><span>&nbsp;advice-ref=</span><span class="string">"transactionAdvice"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&lt;/aop:config&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>lt;/beans&gt;&nbsp;&nbsp;</span></li></ol></div><pre class="java" name="code" style="display: none;"> &lt;/map&gt;
&lt;/property&gt;
&lt;property name="defaultTargetDataSource" ref="pepos"&gt;
&lt;/property&gt;
&lt;/bean&gt; &lt;bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"&gt;
&lt;property name="dataSource" ref="dynamicDataSource"&gt;&lt;/property&gt;
&lt;/bean&gt; &lt;!-- MyBatis配置 --&gt;
&lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&gt;
&lt;property name="dataSource" ref="dynamicDataSource" /&gt;
&lt;!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --&gt;
&lt;property name="typeAliasesPackage" value="com.threeweidu.mallmanage.entity" /&gt;
&lt;!-- 显式指定Mapper文件位置 --&gt;
&lt;property name="mapperLocations" value="classpath:/com/threeweidu/mallmanage/dao/mybatis/mapper/*Mapper.xml" /&gt;
&lt;/bean&gt; &lt;!-- 配置扫描器 --&gt;
&lt;bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&gt;
&lt;!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 --&gt;
&lt;property name="basePackage" value="com.threeweidu.mallmanage.dao.mybatis" /&gt;
&lt;property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /&gt;
&lt;/bean&gt; &lt;!-- 配置Spring的事务管理器 --&gt;
&lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;
&lt;property name="dataSource" ref="dynamicDataSource" /&gt;
&lt;/bean&gt; &lt;tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /&gt; &lt;!-- 拦截器方式配置事务 --&gt;
&lt;tx:advice id="transactionAdvice" transaction-manager="transactionManager"&gt;
&lt;tx:attributes&gt;
&lt;tx:method name="get*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="find*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="load*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="*" propagation="SUPPORTS" /&gt;
&lt;/tx:attributes&gt;
&lt;/tx:advice&gt;
&lt;aop:config&gt;
&lt;aop:pointcut id="transactionPointcut" expression="execution(* com.threeweidu.mallmanage.service..*Impl.*(..))"/&gt;
&lt;aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/&gt;
&lt;/aop:config&gt;

</beans>

多个sqlsessionFactroy 模式

spring-mybatis.xml 配置文件

  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:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  12. ">
  13. <import resource="spring-mybatis-shop.xml" />
  14. <import resource="spring-mybatis-payment.xml" />
  15. <!--
  16. <import resource="spring-mybatis-pepos.xml" />
  17. <import resource="spring-mybatis-peposlog.xml" />
  18. <import resource="spring-mybatis-peposchat.xml" />
  19. <import resource="spring-mybatis-vaservice.xml" />
  20. -->
  21. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
">
&lt;import resource="spring-mybatis-shop.xml" /&gt;
&lt;import resource="spring-mybatis-payment.xml" /&gt;
&lt;!--
&lt;import resource="spring-mybatis-pepos.xml" /&gt;
&lt;import resource="spring-mybatis-peposlog.xml" /&gt;
&lt;import resource="spring-mybatis-peposchat.xml" /&gt;
&lt;import resource="spring-mybatis-vaservice.xml" /&gt;
--&gt;

</beans>

spring-mybatis-payment.xml 配置

  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:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  12. ">
  13. <!-- 数据库连接池 -->
  14. <bean id="dataSource_payment" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  15. <property name="url" value="${payment.url}" />
  16. <property name="username" value="${payment.username}" />
  17. <property name="password" value="${payment.password}" />
  18. <!-- 密码解密 -->
  19. <property name="filters" value="config" />
  20. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" />
  21. <!-- 初始化连接大小 -->
  22. <property name="initialSize" value="3" />
  23. <!-- 连接池最大使用连接数量 -->
  24. <property name="maxActive" value="200" />
  25. <!-- 连接池最大空闲 <property name="maxIdle" value="20" /> -->
  26. <!-- 连接池最小空闲 -->
  27. <property name="minIdle" value="0" />
  28. <!-- 获取连接最大等待时间 -->
  29. <property name="maxWait" value="60000" />
  30. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
  31. <property name="poolPreparedStatements" value="true" />
  32. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  33. <property name="validationQuery" value="SELECT 1" />
  34. <property name="testOnBorrow" value="false" />
  35. <property name="testOnReturn" value="false" />
  36. <property name="testWhileIdle" value="true" />
  37. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  38. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  39. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  40. <property name="minEvictableIdleTimeMillis" value="25200000" />
  41. <!-- 打开removeAbandoned功能 -->
  42. <property name="removeAbandoned" value="true" />
  43. <!-- 1800秒,也就是30分钟 -->
  44. <property name="removeAbandonedTimeout" value="1800" />
  45. <!-- 关闭abanded连接时输出错误日志 -->
  46. <property name="logAbandoned" value="true" />
  47. </bean>
  48. <!-- MyBatis配置 -->
  49. <bean id="sqlSessionFactory_payment" class="org.mybatis.spring.SqlSessionFactoryBean">
  50. <property name="dataSource" ref="dataSource_payment" />
  51. <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
  52. <property name="typeAliasesPackage" value="com.threeweidu.supplier.entity" />
  53. <!-- 显式指定Mapper文件位置 -->
  54. <property name="mapperLocations" value="classpath:/com/threeweidu/supplier/dao/mybatis/payment/mapper/*Mapper.xml" />
  55. </bean>
  56. <!-- 配置扫描器 -->
  57. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  58. <!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 -->
  59. <property name="basePackage" value="com.threeweidu.supplier.dao.mybatis.payment" />
  60. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_payment" />
  61. </bean>
  62. <!-- 配置Spring的事务管理器 -->
  63. <bean id="transactionManager_payment" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  64. <property name="dataSource" ref="dataSource_payment" />
  65. </bean>
  66. <tx:annotation-driven transaction-manager="transactionManager_payment" proxy-target-class="true" />
  67. <!-- 拦截器方式配置事务 -->
  68. <tx:advice id="transactionAdvice_payment" transaction-manager="transactionManager_payment">
  69. <tx:attributes>
  70. <tx:method name="get*"   propagation="REQUIRED" read-only="true"/>
  71. <tx:method name="find*"  propagation="REQUIRED" read-only="true"/>
  72. <tx:method name="load*"  propagation="REQUIRED" read-only="true"/>
  73. <tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  74. <tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  75. <tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  76. <tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  77. <tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  78. <tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  79. <tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  80. <tx:method name="*" propagation="SUPPORTS" />
  81. </tx:attributes>
  82. </tx:advice>
  83. <aop:config>
  84. <aop:advisor advice-ref="transactionAdvice_payment" pointcut="execution(* com.threeweidu.supplier.service..*Impl.*(..))" />
  85. </aop:config>
  86. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
">
&lt;!-- 数据库连接池 --&gt;
&lt;bean id="dataSource_payment" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"&gt;
&lt;property name="url" value="${payment.url}" /&gt;
&lt;property name="username" value="${payment.username}" /&gt;
&lt;property name="password" value="${payment.password}" /&gt; &lt;!-- 密码解密 --&gt;
&lt;property name="filters" value="config" /&gt;
&lt;property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" /&gt; &lt;!-- 初始化连接大小 --&gt;
&lt;property name="initialSize" value="3" /&gt;
&lt;!-- 连接池最大使用连接数量 --&gt;
&lt;property name="maxActive" value="200" /&gt;
&lt;!-- 连接池最大空闲 &lt;property name="maxIdle" value="20" /&gt; --&gt;
&lt;!-- 连接池最小空闲 --&gt;
&lt;property name="minIdle" value="0" /&gt;
&lt;!-- 获取连接最大等待时间 --&gt;
&lt;property name="maxWait" value="60000" /&gt; &lt;!-- 打开PSCache,并且指定每个连接上PSCache的大小 --&gt;
&lt;property name="poolPreparedStatements" value="true" /&gt;
&lt;property name="maxPoolPreparedStatementPerConnectionSize" value="20" /&gt; &lt;property name="validationQuery" value="SELECT 1" /&gt;
&lt;property name="testOnBorrow" value="false" /&gt;
&lt;property name="testOnReturn" value="false" /&gt;
&lt;property name="testWhileIdle" value="true" /&gt;
&lt;!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&gt;
&lt;property name="timeBetweenEvictionRunsMillis" value="60000" /&gt;
&lt;!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&gt;
&lt;property name="minEvictableIdleTimeMillis" value="25200000" /&gt;
&lt;!-- 打开removeAbandoned功能 --&gt;
&lt;property name="removeAbandoned" value="true" /&gt;
&lt;!-- 1800秒,也就是30分钟 --&gt;
&lt;property name="removeAbandonedTimeout" value="1800" /&gt;
&lt;!-- 关闭abanded连接时输出错误日志 --&gt;
&lt;property name="logAbandoned" value="true" /&gt;
&lt;/bean&gt; &lt;!-- MyBatis配置 --&gt;
&lt;bean id="sqlSessionFactory_payment" class="org.mybatis.spring.SqlSessionFactoryBean"&gt;
&lt;property name="dataSource" ref="dataSource_payment" /&gt;
&lt;!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --&gt;
&lt;property name="typeAliasesPackage" value="com.threeweidu.supplier.entity" /&gt;
&lt;!-- 显式指定Mapper文件位置 --&gt;
&lt;property name="mapperLocations" value="classpath:/com/threeweidu/supplier/dao/mybatis/payment/mapper/*Mapper.xml" /&gt;
&lt;/bean&gt; &lt;!-- 配置扫描器 --&gt;
&lt;bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&gt;
&lt;!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 --&gt;
&lt;property name="basePackage" value="com.threeweidu.supplier.dao.mybatis.payment" /&gt;
&lt;property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_payment" /&gt;
&lt;/bean&gt; &lt;!-- 配置Spring的事务管理器 --&gt;
&lt;bean id="transactionManager_payment" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;
&lt;property name="dataSource" ref="dataSource_payment" /&gt;
&lt;/bean&gt; &lt;tx:annotation-driven transaction-manager="transactionManager_payment" proxy-target-class="true" /&gt; &lt;!-- 拦截器方式配置事务 --&gt;
&lt;tx:advice id="transactionAdvice_payment" transaction-manager="transactionManager_payment"&gt;
&lt;tx:attributes&gt;
&lt;tx:method name="get*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="find*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="load*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="*" propagation="SUPPORTS" /&gt;
&lt;/tx:attributes&gt;
&lt;/tx:advice&gt;
&lt;aop:config&gt;
&lt;aop:advisor advice-ref="transactionAdvice_payment" pointcut="execution(* com.threeweidu.supplier.service..*Impl.*(..))" /&gt;
&lt;/aop:config&gt;

</beans>

参考:http://blog.csdn.net/xingxiupaioxue/article/details/51094091

Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory(转)的更多相关文章

  1. Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory

    一.摘要 上两篇文章分别介绍了Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法 和 Spring3 整合Hibernate3.5 动态切换Ses ...

  2. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  3. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  4. Spring Boot整合Druid配置多数据源

    Druid是阿里开发的数据库连接池,功能强大,号称Java语言中最好的数据库连接池.本文主要介绍Srping Boot下用Druid配置多个数据源,demo环境为:Spring Boot 2.1.4. ...

  5. Spring Boot数据访问之多数据源配置及数据源动态切换

    如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源.对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的 ...

  6. Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)

    一.缘由 上一篇文章Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法介绍到了怎么样在Sping.MyBatis.Hibernate整合的应用中动 ...

  7. SpringBoot整合MyBatisPlus配置动态数据源

    目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...

  8. Spring3.2+mybatis3.2+Struts2.3整合

    1.Spring3.2不能用于JDK1.8,只能用于JDK1.7.JDK1.8用spring4.0. 2.导入的jar包 3.目录结构: 4.配置Spring 配置数据库信息: <?xml ve ...

  9. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

随机推荐

  1. 守护、互斥锁、IPC和生产者消费者模型

    守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are ...

  2. 遇到 Form 性能问题怎么办 performance issue

    性能问题是比較复杂的问题. 一般由performance team 负责, 可是常见的情况是, 我们 INV team 定义的 view 不好, 导致查询性能较差. 这个必须由产品组和 perform ...

  3. Design Pattern Adaptor 适配器设计模式

    适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一. 就是这种一个图: watermark/2/text ...

  4. FTP配置说明

    1.下载rpm包,如vsftpd-3.0.2-21.el7.x86_64.rpm.可在系统盘里面找到或者下载 2.参考如下步骤.或者见链接http://blog.csdn.net/uq_jin/art ...

  5. 手动删除oracle数据库

    --===================== -- 手动删除oracle数据库 --===================== 杀掉进程用此方法比较好,能保证杀得干净,而不是用sql 里面的语句ki ...

  6. Multi-process Architecture

    For Developers‎ > ‎Design Documents‎ > ‎ Multi-process Architecture This document describes Ch ...

  7. 威联通212P 在admin用户密码正确情况下仍然无法登录WEB页面解决办法

    *登录 telnet 执行以下语句: [~] # cp /etc/default_config/passwd /mnt/HDA_ROOT/.config/passwd[~] # cp /etc/def ...

  8. 如何在Ubuntu14.04中创建Python虚拟环境

    在Ubuntu14.04中安装Python相对比较容易些,最简单的安装方法就是apt-get安装了,具体的教程可以戳这篇文章:在Ubuntu14.04中如何安装Python3和切换py2和py3环境. ...

  9. Python环境搭建—安利Python小白的Python安装详细教程

    人生苦短,我用Python.众所周知,Python目前越来越火,学习Python的小伙伴也越来越多.最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了 ...

  10. CCF模拟题 相反数

    相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数).   输入格式 第一行包含一个 ...