您的位置:首页 > 数据库

使用c3p0连接数据库、操作数据库和数据库的事务管理,基于mybatis框架

2017-10-10 20:48 633 查看
首先我们要有整个流程的概念,我们先来讲讲这个。

1.首先我们需要连接数据库,对连接的属性进行设置比如用户名密码、连接池中连接数量等等。也就是DataSource

2.和数据库操作有关联的文件有对数据库进行操作的接口,sql语句的xml,domain的类。他们的关系是这样的:对数据库操作的接口和sql语句的xml相对应,然后查出来的结果放到domain的类中。具体他们是怎么通过配置相关联起来的,看下面细讲。

3,配置事务管理器DataSourceTransactionManager。事务管理

<!-- spring的失去管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource">
</bean>

4,TransactionTemplate。事务管理的模板

<!--
事务管理模板 -->
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate"
p:transactionManager-ref="transactionManager">
</bean>

事务的管理分为编程式和xml配置声明式,参考链接http://www.cnblogs.com/yangyquin/p/5583158.html
http://blog.csdn.net/zq9017197/article/details/6321391
编程式的复制一段过来

boolean success = (Boolean) transactionTemplate.execute(new TransactionCallback<Boolean>()
{

           @Override

           public Boolean doInTransaction(TransactionStatus status) {

               try {

 
} catch (Exception e) {

                   LOGGER.error("创建会员:" + user, e);

                   status.setRollbackOnly();

                   return Boolean.FALSE;

               }

               return Boolean.TRUE;

           }

          

       });

5,SqlSessionFactoryBean。SqlSessionFactoryBean是一个工厂bean,它的作用就是解析配置(数据源、别名等)。配置数据源和xml文件的路径,还有typeAliasesPackage和typeAliases

<bean
id="iSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource" 
p:typeAliasesPackage="com.tkm.popo.domain"
p:typeAliases="com.alibaba.alp.plugin.notify.pojo.Notify"
p:mapperLocations="classpath:mapper/*/*.xml" />

 单个定义别名

 使用typeAliases标签,定义别名;将cn.itcast.mybatis.po.User 起别名为user;

[html] view
plain copy

       <!-- 别名定义 -->  

<typeAliases>  

    <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->  

    <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/>  

</typeAliases>  

  批量定义别名

  mybatis自动扫描包中的po类,自动定义别名,别名是类名(首字母大写或小写都可以,一般用小写)

  例如:cn.itcast.mybatis.po.User起别名为User或者user;

[html] view
plain copy

<!-- 别名定义 -->  

<typeAliases>  

    <!-- 批量别名定义,指定包名,mybatis自动扫描包中的po类,自动定义别名,别名是类名(首字母大写或小写都可以,一般用小写) -->  

    <package name="cn.itcast.mybatis.po" />  

</typeAliases>  

在mapper.xml文件中

  没有定义别名前

[html] view
plain copy

<select id="findUserById" parameterType="int"  

    resultType="cn.itcast.mybatis.po.User">  

    select * from USER where id = #{id}  

</select>  

  定义别名后,直接resultType中使用别名user;

[html] view
plain copy

<select id="findUserById" parameterType="int"  

    resultType="user">  

    select * from USER where id = #{id}  

</select>  

6,SqlSessionTemplate。使用模板可以让MapperScannerConfigurer选择,,模板中包含了某种sqlSessionFactoryBean

<!--
mybatis的模板技术  -->
<bean id="iSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" lazy-init="true"  scope="prototype">

       <constructor-arg ref="iSqlSessionFactory" />

    </bean>

7,MapperScannerConfigurer。选择模板和扫描dao层接口,对应前面的模板,扫描dao的接口 。其实是在这里创建了dao的bean

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:sqlSessionTemplateBeanName="iSqlSessionTemplate"  
p:basePackage="com.tkm.popo.dal" />   <!-- 对应前面的模板,扫描dao的接口 。其实是在这里创建了dao的bean-->

</beans>

SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂Bean;SqlSessionFactory是一种生产SqlSession的工厂;SqlSession是代表数据库连接客户端和数据库Server之间的会话信息;SqlSessionTemplate是SqlSession的一个具体实现。

在xml中配置连接MySQL数据库对应上面的1

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${tkm.datasource.jdbc.url}" />
<property name="user" value="${tkm.datasource.jdbc.username}" />
<property name="password" value="${tkm.datasource.jdbc.password}" />
<property name="minPoolSize" value="3" />
<property name="maxPoolSize" value="15" />
<property name="initialPoolSize" value="3" />
<property name="acquireIncrement" value="1" /><!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
 
 
<property name="maxIdleTime" value="1800" />
<property name="idleConnectionTestPeriod" value="1800" />
<property name="maxStatements" value="0" />
<property name="acquireRetryAttempts" value="30" />

<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 
<property name="breakAfterAcquireFailure" value="false" />
<property name="testConnectionOnCheckout" value="true" />
<property name="testConnectionOnCheckin" value="true" />
<property name="automaticTestTable" value="Test" />
<property name="preferredTestQuery" value="select 1 from dual" />
</bean>

其实这里用的是c3p0,C3P0是一个开放源代码的JDBC连接池。

 <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->   

  

  <property name="acquireRetryDelay">1000</property>   

<!--连接关闭时默认将所有未提交的操作回滚。Default: false -->   

  

  <property name="autoCommitOnClose">false</property>   

<!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么   

  

  属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试   

  

  使用。Default: null-->   

  

  <property name="automaticTestTable">Test</property>   

<!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:   

  

  测试的表必须在初始数据源的时候就存在。Default: null-->   

  

  <property name="preferredTestQuery">select id from test where id=1</property>  

<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效   

  

  保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试   

  

  获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->   

  

  <property name="breakAfterAcquireFailure">false</property>   

 <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出   

  

  SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->   

  

  <property name="checkoutTimeout">100</property>   

 <!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。   

  

  Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->   

  

  <property name="connectionTesterClassName"></property>   

<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->   

  

  <property name="idleConnectionTestPeriod">60</property> 

 <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->   

  

  <property name="initialPoolSize">3</property>   

<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->   

  

  <property name="maxIdleTime">60</property>   

<!--连接池中保留的最大连接数。Default: 15 -->   

  

  <property name="maxPoolSize">15</property> 

<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements   

  

  属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。   

  

  如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->   

  

  <property name="maxStatements">100</property>   

 <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->   

  

  <property name="maxStatementsPerConnection"></property> 

 <!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能   

  

  通过多线程实现多个操作同时被执行。Default: 3-->   

  

  <property name="numHelperThreads">3</property>   

<!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0   

  

  的数据源时。Default: null-->   

  

  <property name="overrideDefaultUser">root</property>   

  

<!--与overrideDefaultUser参数对应使用的一个参数。Default: null-->   

  

  <property name="overrideDefaultPassword">password</property>   

  

 <!--密码。Default: null-->   

  

  <property name="password"></property>   

 <!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->   

  

  <property name="propertyCycle">300</property>   

<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的   

  

  时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable   

  

  等方法来提升连接测试的性能。Default: false --> 

<property name="testConnectionOnCheckout">false</property>   

  

  <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->   

  

  <property name="testConnectionOnCheckin">true</property>   

  

 <!--用户名。Default: null-->   

  

  <property name="user">root</property>   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