spring-mvc数据源配置及modelAttribute注解


使用spring dataSource的几种方式
(1)不用jdbctemplate 使用DataSource
     public TestDao(){
     public DateSource datasource;
     public query(){
        conn = datasource.getConnection()
        statement =conn.prepareStatement(sql)
        statement.setInt(1,"xx")//1为问号的位置,从1开始
        rs = statement.executeQuery();
         ....
        conn.close();
    }
}
 可以看到很麻烦,需要自己来维护链接,包括打开、关闭等操作。
(2)使用jdbcTemplate 
   public TestDao(){
     public DateSource datasource;
     public query(){
        jdbcTemplate = new JdbcTemplate(datasource);
        jdbcTemplate.queryForObject(sql, String.class, args1)
    }
   }
可以看到已经节省了大量的代码,很多的操作都由jdbctemplate来帮我们来做了,我们只需要给jdbctemplate注入一个
dataSource,然后直接调用JdbcTemplate的API即可
(3)继承JdbcDaoSupport
   public TestDao() extends JdbcDaoSupport{
     public query(){
        this.getJdbcTemplate.queryForObject(sql, String.class, args1)
    }
   }
  然后在spring-Servlet.xml(spring配置文件)中,给TestDao注入dataSource
<bean id="test" class="com.my.TestDao">
    <property name="dataSource" ref = "dataSource">
</bean>
其中,dataSource为自己定义的数据源的bean。因为从源码中更可以看到JdbcDaoSupport中有一个变量JdbcTemplate,所以不需要自己new了。JdbcTemplate中又有一个变量dataSource。
最后,给出数据源的配置样例
        <bean id = "datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://10.47.180.190:5518/iecs"/>
            <property name="username" value="zxin_smap"/>
            <property name="password" value="db10$ZTE"/>
        </bean>
   使用spring的数据库相关功能,需要导入包  
   spring-jdbc-3.2.9.RELEASE.jar -- jdbctemplate JdbcDaoSupport等都在此包中
   spring-tx-3.2.9.RELEASE.jar  --  DaoSupport在此包中,JdbcDaoSupport依赖于该类
   mysql-connector-java-5.1.25-bin.jar --mysql数据库链接驱动类

spring modelAttributes的使用

(1)用在处理方法(有requestmapping注解的方法)的入参之前,用来将请求参数注入到特定对象,并且将得到的对象暴露在模型数据中(暴露的意思就是将该对象添加到modelMap中,并指定对象的名字,方便在视图中使用)。如下所示:


http://localhost:8080/mvctest/hello/show?username="lp"&hobbyList[0]="soccer"&extraMap["address"]="nanjing"


其实,如果仅仅需要完成自动注入的功能,不需要加@modelAttribute就可以完成
(2)用在处理方法的返回类型前,可以将处理方法返回的结果暴露到模型数据中。
(3)用在非处理方法上,被@ModelAttribute注解的方法会在该处理器的每一个处理方法被访问之前调用,如果处理器有多个处理方法,应谨慎使用。这种个注解方式,会使得方法返回的对象暴露在模型数据中,然后可以在处理方法中直接使用该对象。


(4)疑点:在参考《http://sishuok.com/forum/blogPost/list/6233.html》的过程中发现一些问题,总结如下:
     当在非处理方法getUserBefore之前用@modelAttribute("userbefore")注解,则该方法返回的user对象会以userbefore为名称存储在模型数据中。与此同时,在处理器方法getHelloView中使用@modelAttribute("userbefore")进行入参绑定。文章中说,spring mvc 会先去模型数据中查找是否存在名叫userbefore的对象,如果存在则直接使用该对象,否则通过反射机制重新创建一个新的user对象,并注入参数。但是,通过测试代码,会发现,getHelloView中获得的对象的属性值跟入参一致,与getUserBefore中新建的对象并不是同一个,而且处理方法中的@ModelAttribute注解绑定的对象会覆盖掉非处理方法中存储的对象(可能是我理解偏差,欢迎大家指正)。
    基于上述注解,继续在控制器类上使用SessionAttributes(value={"userbefore"}),这时spring mvc的处理流程如下:
    i.首先根据sessionAttributes注解的value属性,将所有的指定的会话中的对象加入模型数据
    ii.如果模型数据中不存在userbefore对象,则执行getUserBefore方法,并把返回的对象暴露在模型数据中。否则直接取会话中的对象,不再执行getUserBefore方法
    iii.对于处理器方法中入参前面的@ModelAttributes("userbefore"),文章中说:先去模型数据中查找同名对象,如果存在,直接使用,如果不存在则通过反射机制创建并注入参数,并暴露在模型数据中。但是测试发现,得到的对象与请求参数中的属性值保持一致。
(5)匿名绑定命令参数,没有指定value时,这时的对象暴露在模型数据中,其名称是什么呢?spring mvc有一套默认机制,即处理集合类,一律是类型名首字母小写。对于集合类是元素类型名首字母小写+List
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值