第12章 基于注解的Spring MVC应用_第1页
第12章 基于注解的Spring MVC应用_第2页
第12章 基于注解的Spring MVC应用_第3页
第12章 基于注解的Spring MVC应用_第4页
第12章 基于注解的Spring MVC应用_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第12章基于注解的SpringMVC应用本章主要内容基于注解的Spring编程SpringMVC注解基于注解的请求和响应处理重定向基于注解的SpringMVC分层架构SpringJDBC12.1基于注解的Spring编程注解(Annotation),是JDK5.0引入的一种注释机制,以符号“@”开头,类、方法、变量、参数等都可以被注解。12.1.1基于注解的组件扫描启动组件扫描在Spring配置文件中添加

<context:component-scanbase-package="…."/>Spring容器启动后扫描“base-package”指定包及其子包下面的所有的类注解@Component:Bean对象加入Spring容器,相当于XML方式中的<beanid=""class=""/>的配置。@Repository:用于对DAO实现类(持久层)进行注解。@Service:用于对Service实现类(业务层)进行注解。@Controller:用于对SpringMVC中Controller实现类进行注解。12.1.1基于注解的组件扫描【例】使用@Component注解创建Bean对象。packagebean;importjava.io.Serializable;importorg.springframework.stereotype.Component;//@Componentpublic

