Spring----整合JDBC / Hibernate-----增删改查

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());
  }
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值