一。Spring配置数据源
第一步:在根目录下配置jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3307/myhibernate?useUnicode=true&&characterEncoding=UTF8
jdbc.username=root
jdbc.password=a617475430
第二步:在applicationContext.xml下配置数据源
<!-- 用来解析一个Property文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<!-- 去解析根目录(classpath)下的一个叫做jdbc.properties的文件 -->
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password"></property>
</bean>
【结论】:
这样子配置后,我们就可以在页面获取数据源了
public void testDataSource(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource=(DataSource) context.getBean("dataSource");
System.out.println(dataSource);
}
在这里我们又一次加强了面向接口编程的概念,因为我们不仅可以配置dbcp数据源,也可以配置c3p0数据源。他们都实现了Sun公司提供的DataSource接口。
二。Spring整合JDBC
Spring整合JDBC,那么当然使用的是模板,什么是模板,就是动态参数+静态代码。动态参数当然就是连接数据库的一些信息,比如连接什么数据库,用户是什么,sql语句也是动态的。 静态代码是jdbc固定的语法规则,获取connection,创建Statement或者PrepareStatement,什么的。在使用Spring给我们提供的JDBC模板之前,我们先自定JDBC模板
2.1 自定义JDBC模板
第一步:创建核心模板类
仔细体会这里,这里就运用了面向接口编程
public class myJDBCTemplate {
private DataSource dataSource;
public myJDBCTemplate(){} //setter注入
public myJDBCTemplate(DataSource dataSource){ //构造函数注入
this.dataSource=dataSource;
}
public void insert(String sql){
try {
//具体的jdbc操作
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//重点
getter and setter...
}
第二步:继承自定义模板,开始使用
public class PersonDao extends myJDBCTemplate{
public void savePerson(String sql){
this.insert(sql);
}
}
第三步:在Spring容器中配置
这里的形式有很多,先看第一种配置形式:
<!-- 上面了配置了数据源 -->
<bean id="personDao" class="com.dao.PersonDao">
<!-- 因为我们继承了模板,自然继承了模板方法setter,所以我们才能进行下面的DI -->
<property name="dataSource" ref="dataSource"></property>
</bean>
第二种配置形式:把我们的自定义模板放入Spring容器中,进行DI。然后配置我们的dao时,添加parent属性即可
<bean id="module" class="com.jdbc.myJDBCTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="personDao" class="com.dao.PersonDao" parent="module">
</bean>
2.2 Spring提供的模板
先看下Springt提供的JDBC模板的类结构
通过类结构图,看出最终执行数据操作的是JdbcTemplate,因为最根本的注入就是注入到了JdbcTemplate。JdbcTemplate本身给我们提供了两种注入方式,构造器和setter方法。这就是Sprint提供的JDBC模板,用来操作数据库的框架,在这里提下,不论是JDBC还是Hibernate,Spring提供的操作数据库的模板都是这样的类结构。
Spring提供的Hibernate模板类结构
2.3 使用Spring提供JDBC模板
第一步:直接继承Spring提供给我们的模板就可以了
public class PersonDao extends JdbcDaoSupport{
public void savePerson(String sql){
this.getJdbcTemplate().execute(sql);
}
}
第二步:配置Spring容器
<!-- 上面了配置了数据源 -->
<bean id="personDao" class="com.dao.PersonDao">
<property name="dataSource" ref="dataSource"></property>
</bean>
三。Spring整合Hibernate
通过上面的类结构,我们知道了Spring给我们提供了Hibernate模板,我们所要关心的只是注入sessionFactory的问题,在以前,我们使用的是Hibernate实现的SessionFactory。但这个实现类没有提供任何注入数据源的方式。所以Spring给我们提供了另一个SessionFactory实现类-LocalSessionFactoryBean
第一步:Spring配置文件引入SessionFactory的两种方式
方式一:
<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
方式二:
使用这种方式就不需要hibernate.cfg.xml的配置文件了
<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 映射文件所在的路径 -->
<property name="mappingDirectoryLocations">
<list>
<!-- spring容器会去该包以及其子包下搜索所有的映射文件 -->
<value>spring/domain</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
第二步:使用HibernateDaoSupport
public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao {
@Override
public void savePerson(Person person) {
// TODO Auto-generated method stub
this.getHibernateTemplate().save(person);
}
}
四。HibernateTemplate深入研究-回调
很明显,HibernateTemplate隐藏了Spring用session做具体动作的行为,我们只需要使用Spring提供给我们的HibernateTemplate模板就可以了。我们只需要给HibernateTemplate提供要操作的持久化对象与HQL语句即可。如果此时你需要Spring容器去执行你写的具体session操作,那我们就需要回调这个概念,Spring哦容器给我们提供下面这个类。
HibernateCallback是Spring为程序员提供的回调接口,其中session是操作所处于的当前session,我们给HibernateTemplate赋值的时候,HibernateTemplate在调用真正的数据操作方法时,给这个真正操作方法传入了一个HibernateCallback。然后由Spring容器的doExecute(HibernateCallback callback..)方法来执行数据操作,现在把HibernateCallback提供给我们,让我们可以指定Spring容器的具体操作。
public interface HibernateCallback {
Object doInHibernate(Session session) throws HibernateException, SQLException;
}