Spring JDBC 和 事务控制——(1)

Spring JDBC  事务控制

1. 主要内容(了解

2. Spring 整合 JDBC 环境(操作)

  Spring 框架除了提供 IOC  AOP 核⼼功能外,同样提供了基于JDBC 的数据访问功能,使得访问持久层数据更加⽅便。使⽤ Spring JDBC 环境,⾸先需要⼀套 Spring 整合 JDBC 的环境。

2.1. 添加依赖坐标

<!-- 添加相关的依赖坐标 -->

<!-- spring 框架坐标依赖添加 -->

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-context</artifactId>

 <version>5.2.4.RELEASE</version>

</dependency>

<!-- spring 测试环境 -->

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-test</artifactId>

 <version>5.2.4.RELEASE</version>

 <scope>test</scope>

</dependency>

<!-- aop -->

<dependency>

 <groupId>org.aspectj</groupId>

 <artifactId>aspectjweaver</artifactId>

 <version>1.9.5</version>

</dependency>

<!-- spring jdbc -->

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-jdbc</artifactId>

 <version>5.2.4.RELEASE</version>

</dependency>

<!-- spring事物 -->

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-tx</artifactId>

 <version>5.2.4.RELEASE</version>

</dependency>

<!-- mysql 驱动包 -->

<dependency>

 <groupId>mysql</groupId>

 <artifactId>mysql-connector-java</artifactId>

 <version>8.0.19</version>

</dependency>

<!-- c3p0 连接池 -->

<dependency>

 <groupId>com.mchange</groupId>

 <artifactId>c3p0</artifactId>

 <version>0.9.5.5</version>

</dependency>

2.2. 添加 jdbc 配置⽂件

src/main/resources⽬录下新建jdbc.properties配置⽂件,并设置对应的配置信息

# 驱动名

jdbc.driver=com.mysql.cj.jdbc.Driver

# 数据库连接

jdbc.url=jdbc:mysql://localhost:3306/(数据库名称)?

useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false # 数据库⽤户名称

jdbc.user=(数据库账号)

# 数据库⽤户密码

jdbc.password=(数据库密码)

以下为可选配置

# 指定连接池的初始化连接数。取值应在minPoolSize  maxPoolSize 之间.Default:3 initialPoolSize=20

# 指定连接池中保留的最⼤连接数. Default:15

maxPoolSize=100

# 指定连接池中保留的最⼩连接数

minPoolSize=10
# 最⼤空闲时间,60秒内未使⽤则连接被丢弃。若为0则永不丢弃。 Default:0

maxIdleTime=600
# 当连接池中的连接耗尽的时候c3p0⼀次同时获取的连接数. Default:3

acquireIncrement=5
# JDBC的标准,⽤以控制数据源内加载的PreparedStatements数量。

maxStatements=5

# 60秒检查所有连接池中的空闲连接.Default:0

idleConnectionTestPeriod=60

2.3. 修改 spring 配置⽂件

<!-- 加载properties 配置⽂件,⽤来读取jdbc.properties⽂件中的数据 -->

<context:property-placeholder location="jdbc.properties" />

spring.xml

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd">

 <!-- Spring扫描注解的配置 -->

 <context:component-scan base-package="com.xxxx" />

 <!-- 加载properties 配置⽂件 -->
 <context:property-placeholder location="jdbc.properties" />

</beans>

2.4. 配置数据源

  由于建⽴数据库连接是⼀个⾮常耗时耗资源的⾏为,所以通过连接池预先同数据库建⽴⼀些连接,放在内存中,应⽤程序需要建⽴数据库连接时直接到连接池中申请⼀个就⾏,⽤完后再放回去。

C3P0  DBCP ⼆选⼀即可

        DBCP(DataBase connection pool),数据库连接池。是 apache 上的⼀个 java 连接池项⽬,也是 tomcat 使⽤的连接池组件。单独使⽤dbcp需要2个包:commons-dbcp.jarcommons-pool.jar dbcp,没有⾃动回收空闲连接的功能。

        C3P0是⼀个开源的JDBC连接池,它实现了数据源,⽀持JDBC3规范和JDBC2的标准扩展。⽬前使⽤它的开源项⽬有HibernateSpring等。c3p0有⾃动回收空闲连接功能。

2.4.1. C3P0 数据源配置

<!-- 配置 c3p0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

 <!-- property标签的value属性对应的是jdbc.properties中的值 -->
 <property name="driverClass" value="${jdbc.driver}"></property>  <property name="jdbcUrl" value="${jdbc.url}"></property>
 <property name="user" value="${jdbc.user}"></property>
 <property name="password" value="${jdbc.password}"></property>

</bean>

C3P0 其他额外配置(对应的值在jdbc.properties⽂件中指定)

<!-- 指定连接池中保留的最⼤连接数。 Default:15-->
<property name="maxPoolSize" value="${maxPoolSize}"/>
<!-- 指定连接池中保留的最⼩连接数。-->
<property name="minPoolSize" value="${minPoolSize}"/>
<!-- 指定连接池的初始化连接数。取值应在minPoolSize  maxPoolSize 之间.Default:3--> <property name="initialPoolSize" value="${initialPoolSize}"/>
<!-- 最⼤空闲时间,60秒内未使⽤则连接被丢弃。若为0则永不丢弃。 Default:0-->
<property name="maxIdleTime" value="${maxIdleTime}"/>
<!-- 当连接池中的连接耗尽的时候c3p0⼀次同时获取的连接数。 Default:3-->
<property name="acquireIncrement" value="${acquireIncrement}"/>
<!-- JDBC的标准,⽤以控制数据源内加载的PreparedStatements数量。 

但由于预缓存的statements属于单个connection,⽽不是整个连接池所以设置这个参数需要考虑到多⽅⾯的因数。如果maxStatementsmaxStatementsPerConnection均为0,则缓存被关闭。Default:0--> <property name="maxStatements" value="${maxStatements}"/>
<!-- 60秒检查所有连接池中的空闲连接。Default:0 -->
<property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/>

2.4.2. DBCP 数据源配置

<!-- 配置dbcp数据源-->
<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource">  <property name="driverClassName" value="${jdbc.driver}" />
 <property name="url" value="${jdbc.url}"/>

 <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <!-- 连接池启动时的初始值 -->  

 <property name="initialSize" value="1"/>  
 <!-- 最⼤空闲值.当经过⼀个⾼峰时间后,连接池可以将已经⽤不到的连接慢慢释放⼀部分,⼀直减少到maxIdle为⽌ --> 

 <property name="maxIdle" value="2"/>  
 <!-- 最⼩空闲值.当空闲的连接数少于阀值时,连接池就会预申请⼀些连接,以避免洪峰来时再申请⽽造成的性能开销 --> 

 <property name="minIdle" value="1"/>  

</bean>

2.5. 模板类配置

  Spring JDBC 中重复的操作建⽴成了⼀个模板类:org.springframework.jdbc.core.JdbcTemplate 

<!-- 配置JdbcTemplate实例,并注⼊⼀个dataSource数据源-->
<bean id="jdbcTemplate"  class="org.springframework.jdbc.core.JdbcTemplate">  <property name="dataSource" ref="dataSource"></property>

</bean>

2.6. JDBC 测试

2.6.1. 创建指定数据库

选择连接,右键选择"新建数据库",设置数据库的名称和编码格式

2.6.2. 创建数据表

2.6.3. 使⽤ JUnit 测试

通过 junit 测试 jdbcTemplate bean 是否获取到

2.6.3.1. JUnit 测试

public class SpringJdbcTest01 {

 @Test

 public void testQueryCount() {

 // 获取spring上下⽂环境
 ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); // 得到模板类 JdbcTemplate对象
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");

 // 定义sql语句

 String sql = "select count(1) from tb_account";

 // 执⾏查询操作(⽆参数)
 Integer total= jdbcTemplate.queryForObject(sql, Integer.class); System.out.println("总记录数:" + total);

 }

 @Test

 public void testQueryCountByUserId() {

 // 获取spring上下⽂环境
 ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); // 得到模板类 JdbcTemplate对象
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");

 // 定义sql语句
 String sql = " select count(1) from tb_account where user_id = ?"; // 执⾏查询操作(有参数)
 Integer total = jdbcTemplate.queryForObject(sql, Integer.class, 1); System.out.println("总记录数:" + total);

 }

}

