Spring使用HibernateDaoSupport、HibernateTemplate和JdbcTemplate实现CURD

来源:互联网 发布:手机淘宝里的兼职赚钱 编辑:程序博客网 时间:2024/05/22 01:31

spring提供两种方式操作数据库,一种就是jdbc另一种就是hibernate。

而Hibernate又分为两种方式 HibernateDaoSupport和HibernateTemplate(下文简写hds和ht)

  • HibernateTemplate

没有HibernateDaoSupport的情况下,如果dao层想要操作数据库就需要dao类有HibernateTemplate成员对象和HibernateTemplate的setter方法,当然在变量上使用注解可以省略setter方法,然后在配置文件中向dao类注入ht,然而使用ht前需要先向ht中注入sessionFactory。

/***  * hibernateTemplate的转配模式  */  public class CustomerDaoImpl implements CustomerDao {      // 设置hibernateTemplate属性      private HibernateTemplate hibernateTemplate;      // 必须设置set方法      public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {          this.hibernateTemplate = hibernateTemplate;      }      // 插入方法      @Override      public void insert(Customer entity) {          hibernateTemplate.save(entity);      }      // 删除方法(删除实体对象)      @Override      public void delete(Customer entity) {          hibernateTemplate.delete(entity);      }      // 删除方法,按id删除      @Override      public void deleteById(Serializable id) {          hibernateTemplate.delete(this.selectById(id));      }      // 查询所有记录      @Override      public List<Customer> selectAll() {          // TODO Auto-generated method stub          List<Customer> entities = hibernateTemplate.find("from Customer");          return entities;      }      // 按照id查找记录      @Override      public Customer selectById(Serializable id) {          // TODO Auto-generated method stub          List<Customer> entitise = hibernateTemplate                  .find("from Customer where id=" + id);          if (entitise.size() > 0) {              Customer entity = entitise.get(0);              return entity;          }          return null;      }      // 更新方法      @Override      public void update(Customer entity) {          // TODO Auto-generated method stub          hibernateTemplate.update(entity);      }  }  

XML相关配置如下:

<context:property-placeholder location="jdbc.properties" />  <!-- c3p0数据源 -->  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">      <!-- 驱动程序 -->      <property name="driverClass">          <value>${jdbc.driverClass}</value>      </property>      <!-- 连接的url地址 -->      <property name="jdbcUrl">          <value>${jdbc.url}</value>      </property>      <!-- 连接的用户名 -->      <property name="user">          <value>${jdbc.user}</value>      </property>      <!-- 连接的密码 -->      <property name="password">          <value>${jdbc.password}</value>      </property>      <!-- 最大池数 -->      <property name="maxPoolSize">          <value>${c3p0.pool.max}</value>      </property>      <!-- 最小池数 -->      <property name="minPoolSize">          <value>${c3p0.pool.min}</value>      </property>      <!-- 默认初始化的池数 -->      <property name="initialPoolSize">          <value>${c3p0.pool.init}</value>      </property>  </bean>  <bean id="sessionFactory"     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">     <!-- 设置数据源 -->     <property name="dataSource" ref="dataSource" />     <!-- 属性设置 -->     <property name="hibernateProperties">         <props>             <prop key="hibernate.show_sql">${hibernate.show_sql}           </prop>             <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>             </props>      </property>      <!-- 映射文件配置 -->      <property name="mappingResources">          <list>              <value>cn/csdn/domain/Customer.hbm.xml</value>          </list>  </property>  </bean>  <!-- hibernate模板 -->  <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">      <property name="sessionFactory" ref="sessionFactory" />  </bean><!-- dao的操作的bean -->  <bean id="customerDaoImpl" class="cn.csdn.dao.CustomerDaoImpl">      <!-- 注入依赖模板 -->      <property name="hibernateTemplate" ref="hibernateTemplate" />  </bean>  
  • HibernateDaoSupport

使用HibernateDaoSupport的情况:dao类继承HibernateDaoSupport后就只需向dao类中注入sessionFactory, hds会判断如何hibernateTemplate属性为空,就使用注入的sessionFactory创建一个HibernateTemplate 然后通过getHibernateTemplate()方法获取HibernamteTemplate,使用HibernaTemplate的方法操作数据库。

  • JdbcTemplate

这种方法适合那些不喜欢hibernate的save,delete等方法,喜欢自己写。有时候jdbcTemplate查询的效率会很高。这可能是跟jdbc有关吧。

public class JdbcTemplateCreate {      //获取数据源(设置为static 是因为该jdbc多次被调用)      static JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());      public static void main(String[] args) {          User user = new User();           user.setId(10);          user  = query(8);          if (user == null) {              System.out.println("查询失败");          }else {              System.out.println("查询成功");          }      }      //插入,增加      public static void insert(User user) {          String sql = "insert into user(name,birthday,money)values(?,?,?)";          Object args[] = {user.getName(),user.getBirthday(),user.getMoney()};          int temp = jdbc.update(sql, args);          if (temp > 0) {              System.out.println("插入成功!");          }else{              System.out.println("插入失败");          }      }      //删除      public static void delete(int id) {          String sql = "delete from user where id = ?";          Object args[] = new Object[]{id};          int temp = jdbc.update(sql,args);          if (temp > 0) {              System.out.println("删除成功");          }else {              System.out.println("删除失败");          }      }      //更新      public static void update(User user) {          String sql = "update user set name = ? where id = ?";          Object args[] = new Object[]{user.getName(),user.getId()};          int temp = jdbc.update(sql,args);          if (temp > 0) {              System.out.println("更新成功");          }else {              System.out.println("更新失败");          }      }      //查询      public static User query(int id) {          String sql = "select * from user where id = ?";          Object args[] = new Object[]{id};          //使用spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应,可以使用BeanPropertyRowMapper。注意:自动绑定,需要列名称和Java实体类名字一致        Object  user = jdbc.queryForObject(sql,args,new BeanPropertyRowMapper(User.class));          return (User)user;      }  }  

XML配置如下:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">   <property name="dataSource">    <ref bean="dataSource" />   </property></bean>

在类中set方法JdbTemplate就可以了,spring中的配置跟sessionFactory基本一样。个人来说还是喜欢JdbTemplate,原因一方面是能熟悉数据库语言,另一方面能快速注入配置。

阅读全文
0 0