《Spring编程技术与应用》课件4_第1页
《Spring编程技术与应用》课件4_第2页
《Spring编程技术与应用》课件4_第3页
《Spring编程技术与应用》课件4_第4页
《Spring编程技术与应用》课件4_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

4.1.1连接数据库

Spring的JDBC抽象框架提供了一系列接口和类实现对数据源的连接。DataSourceUtils类:提供从JNDI获取连接.方法getDataSourceFromJndi用以针对那些不使用BeanFactory或者ApplicationContext的应用。通过DataSourceUtils.getConnection(DataSource)可取得JDBC连接。SmartDataSource接口:提供与关系数据库的连接,它继承javax.sql.DataSource接口,它在数据库操作后可智能决定是否需要关闭连接。对于需要重用一个连接的应用可提高效率。DriverManagerDataSource类:实现SmartDataSource接口,通过bean的属性配置完成JDBC驱动,并每次都返回一个新的连接。(1)连接Access数据库的配置<beanid="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="sun.jdbc.odbc.JdbcOdbcDriver"/><propertyname="url"value="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=f:/data.mdb"/></bean>(2)基于属性文件连接Mysql数据库的配置<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><propertyname="locations"value="/WEB-INF/conf/perties"/></bean><beanid="dataSource"class="mons.dbcp.BasicDataSource"><propertyname="driverClassName"value="${jdbc.driverClassName}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></bean>4.1.2数据源的注入packagechapter4;importorg.springframework.jdbc.core.JdbcTemplate;publicclassUserDaoImplimplementsUserDao{ privateJdbcTemplatejdbcTemplate; publicJdbcTemplategetJdbcTemplate(){ returnjdbcTemplate; } publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate){ this.jdbcTemplate=jdbcTemplate; }

……//其他业务逻辑方法}3.配置文件(beans.xml)<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns...><beanid="dataSource"....数据源</bean> <beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"> <propertyname="dataSource"> <reflocal="dataSource"/> </property> </bean> <beanid="userDAO"class="chapter4.UserDaoImpl"> <propertyname="jdbcTemplate"> <reflocal="jdbcTemplate"/> </property> </bean>......</beans>编程中也可以采用非注入方式来设置数据源管理对象以下程序中直接通过对象的setter方法实现数据源的设置。DriverManagerDataSourcedataSource=newDriverManagerDataSource();dataSource.setDriverClassName("sun.jdbc.odbc.JdbcOdbcDriver"); dataSource.setUrl("jdbc:odbc:xx");//假设xx为ODBC数据源 UserDaouserDAO=newUserDao(); userDAO.setJdbcTemplate(newJdbcTemplate(dataSource));4.1.3使用JdbcTemplate查询数据库1.使用queryForList方法将多行记录存储到列表中

Stringsql="SELECT*FROM栏目";

List<Map<String,Object>>x=jdbcTemplate.queryForList(sql);要访问第1行的栏目标题可以用 x.get(0).get("title")。2.通过query方法执行SQL语句,对多行查询结果进行对象封装

