JavaEE企业级项目开发(第3版)课件 微课6-1:Spring JDBC支持_第1页
JavaEE企业级项目开发(第3版)课件 微课6-1:Spring JDBC支持_第2页
JavaEE企业级项目开发(第3版)课件 微课6-1:Spring JDBC支持_第3页
JavaEE企业级项目开发(第3版)课件 微课6-1:Spring JDBC支持_第4页
JavaEE企业级项目开发(第3版)课件 微课6-1:Spring JDBC支持_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲人:石云延迟符SpringJDBC支持Spring的数据库开发与事务SpringDAO框架

DAO(DataAccessObject)是用于访问数据的对象,虽然我们在大多数情况下,将数据保存在数据库中,但这并不是唯一的选择,你也可以将数据存储到文件中或LDAP中。DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。SpringDAO框架

早期,JDBC是访问数据库的主流选择,近几年,数据持久技术获得了长足的发展,Hibernate、iBatis、JPA、JDO成为持久层中争放异彩的实现技术。SpringDAO框架DAO接口层应用好处:可以很容易地构造模拟对象,方便单元测试的开展其次在使用切面时,既可用JDK动态代理也可用CGLib动态代理

Spring以统一的方式整合底层的持久化技术:以统一方式进行调用及事务管理,避免让具体的实现侵入到业务层的代码中。每个持久化实现技术都有各自的异常体系,Spring提供了统一的异常体系,方便定义和具体实现技术无关的DAO接口,以便整合到相同的事务管理体系中。SpringDAO框架Spring典型的数据操作模式:Spring为各种支持的持久化技术提供了简化操作的模板和回调在回调中编写具体的数据操作逻辑使用模板执行数据操作SpringDAO框架Spring为不同的持久化技术所提供的模板类:JDBCorg.springframework.jdbc.core.JdbcDaoSupport

Hibernateorg.springframework.orm.hibernate.HibernateDaoSupport

Hibernate3.0org.springframework.orm.hibernate3.HibernateDaoSupportiBatis

org.springframework.orm.ibatis.SqlMapClientDaoSupport

JPAorg.springframework.orm.jpa.JpaDaoSupport

JDOorg.springframework.orm.jdo.JdoDaoSupport

TopLink

org.springframework.orm.jpa.JpaDaoSupport

这些支持类都继承于dao.support.DaoSupport类,该类实现了InitializingBean接口,在afterPropertiesSet()接口方法中检查模板对象和数据源是否被正确设置,否则将抛出异常。SpringDAO框架

Spring为不同的持久化技术所提供的模板类:所有支持类都是抽象的,目的是希望被继承,而非直接使用。如果直接使用模板类,一般都需要在DAO中定义一个模板对象并提供数据资源。Spring为每一个持久化技术都提供了支持类,支持类中完成这样的功能。只需要扩展支持类就可以直接编写实际的数据访问逻辑。SpringDAO框架不同持久化技术的支持类:ORM持久化技术支持类JDBCorg.springframework.jdbc.core.JdbcDaoSupportHibernateorg.springframework.orm.hibernate.HibernateDaoSupportHibernate3.0org.springframework.orm.hibernate3.HibernateDaoSupportiBatisorg.springframework.orm.ibatis.SqlMapClientDaoSupportJPAorg.springframework.orm.jpa.JpaDaoSupportJDOorg.springframework.orm.jdo.JdoDaoSupportTopLinkorg.springframework.orm.jpa.JpaDaoSupportSpringJDBC支持在使用JDBC类操作数据库时,要处理很多相同、繁琐的细节,如:获取数据库的连接创建Statement处理数据库异常关闭数据库资源等Spring提供了几个类用来简化JDBC

