日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java里的daosupport_HibernateDaoSupport与JdbcDaoSupport

發布時間:2025/1/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java里的daosupport_HibernateDaoSupport与JdbcDaoSupport 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Dao 的支持類可以有好多,如: JdbcDaoSupport , HibernateDaoSupport ,JdoDaoSupport等,下面對最常用的HibernateDaoSupport與JdbcDaoSupport做一小總結:

一、在Spring框架中實現連接數據庫方式:

1、、借助類HibernateDaoSupport的簡約化實現:

借助這個類必須需要HIbernate框架,用到HIbernate里提供的HibernateTemplate模板,從而進行增、刪、改、查操作。

TestA.java:

public class TestA extends HibernateDaoSupport{

public void test(){

HibernateTemplate template = this.getHibernateTemplate();

List list = template.find("from User");

for(int i=0;i

User u = (User)list.get(i);

System.out.println(u.getUserid()+" "+u.getEmail());

}

}

public static void main(String[] args) {

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

TestA t = (TestA)ctx.getBean("testa");

t.test();

}

}

需要在Spring的配置文件applicationContext.xml中控制反轉用到連接數據庫中的類是注入SessionsFactory,如下:

applicationContext.xml:

2、、借助類JdbcDaoSupport的簡約化實現:

借助這個類不需要HIbernate框架,也不需要有ORM的對象關聯映射。但它和HibernateDaoSupport很類似,有JdbcTemplate來實現增、刪、改、查操作。

TestA.java:

public class TestA extends JdbcDaoSupport{

public void test(){

int n = this.getJdbcTemplate().queryForInt("select max(userid) from User");

System.out.println(n);

}

public static void main(String[] args) {

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

TestA ta = (TestA)ctx.getBean("testa");

ta.test();

}

}

需要在Spring的配置文件applicationContext.xml中控制反轉用到連接數據庫中的類是注入DataSource,如下:

applicationContext.xml:

JdbcDaoSupport是JDBC數據訪問對象的超類。它與特定的數據源相關聯。Spring Inversion of Control (IOC)容器或BeanFactory負責獲得相應數據源的配置詳細信息,并將其與JdbcDaoSupport相關聯。這個類最重要的功能就是使子類可以使用JdbcTemplate對象。

?圖2:Spring JDBC框架的主要組件

#p#

JdbcTemplate是Spring JDBC框架中最重要的類。引用文獻中的話:“它簡化了JDBC的使用,有助于避免常見的錯誤。它執行核心JDBC工作流,保留應用代碼以提供SQL和提取結果。”這個類通過執行下面的樣板任務來幫助分離JDBC DAO代碼的靜態部分:

◆從數據源檢索連接。

◆準備合適的聲明對象。

◆執行SQL CRUD操作。

◆遍歷結果集,然后將結果填入標準的collection對象。

◆處理SQLException異常并將其轉換成更加特定于錯誤的異常層次結構。

應用實例:

1.applicationContext.xml配置文件:

class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close">

2.測試類:

package com.lrm.study.springJDBCDao;

import java.util.List;

import java.util.Map;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class SpringJdbcDaoSupportApp extends JdbcDaoSupport{

/**

on May 10, 2010 by lrm

*/

public static void main(String[] args) {

//applicationContext.xml這個文件放到src下,如果報找不到這樣的文件,直接拷貝到web-root下的classes下

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

SpringJdbcDaoSupportApp jdbcDao = (SpringJdbcDaoSupportApp) ctx.getBean("jdbcDao");

String sql = "select t.ftypename from dmis_eqptype t where t.fcategory = '保護'";

List reList = jdbcDao.queryListBySql(sql);

if(reList.size()>0){

for (int i = 0; i < reList.size(); i++) {

String typename = ((Map)reList.get(i))==null?"":((Map)reList.get(i)).get("ftypename").toString();

System.out.println(typename);

}

}

}

public List queryListBySql(String sql){

return this.getJdbcTemplate().queryForList(sql);

}

}

注意:這里需求相關的jar包支持,否則會報錯.commons-dbcp-1.2.1.jar ;commons-pool-1.2.jar ;commons-collections-3.1.jar; spring-1.2.6.jar; spring-aop.jar;ojdbc14.jar

二、編程式事務管理、聲明式事務管理中HibernateDaoSupport與JdbcDaoSupport的應用:

1、編程式事務管理:

1>、JdbcDaoSupport編程式事物管理,必須繼承JdbcDaoSupport類,得到JdbcTemplate從而實現事務管理;

TestA.java:

public class TestA extends JdbcDaoSupport{

public void test(){

PlatformTransactionManager ptm = new DataSourceTransactionManager(this.getDataSource());

TransactionTemplate tst = new TransactionTemplate(ptm);

tst.execute(new TransactionCallback(){

public Object doInTransaction(TransactionStatus status) {

getJdbcTemplate().update("update User set password='1230' where userid='1001'");

getJdbcTemplate().update("update User set?email='liuzheng.666888@163.com'?where userid='100000001'");

getJdbcTemplate().update("update User set phone='phone'");

return null;

}

});

}

public static void main(String[] args) {

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

TestA t = (TestA)ctx.getBean("testa");

t.test();

}

}

需要在Spring的配置文件applicationContext.xml中控制反轉用到連接數據庫中的類是注入DataSource,如下:

applicationContext.xml:

... ...

false

2>、HibernateDaoSupport編程式事物管理,必須繼承HibernateDaoSupport類,得到HibernateTemplate從而實現事務管理;

