Java的Spring框架中DAO数据访问对象的使用示例

Spring DAO之JDBC
 
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术, 如JDBC,Hibernate或者JDO等。它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常。
为了便于以一种一致的方式使用各种数据访问技术,如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,通过它们你可以 获得与你当前使用的数据访问技术相关的数据源和其他配置信息。
Dao支持类:
JdbcDaoSupport - JDBC数据访问对象的基类。 需要一个DataSource,同时为子类提供 JdbcTemplate。
HibernateDaoSupport - Hibernate数据访问对象的基类。 需要一个SessionFactory,同时为子类提供 HibernateTemplate。也可以选择直接通过 提供一个HibernateTemplate来初始化, 这样就可以重用后者的设置,例如SessionFactory, flush模式,异常翻译器(exception translator)等等。
JdoDaoSupport - JDO数据访问对象的基类。 需要设置一个PersistenceManagerFactory, 同时为子类提供JdoTemplate。 
JpaDaoSupport - JPA数据访问对象的基类。 需要一个EntityManagerFactory,同时 为子类提供JpaTemplate。 
本节主要讨论Sping对JdbcDaoSupport的支持。
下面是个例子:

drop table if exists user; 

/*==============================================================*/
/* Table: user                         */
/*==============================================================*/
create table user
(
  id          bigint AUTO_INCREMENT not null,
  name         varchar(24),
  age         int,
  primary key (id)
);
public class User {
  private Integer id;
  private String name;
  private Integer age; 

  public Integer getId() {
    return id;
  } 

  public void setId(Integer id) {
    this.id = id;
  } 

  public String getName() {
    return name;
  } 

  public void setName(String name) {
    this.name = name;
  } 

  public Integer getAge() {
    return age;
  } 

  public void setAge(Integer age) {
    this.age = age;
  }
}
/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-4-22 15:34:36<br>
* <b>Note</b>: DAO接口
*/
public interface IUserDAO {
  public void insert(User user); 

  public User find(Integer id);
}

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException; 

/**
* Created by IntelliJ IDEA.<br>
* <b>Note</b>: 基类DAO,提供了数据源注入
*/
public class BaseDAO {
  private DataSource dataSource; 

  public DataSource getDataSource() {
    return dataSource;
  } 

  public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
  } 

  public Connection getConnection() {
    Connection conn = null;
    try {
      conn = dataSource.getConnection();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return conn;
  }
}

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-4-22 15:36:04<br>
* <b>Note</b>: DAO实现
*/
public class UserDAO extends BaseDAO implements IUserDAO { 

  public JdbcTemplate getJdbcTemplate(){
    return new JdbcTemplate(getDataSource());
  }
  public void insert(User user) {
    String name = user.getName();
    int age = user.getAge().intValue(); 

//    jdbcTemplate.update("INSERT INTO user (name,age) "
//        + "VALUES('" + name + "'," + age + ")"); 

    String sql = "insert into user(name,age) values(?,?)";
    getJdbcTemplate().update(sql,new Object[]{name,age});
  } 

  public User find(Integer id) {
    List rows = getJdbcTemplate().queryForList(
        "SELECT * FROM user WHERE id=" + id.intValue()); 

    Iterator it = rows.iterator();
    if (it.hasNext()) {
      Map userMap = (Map) it.next();
      Integer i = new Integer(userMap.get("id").toString());
      String name = userMap.get("name").toString();
      Integer age = new Integer(userMap.get("age").toString()); 

      User user = new User(); 

      user.setId(i);
      user.setName(name);
      user.setAge(age); 

      return user;
    }
    return null;
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans>
  <bean id="dataSource"
     class="org.apache.commons.dbcp.BasicDataSource" singleton="true">
    <property name="driverClassName">
      <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
      <value>jdbc:mysql://localhost:3306/springdb</value>
    </property>
    <property name="username">
      <value>root</value>
    </property>
    <property name="password">
      <value>leizhimin</value>
    </property>
  </bean> 

  <bean id="baseDAO" class="com.lavasoft.springnote.ch05_jdbc03_temp.BaseDAO" abstract="true">
    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>
  </bean> 

  <bean id="userDAO"
     class="com.lavasoft.springnote.ch05_jdbc03_temp.UserDAO" parent="baseDAO">
  </bean> 

</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext; 

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-4-22 15:59:18<br>
* <b>Note</b>: 测试类,客户端
*/
public class SpringDAODemo {
  public static void main(String[] args) {
    ApplicationContext context = new FileSystemXmlApplicationContext("D:\\_spring\\src\\com\\lavasoft\\springnote\\ch05_jdbc03_temp\\bean-jdbc-temp.xml");
    User user = new User();
    user.setName("hahhahah");
    user.setAge(new Integer(22));
    IUserDAO userDAO = (IUserDAO) context.getBean("userDAO");
    userDAO.insert(user);
    user = userDAO.find(new Integer(1));
    System.out.println("name: " + user.getName());
  }
}

运行结果:

log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).
log4j:WARN Please initialize the log4j system properly.
name: jdbctemplate 

Process finished with exit code 0

Spring DAO之Hibernate
 
HibernateDaoSupport - Hibernate数据访问对象的基类。 需要一个SessionFactory,同时为子类提供 HibernateTemplate。也可以选择直接通过 提供一个HibernateTemplate来初始化, 这样就可以重用后者的设置,例如SessionFactory, flush模式,异常翻译器(exception translator)等等。

本节主要讨论Sping对HibernateTemplate的支持。

下面是个例子:

drop table if exists user; 

/*==============================================================*/
/* Table: user                         */
/*==============================================================*/
create table user
(
  id          bigint AUTO_INCREMENT not null,
  name         varchar(24),
  age         int,
  primary key (id)
);
/**
* Created by IntelliJ IDEA.<br>
* <b>Note</b>: Hiberante实体类
*/
public class User {
  private Integer id;
  private String name;
  private Integer age; 

