Spring 学习笔记 Part09
1. Spring提供的操作模板类
操作关系型数据的:JdbcTemplate、HibernateTemplate
操作 nosql 数据库的:RedisTemplate
操作消息队列的:JmsTemplate
我们今天的主角是 JdbcTemplate,它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。
//JdbcTemplate的源码
public JdbcTemplate() {
}
public JdbcTemplate(DataSource dataSource) {
setDataSource(dataSource);
afterPropertiesSet();
}
public JdbcTemplate(DataSource dataSource, boolean lazyInit) {
setDataSource(dataSource);
setLazyInit(lazyInit);
afterPropertiesSet();
}
除了默认构造函数之外,都需要提供一个数据源。既然有set方法,依据我们之前学过的依赖注入,我们可以
在配置文件中配置这些对象。
2. JdbcTemplate配置
首先导入JdbcTmplate的坐标(两个都是JdbcTemplate)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
再导入 Spring 和 数据库连接器的坐标(还需要c3p0或druid连接池的坐标,这里就不做阐述)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
XML方式配置
xml里:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///springdemo09"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
Dao里:
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
但是如果Dao变多时,每个Dao都有上面的代码,重复性太高了,此时我们可以让Dao继承 JdbcDaoSupport类。
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
}
JdbcDaoSupport :JdbcDaoSupport是 spring 框架为我们提供的一个类,该类中定义了一个 JdbcTemplate 对象,我们可以直接获取使用。
//super.getgetJdbcTemplate()即可获取到jdbctemplate对象
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
@Override
public void updateAccount(Account account) {
getJdbcTemplate().update("update account set money = ? where id = ? ",account.getMoney(),account.getId());
}
}
但是要想创建该对象,需要为其提供一个数据源。
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
<!-- 注入 dataSource -->
<property name="dataSource" ref="dataSource"></property>
</bean>
原理:以下是JdbcDaoSupport源码,它提供了两个set注入方法,可以直接注入JdbcTemplate,也可以通过只注入DataSource数据源,由系统自动创建一个JdbcTemplate。所以要想创建JdbcTemplate对象,为其提供一个数据源即可啦。
public abstract class JdbcDaoSupport extends DaoSupport {
//定义对象
private JdbcTemplate jdbcTemplate;
//set 方法注入数据源,判断是否注入了,注入了就创建 JdbcTemplate
public final void setDataSource(DataSource dataSource) {
if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
//如果提供了数据源就创建 JdbcTemplate
this.jdbcTemplate = createJdbcTemplate(dataSource);
initTemplateConfig();
}
//使用数据源创建 JdcbTemplate
protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
//当然,我们也可以通过注入 JdbcTemplate 对象
public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
initTemplateConfig();
}
//使用 getJdbcTmeplate 方法获取操作模板对象
public final JdbcTemplate getJdbcTemplate() {
return this.jdbcTemplate;
}
}
注意:让Dao类继承JdbcDaoSupport类来优化重复代码的方式,只能用于基于XML的方式,注解不可使用。原始的方法,也就是在Dao类中定义JdbcTemplate的方式,才都适用于XML和注解。
3. JdbcTemplate的使用
//从IoC容器中获取JdbcTemplate
JdbcTemplate template = (JdbcTemplate) ac.getBean("jdbcTemplate");
1.增删改:
template.update( String sql , Object.. args )
参数:
字符串类型的sql语句
占位符中的参数(可变长参数)
2.查询所有:
template.query( String sql , new BeanPropertyRowMapper<E>(E.class) , Object.. args )
参数:
字符串类型的sql语句
泛型E写入自建对象的类名,BeanPropertyRowMapper会为我们自动封装好该对象
占位符中的参数(可变长参数)
3.查询一行
template.queryForObject( String sql , E.class , Object.. args )
参数:
字符串类型的sql语句
查询返回值的字节码文件,若是自建对象需用new BeanPropertyRowMapper<E>(E.class)来自动封装
占位符中的参数(可变长参数)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84496.html