Spring中连接数据库,使用${username}获取不到数据库用户名

在Spring开发中,使用注解配置时,使用${usernaame}获取的为Windows用户名,而不是数据库的用户名。

  • 在jdbcConfig.properties文件中配置的数据源
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///test
username=root
password=root
  • spring数据库相关的配置类
public class JdbcConfig {

    @Value("${driver}")
    private String DRIVER;

    @Value("${url}")
    private String URL;

    @Value("${username}")
    private String USERNAME;

    @Value("${password}")
    private String PASSWORD;
    /**
     * 用于创建一个QueryRunner对象
     * @param dataSource
     * @return
     */
    @Bean(name = "runner")
    @Scope("prototype")
    public QueryRunner createQueryRunner(DataSource dataSource){
        return new QueryRunner(dataSource);
    }

    /**
     * 创建数据源对象
     * @return
     */
    @Bean(name = "dataSource")
    public DataSource createDataSource(){
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try {
            ds.setDriverClass(DRIVER);
            ds.setJdbcUrl(URL);
            ds.setUser(USERNAME);
            ds.setPassword(PASSWORD);
            return ds;
        } catch (PropertyVetoException e) {
            throw new RuntimeException(e);
        }
    }
}
  • 执行测试类时,发现控制台报一下错误
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask run
警告: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@50492997 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.sql.SQLException: Access denied for user 'Mr.Ye'@'localhost' (using password: YES)

(上述‘Mr.Ye’为主机名,一般为administrator)
原因:在XML中获取用户名使用 ${username}获取的是计算机的账号名称,一般电脑账号为administrator。

解决:可以使用唯一识别的名称进行连接,比如${jdbc.username}或 ${user}再次测试,成功连接。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这个问题的解决方案可以分为以下几个步骤: 1. 确定数据库表结构和对应的实体类。假设我们有一个名为 User 的实体类,包含以下属性:id、username、password。我们需要在数据库创建一个名为 user 的表,包含这三个列。 2. 实现用户登录功能。我们可以在控制器层编写一个登录方法,接收用户提交的用户名和密码,然后在数据库查询是否存在该用户。如果存在,则将该用户的信息存储到 Session ,表示用户已登录。 3. 实现用户修改密码功能。我们可以在控制器层编写一个修改密码方法,首先需要判断用户是否已经登录,如果没有登录则返回错误信息。如果已经登录,则从 Session 获取用户名,并根据用户名数据库查询该用户的信息。然后,我们可以通过调用实体类的 set 方法修改用户的密码属性,再通过调用 DAO 层的 update 方法更新数据库的数据。最后,返回修改成功的提示信息。 下面是一个简单的代码示例: User 实体类: ```java public class User { private int id; private String username; private String password; // 省略 getter 和 setter 方法 } ``` 控制器层: ```java @Controller public class UserController { @Autowired private UserDao userDao; @PostMapping("/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) { User user = userDao.findUserByUsernameAndPassword(username, password); if (user != null) { session.setAttribute("user", user); return "redirect:/home"; } else { return "login"; } } @PostMapping("/changePassword") @ResponseBody public String changePassword(@RequestParam("oldPassword") String oldPassword, @RequestParam("newPassword") String newPassword, HttpSession session) { User user = (User) session.getAttribute("user"); if (user == null) { return "请先登录"; } else { if (!user.getPassword().equals(oldPassword)) { return "原密码不正确"; } user.setPassword(newPassword); userDao.updateUser(user); return "修改成功"; } } } ``` DAO 层: ```java @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public User findUserByUsernameAndPassword(String username, String password) { String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; List<User> users = jdbcTemplate.query(sql, new Object[]{username, password}, new BeanPropertyRowMapper<>(User.class)); return users.size() > 0 ? users.get(0) : null; } public void updateUser(User user) { String sql = "UPDATE user SET password = ? WHERE username = ?"; jdbcTemplate.update(sql, user.getPassword(), user.getUsername()); } } ``` 这个例子,我们使用Spring MVC 框架和 Spring JDBC 模板来实现数据库连接和操作。在登录和修改密码方法,我们通过 HttpSession 对象来存储用户的登录状态。在修改密码方法,我们通过调用 User 实体类的 setPassword 方法来修改用户的密码属性。最后,我们通过调用 DAO 层的 update 方法来更新数据库的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值