Spring-基础知识二

9.Spring JdbcTemplate的使用

Spring对不同持久化技术的支持Spring为各种支持的持久化技术都提供了简单操作的模板和回调

ORM持久化技术模板类
JDBCorg.springframework.jdbc.core.JdbcTemplate
Hibernate5.0org.springframework.orm.hibernate5.HibernateTemplate
IBatis(MyBatis)org.springframework.orm.ibatis.SqlMapClientTemplate
JPAorg.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中注入JdbcTemplateSpring为每一个持久化技术都提供了支持类如图
在这里插入图片描述
此处我们使用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 JDBCiBatis进行持久化数据时使用
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 事务定义信息

该接口主要提供的方法

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring