Spring
- 9.Spring JdbcTemplate的使用
- 9.1 JdbcTemplate入门
- 9.1.1 需要的包
- 9.1.2 代码测试
- 9.2 将数据源和jdbcTemplate交给Spring来管理
- 9.2.1 druid连接池
- 9.2.2 使用外部文件配置数据连接信息
- 9.3 基于JdbcTemplate实现DAO
- 9.Spring的事务管理机制
- 9.1 PlatformTransactionManager 事务管理器
- 9.2 TransactionDefinition 事务定义信息
9.Spring JdbcTemplate的使用
Spring对不同持久化技术的支持,Spring为各种支持的持久化技术,都提供了简单操作的模板和回调
ORM持久化技术 | 模板类 |
---|---|
JDBC | org.springframework.jdbc.core.JdbcTemplate |
Hibernate5.0 | org.springframework.orm.hibernate5.HibernateTemplate |
IBatis(MyBatis) | org.springframework.orm.ibatis.SqlMapClientTemplate |
JPA | org.springframework.orm.jpa.JpaTemplate |
9.1 JdbcTemplate入门
9.1.1 需要的包
<dependencies>
<!-- unit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<!-- jdbc包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!-- 事务相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
</dependencies>
9.1.2 代码测试
public class JdbcTemplateTest {
@Test
public void test(){
//目标:使用jdbctemplate执行一段sql
//1.构建数据源
//spring内置了一个数据源
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/my_database");
dataSource.setUsername("root");
dataSource.setPassword("root");
//2.创建jdbctemplate实例
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//3.执行sql,创建表test001
jdbcTemplate.execute("create table test001(id int,name varchar(20))");
}
}
9.2 将数据源和jdbcTemplate交给Spring来管理
9.2.1 druid连接池
- DriverManagerDataSource(Spring内置数据源)
- DBCP连接池
- C3P0连接池
- druid连接池
此处我们使用druid连接池
<!-- druid连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/my_database"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
9.2.2 使用外部文件配置数据连接信息
druid.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/my_database
jdbc.username=root
jdbc.password=root
<!-- druid连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
9.3 基于JdbcTemplate实现DAO
为了方便Dao中注入JdbcTemplate,Spring为每一个持久化技术都提供了支持类,如图
此处我们使用JDBC的支持类:JdbcDAOSupport
操作方式分为
- 1.编写dao类,并继承JdbcDAOSupport
public class BookDao extends JdbcDaoSupport {
//保存图书
public void save(Book book) {
String sql = "insert into book values(null,?,?)";
// 调用jdbctemplate
// jdbcTemplate.update(sql, book.getName(),book.getPrice());
super.getJdbcTemplate().update(sql, book.getName(), book.getPrice());
}
// 更新
public void update(Book book) {
String sql = "update book set name =? ,price =? where id =?";
super.getJdbcTemplate().update(sql, book.getName(), book.getPrice(), book.getId());
}
// 删除
public void delete(Book book) {
super.getJdbcTemplate().update("delete from book where id =?", book.getId());
}
//根据id查询
public Book findById(Integer id) {
String sql = "select * from book where id = ?";
return super.getJdbcTemplate().queryForObject(sql, BeanPropertyRowMapper.newInstance(Book.class), id);
}
//查询所有
public List<Book> findAll() {
String sql = "select * from book";
return super.getJdbcTemplate().query(sql, BeanPropertyRowMapper.newInstance(Book.class));
}
//条件查询: 根据图书名称模糊查询信息
public List<Book> findByNameLike(String name) {
String sql = "select * from book where name like ?";
return super.getJdbcTemplate().query(sql, BeanPropertyRowMapper.newInstance(Book.class), "%" + name + "%");
}
}
- 2.在Spring配置文件中,将jdbcTemplate注入到dao类(或者直接注入数据源)
<!-- jdbctemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置dao,注入jdbctemplate -->
<bean id="bookDao" class="cn.itcast.spring.dao.BookDao">
<!-- 方案一:在BookDao中提供jdbcTempate属性,通过set方法注入 jdbcTemplate-->
<!-- <property name="jdbcTemplate" ref="jdbcTemplate"/> -->
<!-- 方案二:BookDao类继承JdbcDaoSupport,直接注入数据源,就拥有了jdbctempate对象 -->
<property name="dataSource" ref="dataSource"/>
</bean>
9.Spring的事务管理机制
Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:
- PlatformTransactionManager:事务管理器—主要用于平台相关事务的管理
- TransactionDefinition: 事务定义信息(隔离、传播、超时、只读)—通过配置如何进行事务管理。
- TransactionStatus:事务具体运行状态—事务管理过程中,每个时间点事务的状态信息。
9.1 PlatformTransactionManager 事务管理器
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现:
事务 | 说明 |
---|---|
org.springframework.jdbc.datasource.DataSourceTransactionManager | 使用Spring JDBC或iBatis进行持久化数据时使用 |
org.springframework.orm.hibernate5.HibernateTransactionManager | 使用Hibernate5.0版本进行持久化数据时使用 |
org.springframework.orm.jpa.JpaTransactionManager | 使用JPA进行持久化时使用 |
org.springframework.jdo.JdoTransactionManager | 当持久化机制是Jdo时使用 |
org.springframework.transaction.jta.JtaTransactionManager | 使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用 |
DataSourceTransactionManager针对JdbcTemplate、MyBatis 事务控制 ,使用Connection(连接)进行事务控制 :
- 开启事务 connection.setAutoCommit(false);
- 提交事务 connection.commit();
- 回滚事务 connection.rollback();
用户根据选择和使用的持久层技术,来选择对应的事务管理器
9.2 TransactionDefinition 事务定义信息
该接口主要提供的方法: