您的位置:首页 > 编程语言 > Java开发

关于Spring MVC中jdbcTemplate注入问题

2014-10-14 14:54 246 查看
楼主是个新人,最近做的一个项目用到了spring mvc,所以楼主开始研究,自己写了个小的程序,其中jdbcTemplate是在配置文件中配置的,但是在程序运行的时候,获得的jdbcTemplate一直为空,经过查阅资料,终于找到原因了。

applicationContext.xml配置文件

<bean id="dataSource"

        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName"

            value="oracle.jdbc.driver.OracleDriver">

        </property>

        <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>

        <property name="username" value="scott"></property>

        <property name="password" value="123"></property>

    </bean>

    <bean id="jdbcTemplate"

        class="org.springframework.jdbc.core.JdbcTemplate">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

    </bean>

这个是配置文件,经过观察,发现问题不是出在配置文件中,然后查看dao层

UserInfoDaoImpl.java

import java.util.HashMap;

import java.util.Map;

import javax.annotation.Resource;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;

import com.xwtec.springmvc.user.dao.UserInfoDao;

import com.xwtec.springmvc.user.model.UserInfo;

import org.springframework.stereotype.Service;

@Service

public class UserInfoDaoImpl extends NamedParameterJdbcDaoSupport implements UserInfoDao{

    

    @Resource

    public void setSuperJdbcTemplate(JdbcTemplate jdbcTemplate)

    {

        super.setJdbcTemplate(jdbcTemplate);

    }

    

    @Resource(name="dataSource")

    public void setSuperDataSource(DataSource dataSource){

        setDataSource(dataSource);

    }

    

    public void addUser(UserInfo user) {
// TODO Auto-generated method stub

}

    

    public int checkUser(String username, String password) {

        int count = 0;

        String sql = "select count(1) from user where username=? and password=?";
try
{
   Map<String, Object> paramMap = new HashMap<String, Object>();
   paramMap.put("username", username);
   paramMap.put("password", password);
       count = getJdbcTemplate().queryForInt(sql, paramMap);

            System.out.println(count); 
}
catch (Exception e) {

            e.printStackTrace();

        }

return count;
}

}

发现dao层的注入也是没有问题的,向上看service层和action层发现问题

UserServiceImpl.java

import org.springframework.stereotype.Service;

import com.xwtec.springmvc.user.dao.UserInfoDao;

import com.xwtec.springmvc.user.dao.impl.UserInfoDaoImpl;

import com.xwtec.springmvc.user.service.UserService;

@Service

public class UserServiceImpl implements UserService {

    
private UserInfoDao userInfoDao = new UserInfoDaoImpl();

public UserInfoDao getUserInfoDao() {

        return userInfoDao;

    }

    public void setUserInfoDao(UserInfoDao userInfoDao) {

        this.userInfoDao = userInfoDao;

    }

    public int checkUser(String username, String password) {

int count = userInfoDao.checkUser(username, password);

return count;
}

}

在service层我new了一个dao的实例,同时给了get和set方法,但是我没有在配置文件中定义这个Bean,导致程序执行的时候并不是通过配置文件去加载这些实例,同样,给dao层注入的jdbcTemplate就为空了,action层同样new了一个service的实例,这里就不展示代码了,把改过后的代码展示一下

UserServiceImpl.java

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.xwtec.springmvc.user.dao.UserInfoDao;

import com.xwtec.springmvc.user.dao.impl.UserInfoDaoImpl;

import com.xwtec.springmvc.user.service.UserService;

@Service

public class UserServiceImpl implements UserService {

    @Resource
private UserInfoDao userInfoDao = new UserInfoDaoImpl();

public int checkUser(String username, String password) {

int count = userInfoDao.checkUser(username, password);

return count;
}

}

UserAction.java

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import com.xwtec.springmvc.user.service.UserService;

@Controller

public class UserAction 

{

    @Resource
private UserService userService;

@Autowired
private HttpServletRequest request;

@RequestMapping("/user/userLogin.do")
public String userLogin()
{
String username = request.getParameter("username");
String password = request.getParameter("password");

int n = userService.checkUser(username, password);

request.setAttribute("username",username);

if(1==n)
{
return "welcome";
}
else
{
return "error";
}
}

}

改成下面这种方式之后,spring会通过@Resource注解根据name去获取对应的Bean。

楼主新人一个,有什么不对的地方欢迎指正。把问题发在这里,只是想给自己一个提醒。。。

4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc