




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主讲人:石云延迟符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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 抵押合同借款合同
- 甘肃减震支架施工方案
- 三农村电商推广营销策略手册
- 国际公路货运合同
- 人力资源开发合同
- 生态木墙板施工方案
- 种植屋面施工方案报价
- 铜包钢施工方案
- 铁路桥墩基坑回填施工方案
- 贈針高教学文学
- 2025湖南省低空经济发展集团有限公司招聘11人笔试参考题库附带答案详解
- 七年级下册道德与法治(2025年春)教材变化详细解读
- GB/T 11856.1-2025烈性酒质量要求第1部分:威士忌
- 认识常用电子元件图解课件
- 2025山东能源集团中级人才库选拔高频重点提升(共500题)附带答案详解
- 20S515 钢筋混凝土及砖砌排水检查井
- 关于建设吉林长白山人参产业园的报告
- 6人小品《没有学习的人不伤心》台词完整版
- 腰椎ODI评分完整版
- MC7000其它检验方法RCCM中文版法国民用核电标准
- 数学物理方法_6_拉普拉斯变换
评论
0/150
提交评论