spring对数据库访问的支持:
1、对DAO提供以下支持:
一致的异常处理DataAccessException
一致的DAO抽象类DaoSupport、Template
2、整合JDBC(
定义数据库连接池dataSource;
不继承JdbcDaoSupport类时,手动在xml文件中将dataSource属性引入到访问数据库bean组件,在DaoImp类中给JdbcTemplate注入dataSource后使用;
继承JdbcDaoSupport类,可直接使用JdbcTemplate)
使用的API:
jdbcDaoSupport------用于提供编写DAO组件的支持
jdbcTemplate--------用于增删改查操作
update()------------增删改操作
query()、queryForObject()、queryForInt等-----查询操作
execute()-----------其他语句,如:建表、修改表结构语句
其他操作------------批处理、返回自动增长主键值
XML配置:
定义连接池<bean id="dataSource"/>-------->将dataSource注入给所有DAO组件
例子:
---》导入架包:commons-dbcp.jar连接池、commons-collections.jar、commons-pool.jar(连接池组件:管理connection对象的创建、销毁和控制其数量)
---》创建数据库
---》在applicationContext.xml中配置连接池(dataSource以<bean>组件的形式配置):包括连接池的定义 + 属性注入到调用bean组件
注意:只能写dataSource ,别的名字不行
<bean id="jdbcUserDao" class="JdbcUserDao">
<property name="dataSource" ref="dataSource"> </property>
</bean>
---》接口UserDao的实现类(此类需要访问数据库)中注入dataSource连接池:
1、不继承JdbcDaoSupport类的实现方法(用set方法注入dataSource):
public class JdbcUserDao implements UserDao{
private JdbcTemplate template;
public void setDataSource(DataSource dataSource){
template = new JdbcTemplate(dataSource);
}
public void save(User user){
String sql="insert into d_user(email,name,password,code,time,ip) values(?,?,?,?,?,?)";
template.update(sql,new Object[]{user.getEmail(),....user.getIp()});
}
.
.
.
}
<bean id="jdbcUserDao" class="JdbcUserDao">
<property name="dataSource" ref="dataSource"> </property>
</bean>
2、继承JdbcDaoSupport类的实现方法(Spring框架可以帮助我们完成dataSource的注入):
public class JdbcUserDao extends JdbcDaoSupport implements UserDao{
public void save(User user){
String sql="insert into d_user(email,name,password,code,time,ip) values(?,?,?,?,?,?)";
this.getJdbcTemplate().update(sql,new Object[]{user.getEmail(),....user.getIp()});
}
public void update(User user){
String sql="update d_user set email=?,name=?,password=?,code=?,time=?,ip=? where id=?";
this.getJdbcTemplate().update(sql,new Object[]{user.getEmail(),....user.getIp()});
}
public void deleteById(int id){
String sql="delete from d_user where id=?";
this.getJdbcTemplate().update(sql,new Object[]{id});
}
public User findById(int id){
String sql="select * from d_user where id=?";
return (User)this.getJdbcTemplate().queryForObject(sql,new Object[]{id},new UserMapper());
}
public List<User> findAll(){
String sql="select * from d_user";
List list=this.getJdbcTemplate().query(sql,new UserMapper());
return list;
}
public int count(){
String sql="select count(*) from d_user";
return this.getJdbcTemplate().queryForInt(sql);
}
}
//查询方法需要额外定义映射类:完成结果集字段值与User属性之间的映射关系
//UserMapper实现RowMapper接口,覆盖方法mapRow完成从结果集中解析出结果做操作
public class UserMapper implements RowMapper{
public Object mapRow(ResultSet rs, int index) throws SQLException{
User user = new User();
user.setId(rs.getInt("id"));
user.setEmail(rs.getString("email"));
user.setName(rs.getString("name"));
.
.
.
return user;
}
//改进版:
private static final String ID="id";
public Object mapRow(ResultSet rs, int index) throws SQLException{
User user = new User();
user.setId(rs.getInt(ID));
if(rs.getString("email") != null){ //为防止rs.getString(XXX)取出null值后直接放入user,加if判断
user.setEmail(rs.getString("email"));
}
user.setName(rs.getString("name"));
.
.
.
return user;
}
}
3、整合Hibernate
(定义数据库连接池dataSource;定义sessionFactory;将dataSource、表映射javaBean.xml、hibernateProperties引入到sessionFactory中;
不继承HibernateDaoSupport类时,手动在xml文件中将sessionFactory属性引入到访问数据库bean组件,在DaoImp类中给HibernateTemplate注入sessionFactory后使用;
继承HibernateDaoSupport类,可直接使用HibernateTemplate)
使用的API:
HibernateDaoSupport------提供编写DAO组件的支持
HibernateTemplate--------提供了增删改查操作
save()-------------------保存
update()-----------------更新
delete()-----------------删除
find()-------------------查询
使用HibernateDaoSupport提供的this.getSession()获取Session对象-------分页查询
XML配置:
首先配置连接池dataSource----->配置SessionFactory------>将SessionFactory注入给所有DAO组件
例子:
------》倒入Hibernate架包(框架整合时,会遇到jar包冲突的问题;Spring对Hibernate的整合是在JDBC之上的)
------》配置数据源dataSource:定义dataSource <bean>组件
------》配置SessionFactory:定义sessionFactory <bean>组件;
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property> ----引入连接池属性
<property name="mappingResources"> ----引入映射文件属性
<list>
<value>...User.hbm.xml </value>
</list>
</property>
<property name="hibernateProperties"> ----引入配置Hibernate配置
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
------》配置映射文件 + 映射文件对应的javaBean类(Hibernate的标配)
------》接口UserDao的实现类(此类需要访问数据库)中:
1、不继承HibernateDaoSupport类的实现方法(用set方法注入SessionFactory):
public class JDBCUserDao implements UserDao{
private HibernateTemplate template;
public void setSessionFactory(SessionFactory sessionFactory){
template = new HibernateTemplate(sessionFactory);
}
public void save(User user){
template.save(user);
}
.
.
.
}
<bean id="hibernateUserDao" class="HibernateUserDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
2、继承HibernateDaoSupport类的实现方法(Spring框架可以帮助我们完成SessionFactory的注入):
public class HibernateUserDao extends HibernateDaoSupport implements UserDao{
public void save(User user){
this.getHibernateTemplate().save(user);
}
public void update(User user){
this.getHibernateTemplate().update(user);
}
public void deleteById(int id){
User user = findById(id);
this.getHibernateTemplate().delete(user);
}
public User findById(int id){
String hql="from d_user where id=?";
List list=this.getHibernateTemplate().find(hql, new Object[]{id});
if(!list.isEmpty()){
return (User)list.get(0);
}
return null;
}
public List<User> findAll(){
String hql="from d_user";
return this.getHibernateTemplate().find(hql);
}
public int count(){
String hql="select count(*) from d_user";
List list=this.getHibernateTemplate().find(hql);
return Integer.valueOf(list.get(0).toString());
}
}