API的使用SpringJDBC支持JdbcTemplate类:JdbcTemplate构造函数请求一个DataSource对象来完成初始化。(1)使用JdbcTemplate的execute()方法执行SQL语句execute方法使用java.sql.Statement,SQL语句不带参数,且不返回受影响记录的计数,更适合于创建和丢弃表的语句。jdbcTemplate.execute("CREATE

TABLE

USER

(user_id

integer,

name

varchar(100)");

SpringJDBC支持JdbcTemplate类:(2)增加、删除和修改update方法返回的是受影响的记录数目的一个计数,如果传入参数的话,使用的是java.sql.PreparedStatement,更适合于插入,更新和删除操作。①不带参数的更新jdbcTemplate.update("INSERT

INTO

USER

VALUES('"

+

user.getId()

+

"',

'"

+

user.getName()

+

"',

'"

+

user.getSex()

+

"',

'"

+

user.getAge()

+

"')");

SpringJDBC支持JdbcTemplate类:(2)增加、删除和修改②带参数的修改//修改带参数jdbcTemplate.update("UPDATE

USER

SET

name

=

?

WHERE

user_id

=

?",

new

Object[]

{name,

id});

//插入带参数jdbcTemplate.update("INSERT

INTO

USER

VALUES(?,

?,

?,

?)",

new

Object[]

{user.g

etId(),

user.getName(),

user.getSex(),

user.getAge()});

SpringJDBC支持JdbcTemplate类:(3)JDBC的PreparedStatement①单个更新jdbcTemplate.update("INSERT

INTO

USER

VALUES(?,

?,

?,

?)",

new

PreparedStatementSetter()

{

public

void

setValues(PreparedStatement

ps)

throws

SQLException

{

ps.setString(1,

id);

ps.setString(2,

name);

ps.setString(3,

sex);

ps.setInt(4,

age);

}

});

注意:匿名内部类只能访问外部最终局部变量SpringJDBC支持JdbcTemplate类:(3)JDBC的PreparedStatement②批量更新publicinterfaceBatchPreparedStatementSetter{

voidsetValues(PreparedStatementps,inti)throwsSQLException;

intgetBatchSize();}......publicint[]insertUsers(finalListusers){

Stringsql="INSERTINTOuser(name,age)VALUES(?,?)";

BatchPreparedStatementSettersetter=newBatchPreparedStatementSetter(){

publicvoidsetValues(

PreparedStatementps,inti)throwsSQLException{

Useruser=(User)users.get(i);

ps.setString(1,user.getName());

ps.setInt(2,user.getAge().intValue());}

publicintgetBatchSize(){returnusers.size();}};

returnjdbcTemplate.batchUpdate(sql,setter);}......SpringJDBC支持JdbcTemplate类:(4)查询①使用JdbcTemplate进行查询时,使用queryForXXX()等方法。int

count

=

jdbcTemplate.queryForInt("SELECT

COUNT(*)

FROM

USER");

String

name

=

(String)

jdbcTemplate.queryForObject("SELECT

name

FROM

USER

WHERE

user_id

=

?",

new

Object[]

{id},

java.lang.String.class);

//queryForList返回的List中的对象是MapList

rows

=

jdbcTemplate.queryForList("SELECT

*

FROM

USER");

Iterator

it

=

rows.iterator();

while(it.hasNext())

{

Map

userMap

=

(Map)

it.next();

System.out.print(userMap.get("user_id")

+

"\t");

System.out.print(userMap.get("name")

+

"\t");

System.out.print(userMap.get("sex")

+

"\t");

System.out.println(userMap.get("age")

+

"\t");

}

SpringJDBC支持JdbcTemplate类:(4)查询②JDBC的callback方式—单行查询final

User

user

=

new

User();

jdbcTemplate.query("SELECT

*

FROM

USER

WHERE

user_id

=

?",new

Object[]

{id},

new

RowCallbackHandler()

{

public

void

processRow(ResultSet

rs)

throws

SQLException

{

user.setId(rs.getString("user_id"));

user.setName(rs.getString("name"));

user.setSex(rs.getString("sex").charAt(0));

user.setAge(rs.getInt("age"));

}

});

SpringJDBC支持JdbcTemplate类:(4)查询②JDBC的callback方式—多行查询finalListemployees=newLinkedList();jdbc.query("selectEMPNO,FIRSTNME,LASTNAMEfromEMPLOYEE",newRowCallbackHandler(){

publicvoidprocessRow(ResultSetrs)throwsSQLException{

Employeee=newEmployee();

e.setEmpNo(rs.getString(1));

e.setFirstName(rs.getString(2));

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论