Java的Spring框架中DAO數(shù)據(jù)訪問對象的使用示例
Spring DAO之JDBC
Spring提供的DAO(數(shù)據(jù)訪問對象)支持主要的目的是便于以標(biāo)準(zhǔn)的方式使用不同的數(shù)據(jù)訪問技術(shù), 如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在這些持久化技術(shù)間切換, 而且讓你在編碼的時(shí)候不用考慮處理各種技術(shù)中特定的異常。
為了便于以一種一致的方式使用各種數(shù)據(jù)訪問技術(shù),如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO類供你擴(kuò)展。這些抽象類提供了一些方法,通過它們你可以 獲得與你當(dāng)前使用的數(shù)據(jù)訪問技術(shù)相關(guān)的數(shù)據(jù)源和其他配置信息。
Dao支持類:
JdbcDaoSupport - JDBC數(shù)據(jù)訪問對象的基類。 需要一個(gè)DataSource,同時(shí)為子類提供 JdbcTemplate。
HibernateDaoSupport - Hibernate數(shù)據(jù)訪問對象的基類。 需要一個(gè)SessionFactory,同時(shí)為子類提供 HibernateTemplate。也可以選擇直接通過 提供一個(gè)HibernateTemplate來初始化, 這樣就可以重用后者的設(shè)置,例如SessionFactory, flush模式,異常翻譯器(exception translator)等等。
JdoDaoSupport - JDO數(shù)據(jù)訪問對象的基類。 需要設(shè)置一個(gè)PersistenceManagerFactory, 同時(shí)為子類提供JdoTemplate。
JpaDaoSupport - JPA數(shù)據(jù)訪問對象的基類。 需要一個(gè)EntityManagerFactory,同時(shí) 為子類提供JpaTemplate。
本節(jié)主要討論Sping對JdbcDaoSupport的支持。
下面是個(gè)例子:
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,提供了數(shù)據(jù)源注入
*/
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實(shí)現(xiàn)
*/
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());
}
}
運(yùn)行結(jié)果:
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數(shù)據(jù)訪問對象的基類。 需要一個(gè)SessionFactory,同時(shí)為子類提供 HibernateTemplate。也可以選擇直接通過 提供一個(gè)HibernateTemplate來初始化, 這樣就可以重用后者的設(shè)置,例如SessionFactory, flush模式,異常翻譯器(exception translator)等等。
本節(jié)主要討論Sping對HibernateTemplate的支持。
下面是個(gè)例子:
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實(shí)體類
*/
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實(shí)現(xiàn)
*/
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());
}
}
運(yùn)行結(jié)果:
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
相關(guān)文章
Spring-Smart-DI 動態(tài)切換實(shí)現(xiàn)類的步驟
文章介紹了如何使用spring-smart-di的@AutowiredProxySPI注解來實(shí)現(xiàn)動態(tài)切換服務(wù)提供商的功能,通過配置點(diǎn)和代理對象,實(shí)現(xiàn)動態(tài)切換而無需重啟服務(wù),感興趣的朋友一起看看吧2025-03-03
Spring Boot 項(xiàng)目啟動失敗的解決方案
這篇文章主要介紹了Spring Boot 項(xiàng)目啟動失敗的解決方案,幫助大家更好的理解和學(xué)習(xí)使用Spring Boot,感興趣的朋友可以了解下2021-03-03
JavaFX實(shí)現(xiàn)拖拽結(jié)點(diǎn)效果
這篇文章主要為大家詳細(xì)介紹了JavaFX實(shí)現(xiàn)拖拽結(jié)點(diǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
解析XML文件時(shí)的嵌套異常SAXParseException問題
這篇文章主要介紹了解析XML文件時(shí)的嵌套異常SAXParseException問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Java實(shí)現(xiàn)Timer的定時(shí)調(diào)度函數(shù)schedule的四種用法
本文主要介紹了Java實(shí)現(xiàn)Timer的定時(shí)調(diào)度函數(shù)schedule的四種用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
詳解Intellij IDEA中.properties文件中文顯示亂碼問題的解決
這篇文章主要介紹了詳解Intellij IDEA中.properties文件中文顯示亂碼問題的解決,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
SpringBoot中的application.properties無法加載問題定位技巧
這篇文章主要介紹了SpringBoot中的application.properties無法加載問題定位技巧,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
在IDEA中如何設(shè)置最多顯示文件標(biāo)簽個(gè)數(shù)
在使用IDEA進(jìn)行編程時(shí),可能會同時(shí)打開多個(gè)文件,當(dāng)文件過多時(shí),文件標(biāo)簽會占據(jù)大部分的IDEA界面,影響我們的編程效率,因此,我們可以通過設(shè)置IDEA的文件標(biāo)簽顯示個(gè)數(shù),來優(yōu)化我們的編程環(huán)境,具體的設(shè)置方法如下2024-10-10