--(1)使用RowMapper数据记录映射接口通过回调RowMapper接口的mapRow方法可处理结果集的每行。并且每行处理后可返回一个对象,所有行返回的对象形成对象列表集合。publicList<Column>getAll(){List<Column>

rows

=

jdbcTemplate.query(“SELECT*FROM栏目”,newRowMapper<Column>(){ publicColumnmapRow(ResultSetrs,introwNum)throwsSQLException{Columnm=newColumn();//创建栏目对象

m.setTitle(rs.getString(“title”));//根据获取记录字段值设置栏目属性m.setNumber(rs.getInt(“id”));

returnm;//返回一行的处理结果});returnrows;//所有行的处理结果}(2)使用RowCallbackHandler数据记录回调管理器接口RowCallbackHandler接口定义的processRow方法将对结果集的每行分别进行处理,但方法无返回值。

publicstaticList<String>getName(Stringtable){ Stringsql="selectdistinctnamefrom"+table;finalList<String>result=newList<String>();//存放结果 jdbcTemplate.query(sql,newRowCallbackHandler(){ publicvoidprocessRow(ResultSetrs)throwsSQLException{ result.add(rs.getString("name"));//加入结果集 } });returnresult;}3.返回单值结果的查询方法有一些查询方法用来执行返回单个值。例如:queryForInt,queryForLong或者queryForObject。publicbooleanlogincheck(Stringloginname,Stringpass){ Stringsql="Selectcount(*)fromuserwhereloginname='"+loginname +"'andpassword='"+pass+"'"; returnjdbcTemplate.queryForInt(sql)>0;}

queryForObject方法queryForObject方法将会把返回的JDBC类型转换成最后一个参数所指定的Java类。如果类型转换无效,那么将会抛出InvalidDataAccessApiUsageException异常。如果无查询结果,会抛出EmptyResultDataAccessException异常。例如:String

name

=

(String)

jdbcTemplate.queryForObject("SELECT

name

FROM

USER

WHERE

user_id

=

?",

new

Object[]

{“123”},String.class);

//带填充参数情形

如果不含SQL填充参数,可以用如下形式:Stringname=(String)jdbcTemplate.queryForObject("SELECT

name

FROM

USER

WHERE

user_id

=’123’",String.class);实际上,queryForInt(sql)可用queryForObject(sql,Integer.class)来代替。4.1.4使用JdbcTemplate更新数据库1.完整SQL命令串的执行处理如果SQL拼写完整,则可采用只有一个SQL命令串参数的update方法或execute方法。

Stringsql="INSERTINTO栏目(title)"+"VALUES('"+title1+"')";

jdbcTemplate.execute(sql);2.带填充参数的SQL语句的执行处理(1)通过参数数组填充SQL语句中的内容Stringsql="insertintouservalues(?,?,?,?,10)";Object[]params=newObject[]{loginname,password,emailAddress,

username};jdbcTemplate.update(sql,params);(2)利用PreparedStatementSetter接口处理预编译SQL

publicvoidaddScore(finalStringloginname,finalints){

Stringsql="updateusersetscore=score+?whereloginname=?"; jdbcTemplate.update(sql,newPreparedStatementSetter(){ publicvoidsetValues(PreparedStatementps)throwsSQLException{ ps.setInt(1,s);

ps.setString(2,loginname); } });}4.1.5对业务逻辑的应用测试【程序清单4-6】文件名为TestJDBCTemplate.java....ApplicationContextapplicationContext=newClassPathXmlApplicationContext("/beans.xml");UserDaouserDAO=applicationContext.getBean("userDAO", UserDaoImpl.class);if(userDAO.register("123","xxxxxx","mary@","mary")){ System.out.println("auserregistered"); userDAO.addScore("123",5); System.out.println(userDAO.getScore("123")); } }}4.2数据库中大容量字节数据的读写访问4.2.1将大容量数据写入数据库Spring定义了LobCreator接口,以统一的方式操作各种数据库的LOB类型数据。LobCreator接口中的方法:voidsetBlobAsBinaryStream(PreparedStatementps,intparamIndex,InputStreamcontentStream,intcontentLength):通过流填充BLOB数据;voidsetBlobAsBytes(PreparedStatementps,intparamIndex,byte[]content):通过二进制数据填充BLOB数据;voidsetClobAsAsciiStream(PreparedStatementps,intparamIndex,InputStreamasciiStream,intcontentLength):通过Ascii字符流填充CLOB数据;voidsetClobAsCharacterStream(PreparedStatementps,intparamIndex,ReadercharacterStream,intcontentLength):通过Unicode字符流填充CLOB数据;voidsetClobAsString(PreparedStatementps,intparamIndex,Stringcontent):通过字符串填充CLOB数据。

为实现大容量数据写入,JdbcTemplate提供了如下方法:

execute(Stringsql,AbstractLobCreatingPreparedStatementCallbacklcpsc)【程序清单4-8】将文件存储到数据库中publicvoidsave(Stringfilepath)throwsFileNotFoundException{ finalFilex=newFile(filepath); finalStringfilename=x.getName();finalInputStreamis=newFileInputStream(x); finalLobHandlerlobHandler=newDefaultLobHandler();//创建LobHandler对象

jdbcTemplate.execute("insertintofilesave(filename,content)values(?,?)", newAbstractLobCreatingPreparedStatementCallback(lobHandler){ @Override protectedvoidsetValues(PreparedStatementpstmt,LobCreatorlobCreator)

throwsSQLException,DataAccessException{ pstmt.setString(1,filename); lobCreator.setBlobAsBinaryStream(pstmt,2,is,(int)x.length());}});}4.2.2从数据库读取大容量数据

LobHandler接口常用方法如下:InputStreamgetBlobAsBinaryStream(ResultSetrs,intcolumnIndex):从结果集中返回InputStream,通过InputStream读取BLOB数据;byte[]getBlobAsBytes(ResultSetrs,intcolumnIndex):以二进制数据的方式获取结果集中的BLOB数据;InputStreamgetClobAsAsciiStream(ResultSetrs,intcolumnIndex):从结果集中返回InputStream,通过InputStreamn以Ascii字符流方式读取BLOB数据;ReadergetClobAsCharacterStream(ResultSetrs,intcolumnIndex):从结果集中获取Unicode字符流Reader,并通过Reader以Unicode字符流方式读取CLOB数据;StringgetClobAsString(ResultSetrs,intcolumnIndex):从结果集中以字符串的方式获取CLOB数据

温馨提示

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

评论

0/150

提交评论