classMobilePhoneimplementsSerializable{

privateStringcpu;

privateStringram; //此处省略属性的set、get方法和构造方法}<context:component-scanbase-package="bean"></context:component-scan>12.1.1基于注解的组件扫描【例】使用@Component注解创建Bean对象。importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importbean.MobilePhone;public

classTestCase{ @Test

public

voidtest(){ ApplicationContextac=new

ClassPathXmlApplicationContext("applicationContext.xml"); MobilePhonephone=ac.getBean("mobilePhone",MobilePhone.class); System.out.println(phone); }}12.1.1基于注解的组件扫描【例】使用@Component注解创建Bean对象。importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importbean.MobilePhone;public

classTestCase{ @Test

public

voidtest(){ ApplicationContextac=new

ClassPathXmlApplicationContext("applicationContext.xml"); MobilePhonephone=ac.getBean("mobilePhone",MobilePhone.class); System.out.println(phone); }}12.3.1读取请求参数【例】使用不同方式提取“体温平安报”的请求参数。(2)使用@RequestParam注解映射名称不一致的参数packagecontroller.tmpmis;importbean.Report;@Controller@RequestMapping("/tmp")public

classAddTmpController{@RequestMapping("/add.do")publicStringgetInfo2(Stringname,Stringtelephone,

booleanisContacted,@RequestParam("temperature")doubletemp){ Reportr=newReport(name,telephone,isContacted,temp); //System.out.println(r); //测试 return"show";}}12.1.2基于注解的依赖注入具有依赖关系的Bean对象,可以使用注解完成依赖注入。@AutoWired:Spring提供的注解,按类型匹配的方式自动装配,在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入到@AutoWired标注的变量中。@Resource:J2EE提供的注解,对应javax.annotation.Resource类,当容器中有一个以上匹配的Bean时,可以通过@Resource(name="")按照名字进行匹配。12.1.2基于注解的依赖注入【例】使用注解向Student类注入MobilePhone对象。packagebean;importjava.io.Serializable;importorg.springframework.beans.factory.annotation.Autowired;@Component//注解Student,创建Student类型的Bean对象,默认名为studentpublic

classStudentimplementsSerializable{

privateStringname;

private

intage; @Autowired//自动注解,按类型匹配注入容器中的MobilePhone类型对象

privateMobilePhonephone; //此处省略set/get方法、构造方法}12.1.2基于注解的依赖注入【例】使用注解向Student类注入MobilePhone对象。12.1.2基于注解的依赖注入【例】用注解的方式向Student注入Map集合。packagebean;public

classCourse{

privateStringcname;//课程名

private

intcreditHour;//学分

//2个属性的set/get方法、构造方法,此处省略}<beanid="c1"class="bean.Course"><propertyname="cname"value="Java"/><propertyname="creditHour"value="4"/></bean><beanid="c2"class="bean.Course"><propertyname="cname"value="JavaWeb"/><propertyname="creditHour"value="3"/></bean><util:mapid="courses"map-class="java.util.HashMap"><entrykey="001"value-ref="c1"/><entrykey="002"value-ref="c2"/></util:map>12.1.2基于注解的依赖注入【例】用注解的方式向Student注入Map集合。packagebean;importjava.io.Serializable;importjava.util.Map;importjavax.annotation.Resource;//@Resource对应的类importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;@Componentpublic

classStudentimplementsSerializable{

privateStringname;

private

intage;

@Autowired

privateMobilePhonephone;

@Resource(name="courses")//用@Resource按照名字进行注入

privateMap<String,Object>coursesInfo; //此处省略set/get方法、构造方法

}12.1.2基于注解的依赖注入【例】用注解的方式向Student注入Map集合。12.2SpringMVC注解SpringMVC编程中,可以对控制器使用@Controller注解,同时原本HandlerMapping的配置工作也可以通过@RequestMapping注解进行标识。@Controller和@RequestMapping注解是SpringMVC中最重要的两个注释类型。12.2.1Controller注解基于注解的控制器有如下优点传统方式下一个实现Controller接口的控制器只能处理一个请求,而使用注解的控制器类可以处理多个请求,这就允许相关的请求处理写在同一个控制器类,从而减少应用程序中类的数量。基于注解的控制器的请求映射不需要存储在配置文件中,使用@RequestMapping注解即可以对每个方法进行请求标注。使用注解方式,编写Controller时不再实现Controller接口,只需要在类名前添加@Controller,指示类的实例是一个控制器。在Controller中可以添加多个方法,每个方法处理一个请求;方法名可自定义,方法的返回值既可以是ModelAndView,也可以是String。12.2.2RequestMapping注解在@Controller标注的类的内部,使用@RequestMapping注解将每个方法与某个请求URI相关联,当前端控制器DispatcherServlet接收到某个请求时,按请求调用对应的方法。【例】用注解的方式实现输出Helloworld。第一,修改Spring配置文件。删除HelloController的<bean>声明,删除HandlerMapping的配置。加入组件扫描和MVC扫描。<context:component-scanbase-package="..."/><mvc:annotation-driven/>12.2.2RequestMapping注解【例】用注解的方式实现输出Helloworld。第二,修改HelloControllerpackagecontroller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;@Controller//声明类是控制器public

classHelloController{ @RequestMapping("/hello.do")//请求/hello.do交给hello()方法处理

public

Stringhello(){ return"hello"; }}12.2.2RequestMapping注解工作过程①:首先,Spring容器启动时会扫描<context:component-scanbase-package="...">中“base-package”包下的类,创建带有@Controller注解的控制器对象。②③:当前端控制器DispatcherServlet收到请求后,到控制器对象中对@RequestMapping设置的路径进行匹配,找到匹配的请求处理方法后执行。④⑤⑥:请求处理方法返回视图逻辑名,DispatcherServlet将其交给视图解析器ViewResolver将其解析为视图对象。⑦:由视图对象产生响应结果。12.2.2RequestMapping注解@RequestMapping注解控制器类packagecontroller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/user")//注解类的URIpublic

classUserController{

@RequestMapping("/registe.do")

publicStringaddUser(){

return

……; }

@RequestMapping("/login.do")

publicStringlogin(){

return

……; }

……}无论方法返回值是哪种类型,都按转发进行跳转处理。12.3基于注解的请求和响应处理基于注解的控制器的每个请求处理方法可以按照需求设定不同类型、个数的参数,并使用不同的方式向视图传递模型数据。12.3.1读取请求参数【例】使用不同方式提取“体温平安报”的请求参数。(1)使用HttpServletRequest获取请求参数packagecontroller.tmpmis;importbean.Report;//保存上报信息的实体类,包含name,telephone,isCon,temp属性@Controller@RequestMapping("/tmp")public

classAddTmpController{ @RequestMapping("/add.do")

publicStringgetInfo1(HttpServletRequestrequest){ //使用reqeust获取表单提交的数据 Stringname=request.getParameter("name"); Stringtelephone=request.getParameter("telephone"); StringisContacted=request.getParameter("isContacted"); Stringtemperature=request.getParameter("temperature");

12.3.1读取请求参数【例】使用不同方式提取“体温平安报”的请求参数。(1)使用HttpServletRequest获取请求参数 //手动数据类型转换

booleanisCon=false;

if(isContacted!=null&&isContacted.equals("1")){ isCon=true; } doubletemp=0;

if(temperature!=null){ temp=Double.parseDouble(temperature); } Reportr=newReport(name,telephone,isCon,temp); //在控制台打印封装数据 //System.out.println(r); //测试

return"show";//视图 }}12.3.1读取请求参数【例】使用不同方式提取“体温平安报”的请求参数。(3)使用自动封装@RequestMapping("/add.do")publicStringgetInfo3(Reportr){//实体类对象做参数 //System.out.println(r); //测试

return"show";}12.3.2向页面传递数据SpringMVC提供了多种途径传递模型数据方式1:使用request参数对象。因为SpringMVC转向视图时默认使用转发机制,所以在基于注解的控制器中,可以为请求处理方法添加HttpServletRequest参数,将数据绑定在request对象传递。方式2:使用ModelMap参数对象。在请求处理方法中添加ModelMap参数对象,将数据以键值对的形式添加到ModelMap对象,ModelMap数据会自动添加到模型中到达视图。方式3:使用ModelAndView返回值对象。当请求处理方法返回值为ModelAndView时,可以将数据添加到Map对象,然后封装到ModelAndView对象中,随方法的返回值到达视图。方式4:使用session参数对象。当以重定向方式到达视图,或者模型数据需要在会话期的多个请求间共享时,需要将其保存至session对象。安全使用session的方法是利用请求处理方法的HttpServletRequest参数获取session,并使用setAttribute()方法添加模型数据,与Servlet编程的方式相同。12.3.2向页面传递数据【例】使用不同的方式将体温平安报提交的数据信息传递给show.jsp页面。(1)使用request参数对象传递数据packagecontroller.tmpmis;importjavax.servlet.http.HttpServletRequest;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importbean.Report;@Controller@RequestMapping("/tmp")public

classAddTmpController{ @RequestMapping("/add.do")publicStringgetInfo4(HttpServletRequestrequest,Reportr){ request.setAttribute("info",r);

return"show";}}12.3.2向页面传递数据【例】使用不同的方式将体温平安报提交的数据信息传递给show.jsp页面。(1)使用request参数对象传递数据packagecontroller.tmpmis;importbean.Report;@Controller@RequestMapping("/tmp")public

classAddTmpController{ @RequestMapping("/add.do")publicStringgetInfo4(HttpServletRequestrequest,Reportr){ request.setAttribute("info",r);

return"show";}}<h1>${}</h1><h1>${info.telephone}</h1><h1>${info.isContacted}</h1><h1>${info.temperature}</h1>12.3.2向页面传递数据【例】使用不同的方式将体温平安报提交的数据信息传递给show.jsp页面。(2)使用ModelMap参数对象传递数据。packagecontroller.tmpmis;importbean.Report;@Controller@RequestMapping("/tmp")public

classAddTmpController{ @RequestMapping("/add.do")

publicStringgetInfo5(Reportr,ModelMapmodel){ model.addAttribute("info",r);

return"show"; }}12.3.2向页面传递数据【例】使用不同的方式将体温平安报提交的数据信息传递给show.jsp页面。(3)使用ModelAndView返回值对象传递数据packagecontroller.tmpmis;importbean.Report;@Controller@RequestMapping("/tmp")public

classAddTmpController{ @RequestMapping("/add.do")

publicModelAndViewgetInfo6(Reportr){ //1.将数据模型添加至MapMap<String,Object>data=newHashMap<String,Object>();data.put("info",r);//2.创建将Map作为模型的ModelAndView对象,返回

return

newModelAndView("show",data);//视图参数+Model参数 }}12.3.3中文乱码处理表单提交时,如果遇到中文字符会出现乱码现象。Spring提供了CharacterEncodingFilter过滤器,用于解决post请求的乱码问题。在web.xml中进行配置CharacterEncodingFilter过滤器<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class> org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>12.3.3中文乱码处理【例】在体温平安报中测试请求和响应的中文编码问题。在web.xml中增加CharacterEncodingFilter过滤器的配置。在填写表单数据时使用中文姓名,在控制台打印姓名参数,观察是否出现乱码修改视图文件show.jsp,增加中文信息,指定字符编码为utf-8,并引入JSTL标签对boolean型结果的展示予以处理12.3.3中文乱码处理【例】在体温平安报中测试请求和响应的中文编码问题。show.jsp<%@pagecontentType="text/html;charset=utf-8"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><html> <head><title>上报体温数据</title></head> <body> <h1>姓名:${}</h1> <h1>联系方式:${info.telephone}</h1> <h1>与湖北是否有接触: <c:iftest="${info.isContacted}"var="res">

有接触</h1> </c:if> <c:iftest="${!res}">

未有接触</h1> </c:if> </h1> <h1>当日体温:${info.temperature}</h1> </body></html>12.3.3中文乱码处理在maven项目中引入JSTL时,在pom.xml中增加如下构件<!--/artifact/javax.servlet/jstl--><dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>runtime</scope></dependency><!--/artifact/taglibs/standard--><dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version></dependency>12.4重定向SpringMVC默认采用转发方式到达视图,需要重定向时,如果请求处理方法返回的是String类型,可以使用“redirect:”前缀重定向;如果Controller的请求处理方法返回的是ModelAndView对象,可以使用RedirectView对象重定向。重定向方式不受ViewResolver的约束,Controller需要自行指定完整的跳转路径。12.4重定向【例】编写登录及跳转处理。packagecontroller;@Controllerpublic

classLoginController{ @RequestMapping(value="/login.do")

publicStringlogin(Stringname,Stringpwd,HttpServletRequestrequest){

if(null!=name&&name.equals("song")&&

null!=pwd&&pwd.equals("1234")){//用户名密码匹配 request.getSession().setAttribute("username",name);

return"redirect:welcome.jsp";//重定向到首页 }else{

return"redirect:login.html";//重定向至登录页面 } }12.4重定向【例】编写登录及跳转处理。packagecontroller;importorg.springframework.web.servlet.view.RedirectView;@Controllerpublic

classLoginController{ @RequestMapping(value="/login.do")

publicModelAndViewlogin(Stringname,Stringpwd,HttpServletRequestrequest){

if(null!=name&&name.equals("song")&&

null!=pwd&&pwd.equals("1234")){//用户名密码匹配 request.getSession().setAttribute("username",name);

returnnewModelAndView(newRedirectView("welcome.jsp")); }else{

returnnewModelAndView(newRedirectView("login.html")); } }}12.5基于注解的SpringMVC分层架构MVC架构中的分层思想:表示层、业务层和持久层“开闭原则”:对扩展开放,对修改关闭12.5.1登录处理的分层结构表示层:登录操作页面login.jsp,登录后的首页index.jsp,登录用户名、密码错的提示页面error.jsp。业务层:命名为XxxxService,LoginService是接口,LoginServiceImpl是它的实现类。持久层:进行数据库访问,命名为XxxxDAO,UserDAO是接口,UserDAOJdbcImpl是用JDBC访问数据库的实现类。12.5.1登录处理的分层结构12.5.2项目的基础工作第1步:建立maven项目springmvc-login,在pom.xml中添加组件,导入项目所需jar包。第2步:在web.xml中配置DispatcherServlet和CharacterEncodingFilter过滤器。第3步:在类路径下(src/main/resources)添加Spring配置文件,配置文件中添加注解扫描和MVC扫描,注解扫描范围为顶层包“com.javaweb”。12.5.3配置数据库连接池第4步:建立数据库连接池的配置文件perties文件,将其存储在类路径下。在Spring配置文件中,通过Properties集合读取配置文件perties,保存在Bean对象中。第5步:在Spring配置文件中,通过Spring表达式获取jdbc数据,配置DBCP数据库连接池对应的Bean对象。<util:propertiesid="jdbc"location="classpath:perties"/>12.5.3配置数据库连接池第4步:建立数据库连接池的配置文件perties文件,将其存储在类路径下。在Spring配置文件中,通过Properties集合读取配置文件perties,保存在Bean对象中。第5步:在Spring配置文件中,通过Spring表达式获取jdbc数据,配置DBCP数据库连接池对应的Bean对象。<util:propertiesid="jdbc"location="classpath:perties"/>12.5.3配置数据库连接池第6步:配置完成后,在JUnit类中测试数据库连接池是否创建成功。DBCP的连接池送给JDBC访问所需的数据源javax.sql.DataSource。public

classTestCase{ ApplicationContextac; @Before

public

voidinit(){ ac=newClassPathXmlApplicationContext("springmvc.xml"); } @Test

public

voidtest1()throwsSQLException{ DataSourceds=ac.getBean("ds",DataSource.class); System.out.println(ds.getConnection()); }}12.5.4持久层第7步:在MySQL数据库中,建立数据库user及数据表user_info。第8步:对应user_info数据表,建立User实体类。第9步:建立UserDAO接口。第10步:建立UserDAOJdbcImpl类。packagecom.javaweb.dao.impl;@Repository("userDAO")//标识持久层的Bean对象public

classUserDAOJdbcImplimplementsUserDAO{ @Resource(name="ds")//按名字注入Spring容器中的Bean对象

privateDataSourceds;

publicUserfindByName(Stringusername){

if(username==null){ return

null;} Connectioncon=null;

try{ con=ds.getConnection(); Stringsql="select*fromuser_infowherename=?"; PreparedStatementpst=con.prepareStatement(sql); pst.setString(1,username); ResultSetrs=pst.executeQuery();12.5.4持久层

if(rs.next()){

intid=rs.getInt("id"); Stringname=rs.getString("name"); Stringpwd=rs.getString("password"); Useru=newUser(id,name,pwd);

returnu; } }catch(SQLExceptione){ e.printStackTrace(); }finally{ if(rs!=null){try{rs.close();}catch(Exceptione){}} if(pst!=null){try{pst.close();}catch(Exceptione){}}if(con!=null){try{con.close();}catch(Exceptione){}} }

return

null; }12.5.4持久层第11步:在JUnit测试类中测试持久层方法。public

classTestCase{ ApplicationContextac; @Before

public

voidinit(){ ac=newClassPathXmlApplicationContext("springmvc.xml"); } @Test

public

voidtest2(){ UserDAOdao=ac.getBean("userDAO",UserDAO.class); Useru=dao.findByName("admin"); System.out.println(u.getId()); }}12.5.5业务层第12步:为登录业务处理可能遇到的状况自定义异常,在业务方法中抛出。一个为查无此人异常,一个为密码错异常。自定义异常最重要的就是名字,标识发生的状况。packagecom.javaweb.exception;public

classUserNameExceptionextendsException{

publicUserNameException(Stringmessage){

super(message);}}packagecom.javaweb.exception;public

classPasswordExceptionextendsException{

publicPasswordException(Stringmessage){

super(message); }}12.5.5业务层第13步:创建LoginService接口。第14步:创建LoginServiceImpl实现类。packagecom.javaweb.service.impl;@Service("loginService")public

classLoginServiceImplimplementsLoginService{ @Resource(name="userDAO")

privateUserDAOdao;

publicUsercheckLogin(Stringname,Stringpwd)

throwsUserNameException,PasswordException{ Useruser=dao.findByName(name);

if(user==null){

throw

newUserNameException("无此用户"); }else

if(!user.getPwd().equals(pwd)){

throw

newPasswordException("密码错误"); }

returnuser; }}12.5.5业务层第15步:在JUnit测试类中测试业务方法。packagetest;public

classTestCase{ ApplicationContextac; @Before

public

voidinit(){ ac=newClassPathXmlApplicationContext("springmvc.xml");} @Test

public

voidtest3(){ LoginServiceservice=ac.getBean("loginService",LoginService.class);

try{ Useru=service.checkLogin("admin","123456"); System.out.println(u.getId()); }catch(UserNameExceptione){ System.out.println(e.getMessage()); }catch(PasswordExceptione){ System.out.println(e.getMessage()); } }}12.5.6表示层表示层包括登录页面login.jsp、首页index.jsp和出错页面error.jsp,所有JSP页面均存放在WEB-INF文件夹下,防止用户直接从地址栏访问。12.5.6表示层第16步:创建三个视图页面。<%@pagecontentType="text/html;charset=utf-8"%><html><head><title>登录</title></head><body><formmethod="post"action="checkLogin.do"> <fieldsetstyle="width:260px;"> <legend>登录</legend> <span>用户名:</span><inputtype="text"name="name"/><br><br> <span>密

码:</span><inputtype="password"name="pwd"/><br><br> <div><inputtype="submit"value="登录"id="login"/></div> </fieldset></form></body></html>

登录页面12.5.6表示层第16步:创建三个视图页面。<%@pagecontentType="text/html;charset=utf-8"%><html> <head><title>首页</title></head> <body>

欢迎,${username} </body></html>网站首页12.5.6表示层第16步:创建三个视图页面。<%@pagecontentType="text/html;charset=utf-8"%><html> <head><title>出错页面</title></head> <body>

出错了,${message} <% response.setHeader("refresh","2;url=toLogin.do"); %> </body></html>出错页面12.5.7控制器第17步:万事俱备,只欠东风,最后使用Controller将业务层和表示层连接起来。packagecom.javaweb.controller;@Controllerpublic

classLoginController{ @Resource(name="loginService")

privateLoginServicesevice;

@RequestMapping("/toLogin.do")

publicStringtoLogin(){

return"main/login"; }

12.5.7控制器第17步:万事俱备,只欠东风,最后使用Controller将业务层和表示层连接起来。 @RequestMapping("/checkLogin.do")

publicStringcheckLogin(Stringname,Stringpwd, HttpSessionsession,ModelMapmodel){

try{ Useru=sevice.checkLogin(name,pwd); session.setAttribute("username",name);

return"redirect:toIndex.do"; //重定向:书写完整路径 }catch(UserNameExceptione){ model.addAttribute("message",e.getMessage());

return"main/error"; }catch(PasswordExceptione){ model.addAttribute("message",e.getMessage());

return"main/error"; } } @RequestMapping("/toIndex.do")

publicStringtoIndex(){

return"main/index"; }}12.5.7控制器12.6SpringJDBCJDBC访问中有很多重复的事,获取连接、创建Statement对象、释放资源、异常处理等,SpringJDBC是Spring的持久层技术,通过模板和回调机制以更直接、更简洁的方式完成JDBC的工作,仅需要做那些必不可少的事。12.6.1配置SpringJDBC第1步:JdbcTemplate需要使用DataSource获取连接,首先在Spring配置文件中创建好数据源。第2步:在pom.xml中添加SpringJDBC需要jar包。第3步:在Spring配置文件中定义JdbcTemplate。12.6.2为SQL语句传参JdbcTemplate使用PreparedStatement执行SQL语句,在SQL语句中使用“?”作为占位符表示参数。JdbcTemplate提供了若干个update()方法,实现对数据表的增删改操作。intupdate(Stringsql):执行不带参数的SQL语句。intupdate(Stringsql,Object[]args):执行带参数的SQL语句,第2个参数Object[]以Object数组的形式接收语句中的所有参数。intupdate(Stringsql,Object…args):执行带参数的SQL语句,第2个不定参数与Object[]相似,但参数可以为任意类型、任意多个。12.6.2为SQL语句传参【例】定义ReportDAO,使用JdbcTemplate完成增删操作。packagecom.jdbc.dao.impl;@Repository("reportDAOImpl")public

classReportDAOImplimplementscom.jdbc.dao.ReportDAO{

@Resource(name="jdbcTemplate") privateJdbcTemplatetemplate;

publicList<

温馨提示

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

评论

0/150

提交评论