  public Integer getId() {
    return id;
  } 

  public void setId(Integer id) {
    this.id = id;
  } 

  public String getName() {
    return name;
  } 

  public void setName(String name) {
    this.name = name;
  } 

  public Integer getAge() {
    return age;
  } 

  public void setAge(Integer age) {
    this.age = age;
  }
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 

  <class name="com.lavasoft.springnote.ch06_hbm_02deTx.User"
      table="user"> 

    <id name="id" column="id">
      <generator class="native"/>
    </id> 

    <property name="name" column="name"/> 

    <property name="age" column="age"/> 

  </class> 

</hibernate-mapping>
/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-4-23 15:37:43<br>
* <b>Note</b>: DAO接口
*/
public interface IUserDAO {
  public void insert(User user);
  public User find(Integer id);
} 

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate; 

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-4-23 15:15:55<br>
* <b>Note</b>: DAO实现
*/
public class UserDAO implements IUserDAO {
  private HibernateTemplate hibernateTemplate; 

  public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate =new HibernateTemplate(sessionFactory);
  } 

  public void insert(User user) {
    hibernateTemplate.save(user);
    System.out.println("所保存的User对象的ID:"+user.getId());
  } 

  public User find(Integer id) {
    User user =(User) hibernateTemplate.get(User.class, id);
    return user;
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="dataSource"
     class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
      <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
      <value>jdbc:mysql://localhost:3306/springdb</value>
    </property>
    <property name="username">
      <value>root</value>
    </property>
    <property name="password">
      <value>leizhimin</value>
    </property>
  </bean> 

  <bean id="sessionFactory"
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
     destroy-method="close">
    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>
    <property name="mappingResources">
      <list>
        <value>com/lavasoft/springnote/ch06_hbm_02proTx/User.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">
          org.hibernate.dialect.MySQLDialect
        </prop>
      </props>
    </property>
  </bean> 

  <bean id="userDAO" class="com.lavasoft.springnote.ch06_hbm_02proTx.UserDAO">
    <property name="sessionFactory">
      <ref bean="sessionFactory"/>
    </property>
  </bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext; 

/**
* Created by IntelliJ IDEA.<br>
* <b>Note</b>: 测试类、客户端
*/
public class SpringHibernateDemo {
  public static void main(String[] args) {
    ApplicationContext context =new FileSystemXmlApplicationContext("D:\\_spring\\src\\com\\lavasoft\\springnote\\ch06_hbm_02proTx\\bean-hbm_tx.xml"); 

    // 建立DAO物件
    IUserDAO userDAO = (IUserDAO) context.getBean("userDAO"); 

    User user = new User();
    user.setName("caterpillar");
    user.setAge(new Integer(30)); 

    userDAO.insert(user); 

    user = userDAO.find(new Integer(1)); 

    System.out.println("name: " + user.getName());
  }
}

运行结果:

log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).
log4j:WARN Please initialize the log4j system properly.
所保存的User对象的ID:18
name: jdbctemplate 

Process finished with exit code 0
(0)

相关推荐

  • Java之dao模式详解及代码示例

    什么是dao模式? DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作.在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中.用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法.在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储.DAO模式实

  • 基于java中的PO VO DAO BO POJO(详解)

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的ava对象. 最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合PO中应该不包含任何对数据库的操作. 二.VO:value object值对象.通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象可以和表对应也可以不这根据业务的需要 三.DAO:data access object 数据访问对象,此对象用于访问数据库.通常和PO结合使用,DAO中包含了各种

  • Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法

    SqlSessionTemplate SqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用. 当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的.此外,它管理session的生命周期,包