2.6.3.2. 简单封装

public class SpringJdbcTest02 {

 private JdbcTemplate jdbcTemplate;

 @Before

 public void init() {

 // 得到Spring上下⽂环境
 ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");  // 得到模板类 JdbcTemplate对象
 jdbcTemplate = (JdbcTemplate) ac.getBean("jdbcTemplate");
 }

 @Test

 public void testQueryCount() {

 // 定义sql语句

 String sql = "select count(1) from tb_account";

 // 执⾏查询操作(⽆参数)
 Integer total= jdbcTemplate.queryForObject(sql, Integer.class); System.out.println("总记录数:" + total);

 }

 @Test

 public void testQueryCountByUserId() {

 // 定义sql语句
 String sql = " select count(1) from tb_account where user_id = ?"; // 执⾏查询操作(有参数)
 Integer total = jdbcTemplate.queryForObject(sql, Integer.class, 1); System.out.println("总记录数:" + total);

 }

}

2.6.3.3. 注解封装

@RunWith

         就是⼀个运⾏器

         @RunWith(JUnit4.class) 就是指⽤JUnit4来运⾏
         @RunWith(SpringJUnit4ClassRunner.class) 让测试运⾏于Spring测试环境@ContextConfiguration

         Spring整合JUnit4测试时,使⽤注解引⼊多个配置⽂件
         @ContextConfiguration(Locations="classpathapplicationContext.xml")  
         @ContextConfiguration(locations = {"classpath:spring.xml", "classpath:bean.xml"})

@RunWith(SpringJUnit4ClassRunner.class) // junit测试加到spring环境中
@ContextConfiguration(locations = {"classpath:spring.xml"}) // 设置要加载的资源⽂件public class SpringJdbcTest03 {

 @Resource

 private JdbcTemplate jdbcTemplate;

 @Test

 public void testQueryCount() {

 // 定义sql语句

 String sql = "select count(1) from tb_account";

 // 执⾏查询操作(⽆参数)
 Integer total= jdbcTemplate.queryForObject(sql, Integer.class); System.out.println("总记录数:" + total);

 }

}

2.6.3.4. 通⽤封装

1.  定义⼀个⽗类,设置通⽤的配置信息

/**

 * 通⽤的测试环境,需要使⽤环境的直接继承类即可

 */
@RunWith(SpringJUnit4ClassRunner.class) // junit测试加到spring环境中
@ContextConfiguration(locations = {"classpath:spring.xml"}) // 设置要加载的资源⽂件public class BaseTest {

}

2.  继承通⽤的测试类

public class SpringJdbcTest04 extends BaseTest {

 @Resource

 private JdbcTemplate jdbcTemplate;

 @Test

 public void testQueryCount() {

 // 定义sql语句

 String sql = "select count(1) from tb_account";

 // 执⾏查询操作(⽆参数)
 Integer total= jdbcTemplate.queryForObject(sql, Integer.class); System.out.println("总记录数:" + total);

 }        

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值