TestB.java:

public class TestB extends HibernateDaoSupport{

public void test(){

HibernateTransactionManager hm = new HibernateTransactionManager(this.getSessionFactory());

TransactionTemplate ttm = new TransactionTemplate(hm);

ttm.execute(new TransactionCallback(){

public Object doInTransaction(TransactionStatus status) {

User u1 = new User();

u1.setUserid("3001");

u1.setPassword("3001");

getHibernateTemplate().save(u1);

User u2 = new User();

u2.setUserid("3001");

u2.setPassword("3002");

getHibernateTemplate().save(u2);

return null;

}

});

}

public static void main(String[] args) {

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

TestB t = (TestB)ctx.getBean("testb");

t.test();

}

}

需要在Spring的配置文件applicationContext.xml中控制反轉用到連接數據庫中的類是注入SessionsFactory,如下:

applicationContext.xml:

... ...

false

2、聲明式事務管理:

1>、JdbcDaoSupport聲明式樣事物管理,必須繼承JdbcDaoSupport類;

... ....

false

需要在Spring配置文件中配置聲明事務處理,用JdbcDaoSupport提供的DataSourceTransactionManager如下:

PROPAGATION_REQUIRED

IUserDao.java://定義接口

public interface IUserDao {

public void updateUser();

}

UserDao.java:

public class UserDao extends JdbcDaoSupport implements IUserDao{

public void updateUser(){

this.getJdbcTemplate().update("update User set password='password1' where userid='1001'");

this.getJdbcTemplate().update("update User set password='password9999999999999999999999999999999' where userid='1002'");

}

}

TestA.java://調用updateUser()方法

public class{

public void test(){

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

IUserDao u = (IUserDao)ctx.getBean("baseTransactionProxy");

u.updateUser();

}

public static void main(String[] args) {

TestA t = new TestA();

t.test();

}

}

2>、HibernateDaoSupport聲明式事物管理,必須繼承HibernateDaoSupport類;

IUserDao.java://定義接口

public interface IUserDao {

public void updateUser();

}

UserDao.java:

public class UserDao extends HibernateDaoSupport implements IUserDao{

public void updateUser(){

User u1 = new User();

u1.setUserid("1001");

u1.setPassword("5001");

this.getHibernateTemplate().update(u1);

User u2 = new User();

u2.setUserid("1003");

u2.setPassword("20015555555555555555555555555555555555555555555");

this.getHibernateTemplate().update(u2);

}

}

測試:

public class TestA{

public void test(){

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

IUserDao userdao= (IUserDao)ctx.getBean("userproxy");

userdao.updateUser();

}

public static void main(String[] args) {

TestA t = new TestA();

t.test();

}

}

需要在Spring配置文件中配置聲明事務處理,用JdbcDaoSupport提供的HibernateTransactionManager如下:

applicationContext.xml:

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

Spring的JdbcDaoSupport的批量操作

由于數據的批量處理(比如往RDBMS插入幾萬條數據)非常耗資源,因此建議在所有場合能夠借助于JDBC完成,而不要去采用Hibernate API。本文主要圍繞Spring內置的各類JDBC API抽象支持展開的。

1.1.? JdbcTemplate內置的batchUpdate(final String[] sql)

這一方法適合于小批量數據的CUD(增、更新、刪除)操作,而且SQL類型不限。由于其內部使用了Statement語句,所以數據的操作效率一般。

1.2.? JdbcTemplate內置的batchUpdate(String sql, final BatchPreparedStatementSetter pss)

這一方法也僅僅適合于小批量數據的CUD(增、更新、刪除)操作,但始終是同一SQL(參數具有多樣性)。由于其內部使用了PreparedStatement語句,所以數據的操作效率還是不錯的。下面給出了操作示例:

final int[] no = new int[]{7369,7499,7521,7566,7654,7698};

jt.batchUpdate("update emp set sal = ? where empno = ?",

new BatchPreparedStatementSetter(){

public void setValues(PreparedStatement ps, int i)

throws SQLException {

ps.setInt(1, no[i]);

ps.setFloat(2, no[i]);

}

public int getBatchSize() {

return no.length;

}

});

這一方法適合于各種批量數據的CUD(增、更新、刪除)操作,但始終是同一SQL(參數具有多樣性)。由于其內部使用了PreparedStatement語句,所以數據的操作效率還是不錯的。下面給出了操作示例:

DataSource ds = gbfa.getBean("dataSource");

final int[] no = new int[]{7369,7499,7521,7566,7654,7698};

BatchSqlUpdate bsu = new BatchSqlUpdate(ds, "update emp set sal=? where empno = ?");

bsu.setBatchSize(4);

bsu.setTypes(new int[]{Types.FLOAT, Types.INTEGER});

for(int i = 0; i < no.length; ++i){

log.info(bsu.update(new Object[]{no[i],no[i]})) ;

}

bsu.flush();

同JdbcTemplate內置的batchUpdate(String sql, final BatchPreparedStatementSetter pss)相比,BatchSqlUpdate會自動分批待批量處理的數據。比如,如果需要批量操作10萬條數據,則可以控制其batchSize,從而在時間(RDBMS可知性)和空間(內存)上達到平衡。

務必注意,在使用BatchSqlUpdate的最后,不要忘記手工調用其暴露的flush()方法。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java里的daosupport_HibernateDaoSupport与JdbcDaoSupport的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。