  • 全面了解JAVA_BaseDAO数据处理类

    实例如下: package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BaseDao { private String drive="com.microsoft.sqlserver.jdbc.SQLSer

  • 通过代理类实现java连接数据库(使用dao层操作数据)实例分享

    首先,我们在一个java文件中定义要存储的结构类型: 复制代码 代码如下: import java.util.Date ;/** * * @author Nero */public class Emp {    private int empno ;    private String ename ;    private String job ;    private Date hiredate ;    private float sal ;    public void setEmpno(

  • Java的Spring框架中DAO数据访问对象的使用示例

    Spring DAO之JDBC   Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术, 如JDBC,Hibernate或者JDO等.它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常. 为了便于以一种一致的方式使用各种数据访问技术,如JDBC.JDO和Hibernate, Spring提供了一套抽象DAO类供你扩展.这些抽象类提供了一些方法,通过它们你可以 获得与你当前使用的数据访问技术相关的数据源和其

  • Java的Spring框架中实现发送邮件功能的核心代码示例

    Spring中已经封装了邮件操作类,通过spring配置文件可以便捷地注入到controller.action等地方. 下面是配置: <!-- mail sender --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" p:host="${mail.host}" p:port="${mail.por

  • 详解Java的Spring框架中的事务管理方式

    数据库事务是被当作单个工作单元的操作序列.这些操作要么全部完成或全部不成功.事务管理是面向企业应用程序,以确保数据的完整性和一致性RDBMS中的重要组成部分.事务的概念可以用下面的描述为ACID四个关键属性来描述: 原子性: 一个事务应该被视为单个操作单元表示的操作的任一整个序列是成功的或不成功的. 一致性: 这代表了数据库的参照完整性,在桌等唯一主键的一致性 隔离性: 可能有很多事务处理相同的数据集的同时,每个事务都应由他人隔离,以防止数据损坏. 持久性: 一旦事务完成,本次事务的结果必须作出

  • Java的Spring框架中AOP项目的一般配置和部署教程

    0.关于AOP 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP是OOP的延续. 主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等. 主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过

  • 深入理解Java的Spring框架中的IOC容器

    Spring IOC的原型 spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制. 这样做的好处是什么呢? 当然就是所谓的"解耦"了,可以使得程序的各模块之间的关系更为独立,只需要spring控制这些模块之间的依赖关系并在容器启动和初始化的过程中将依据这些依赖关系创建.管理和维护这些模块就好,如果需要改变模块间的依赖关系的话,甚至都不需要改变程序代码,只需要将

  • php设计模式 DAO(数据访问对象模式)

    复制代码 代码如下: <?php /** * 数据访问对象(Data Access Object) 示例 * * @create_date: 2010-01-04 */ class BaseDAO { var $_db = null; var $_table = null; function BaseDAO($config) { $this->_db = new MysqlDB(); // 这里的不能进行操作 } /** * 获取处理 * * @param array $filter // 过

  • 浅析Java的Spring框架中IOC容器容器的应用

    Spring容器是Spring框架的核心.容器将创建对象,它们连接在一起,配置它们,并从创建到销毁管理他们的整个生命周期.在Spring容器使用依赖注入(DI)来管理组成应用程序的组件.这些对象被称为Spring Beans. 容器获得其上的哪些对象进行实例化,配置和组装通过阅读提供的配置元数据的说明.配置元数据可以通过XML,Java注释或Java代码来表示.下面的图是Spring如何工作的高层次图. Spring IoC容器是利用Java的POJO类和配置元数据的产生完全配置和可执行的系统或

  • 实例讲解Java的Spring框架中的控制反转和依赖注入

    近来总是接触到 IoC(Inversion of Control,控制反转).DI(Dependency Injection,依赖注入)等编程原则或者模式,而这些是著名 Java 框架 Spring.Struts 等的核心所在.针对此查了 Wikipedia 中各个条目,并从图书馆借来相关书籍,阅读后有些理解,现结合书中的讲解以及自己的加工整理如下: eg1 问题描述: 开发一个能够按照不同要求生成Excel或 PDF 格式的报表的系统,例如日报表.月报表等等.   解决方案: 根据"面向接口编

  • 深入解析Java的Spring框架中bean的依赖注入

    每一个基于java的应用程序都有一个共同工作来展示给用户看到的内容作为工作的应用几个对象.当编写一个复杂的Java应用程序,应用程序类应该尽可能独立其他Java类来增加重复使用这些类,并独立于其他类别的测试它们,而这样做单元测试的可能性.依赖注入(或有时称为布线)有助于粘合这些类在一起,同时保持他们的独立. 考虑有其中有一个文本编辑器组件的应用程序,要提供拼写检查.标准的代码将看起来像这样: public class TextEditor { private SpellChecker spell

随机推荐