使用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>
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>
相关文章推荐
- PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
- Spring整合Hibernate开发 - 使用事务管理器操作数据库 - 主配置文件
- 使用TransactionScope实现多数据库连接事务操作
- 使用TransactionScope实现单数据库连接事务操作
- PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
- 我项目使用的数据库连接管理、事务管理类(欢迎拍砖)
- 使用C3P0管理数据库连接,继续我们的JDBC封装
- 使用TransactionScope实现单数据库连接事务操作
- 使用TransactionScope实现多数据库连接事务操作
- 【j2ee spring】7、spring与数据库的连接的操作事务管理
- 使用TransactionScope实现多数据库连接事务操作
- PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
- 使用properties属性文件做连接数据库的操作代码
- 适用,简单的数据库连接与sql操作的封装(JDBC,数据库连接池,c3p0)
- PHP使用数据库永久连接方式(mysql_pconnect)操作MySQL的是与非
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- Spring 无法释放连接的原因:没有使用事务管理!
- PHP使用数据库永久连接方式操作MySQL的是与非
- PHP使用数据库永久连接方式(mysql_pconnect)操作MySQL的是与非
- 在Java中利用动态代理实现数据库连接与事务的自动管理