用Spring + SpringMVC + Spring-JdbcTemplate实现登录模块

模块说明:Spring是一站式的框架,对web、service、dao层都提供了实现技术,本模块就是使用Spring框架对各层实现技术的搭建过程。。

登录模块功能简介:从实现上将模块分为web层、Dao层、Service层,数据库使用mysql 。 。


1.创建需要用到的数据库表


2.使用Spring的JDBC模板JdbcTemplate完成dao层的设计(也就是完成对数据库的访问操作)

本模块涉及到对两张数据表的操作,故有两个dao的类,分别对每个表执行相应的操作:

UserDao.java


@Repository(value="userDao")  //通过Spring注解定义一个Dao
public class UserDao{
    @Autowired
    private JdbcTemplate jdbcTemplate;

    //根据用户名和密码查询是否在数据库中存在记录,若存在返回1,否则返回0
    public int getMatchCount(String userName,String password){
        String sql = "select count(*) from spring_login "+
                " where username=? and password=?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userName,password},Integer.class);
    }
    
    //根据用户名查找定位到指定的用户
    public User findUserByUserName(final String userName){
        String  sql = "select userid,username,credits "
                +" from spring_login where username=?";
        final User user = new User();
        jdbcTemplate.query(sql,new Object[]{userName},
                new RowCallbackHandler(){
                    public void processRow(ResultSet rs) throws SQLException{
                        user.setUserid(rs.getInt("userid"));
                        user.setUsername(userName);
                        user.setCredits(rs.getInt("credits"));
                    }
        });    
        return user;       
    }

  //更新用户信息

    public void updateLoginInfo(User user){
        String sql = "update spring_login set last_visit=?,credits=? "
                +" where userid=?";
        jdbcTemplate.update(sql, new Object[]{user.getLast_visit(),user.getCredits(),user.getUserid()});
    }


}


LoginLogDao.java

@Repository(value="loginLogDao")
public class LoginLogDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void insertLog(LoginLog loginLog){
        String sql = "insert into spring_loginlog(userid,ip,login_datetime)"
                +"  values(?,?,?)";
        Object[] args={loginLog.getUserid(),loginLog.getIp(),loginLog.getLoginDate()};
        jdbcTemplate.update(sql, args);
    }
    
}


3.在完成对数据库操作的dao层编码后,编写service层代码,用来调用dao层,实现业务逻辑处理

UserService.java


@Service(value="userService")
public class UserService {

    @Autowired
    private UserDao userDao;
    
    @Autowired
    private LoginLogDao loginLogDao;

    //根据用户名密码判断数据库中是否有对应的记录
    public boolean hasMatchUser(String userName,String password){
        int matchCount = userDao.getMatchCount(userName, password);
        return matchCount > 0;
    }
    
    //按用户名查找用户
    public User findUserByUserName(String userName){
        return userDao.findUserByUserName(userName);
    }
    
    public void loginSuccess(User user){
        user.setCredits(5+user.getCredits());
        LoginLog loginLog = new LoginLog();
        loginLog.setUserid(user.getUserid());
        loginLog.setLoginDate(user.getLast_visit());
        userDao.updateLoginInfo(user);
        loginLogDao.insertLog(loginLog);
    }
    
}


4.接下来就到了web层的编码, 使用SpringMVC

LoginController.java


@Controller //标注成为一个Spring MVC的controller
public class LoginController {

    @Autowired
    private UserService userService;
    
    //负责处理/index.html的请求
    @RequestMapping(value="/index.html")
    public String loginPage(){
        return "login";
    }
    
    //负责处理/loginCheck.html的请求
    @RequestMapping(value="/loginCheck.html")
    public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){
        boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(), loginCommand.getPassword());
        if(!isValidUser){
            return new ModelAndView("login","error","用户名或密码错误。");
        }else{
            User user = userService.findUserByUserName(loginCommand.getUserName());
            user.setLast_visit(new Date());
            userService.loginSuccess(user);
            request.getSession().setAttribute("user", user);
            return new ModelAndView("main");
        }
        
    }
    
}


以上就已经是完成了登录模块的实现,其上提供的都是模块中最核心的类。至于配置文件就不再一一给出,下面给出Spring的配置文件:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
   
   <!-- 指定扫描类包,使相应注解生效 -->

  <context:component-scan base-package="com.baobaotao"/>


   <!--配置数据源DataSource-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--指定连接数据库的驱动-->
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <!--指定连接数据库的URL-->
        <property name="url" value="jdbc:mysql://localhost:3306/mytest"></property>
        <!--指定连接数据库的用户名-->
        <property name="username" value="root"></property>
        <!--指定连接数据库的密码-->
        <property name="password" value="546784"></property>
    </bean>
    
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
    </bean>
    
    <!-- 通过aop配置提供事务增强,让service包下的所有bean的所有方法拥有事务 -->
    <aop:config proxy-target-class="true">
        <aop:pointcut expression="execution(* com.baobaotao.service..*(..))" id="serviceMethod"/>
        <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
</beans>



总结:以上是部分最核心的代码,本次记录只是为了留住代码,方便以后能够重用。这个模块的实现,我是跟着教材一步步做的,在功能逻辑上还算清晰。遇到的问题:在调试过程中,由于在我参照的代码中没有给我提供具体的jar包,所以在调试的时候报了好几个找不到jar包的错误。在jar包都引入后,还是没有直接成功,在一直调试灭有成功后,我试着写单元测试,后来发现是service层配置的有问题,于是我慢慢屏蔽代码需找错误,最后的错误就是我事务配置的格式的那个表达式写的不对(我看的视频教的事务配置只是列举一个,然后本模块是用到了另一个配置,然后我就使用自己看视频的那个配置经验来,以为是可以的,结果是错的,哎,,果然还是要继续深入学习啊。。。)。虽然这次的功能逻辑不算复杂,但是在解决问题的过程中还是花了些许的时间,其实总结一句话就是还是经验不足,还是代码敲的不够多。。。

  目前已经来到公司实习,但好像公司暂时没有想让新人直接接触项目,于是乎我就“重操旧业”,继续学习spring、springmvc、mybatis等,,基础不够牢固,只能现在有空多补点了。机会是留个有准备的人的,也许下一个机会我的能力就会有所达到了,加油!



(ps:  这算是第一次写博客文章,不知道该怎么写,有写的不对的地方,希望大家多多批评指正!如果有能用的上的,那就一起相互交流学习)


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于SpringMVCJdbcTemplate的整合,可以通过以下步骤进行查询和删除操作: 1. 配置数据源和JdbcTemplate 首先,在Spring的配置文件中配置数据源和JdbcTemplate。您可以使用Spring的内置数据源,如`BasicDataSource`或`HikariDataSource`,并为其提供数据库连接信息。然后,将数据源注入到JdbcTemplate中。 2. 创建DAO层接口和实现类 在DAO(数据访问对象)层中,创建一个接口来定义查询和删除操作的方法。您可以使用JdbcTemplate提供的方法来执行SQL查询和删除语句。然后,在实现类中实现这些方法。 例如,创建一个名为`UserDAO`的接口,定义查询和删除方法: ```java public interface UserDAO { List<User> getAllUsers(); void deleteUser(int userId); } ``` 然后,创建一个名为`UserDAOImpl`的实现类: ```java public class UserDAOImpl implements UserDAO { private JdbcTemplate jdbcTemplate; public UserDAOImpl(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public List<User> getAllUsers() { String sql = "SELECT * FROM users"; List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); return users; } public void deleteUser(int userId) { String sql = "DELETE FROM users WHERE id = ?"; jdbcTemplate.update(sql, userId); } } ``` 3. 创建Service层 接下来,在Service层中使用DAO层的实现类来提供业务逻辑。创建一个名为`UserService`的接口,并在实现类中注入`UserDAO`。 ```java public interface UserService { List<User> getAllUsers(); void deleteUser(int userId); } ``` ```java public class UserServiceImpl implements UserService { private UserDAO userDAO; public UserServiceImpl(UserDAO userDAO) { this.userDAO = userDAO; } public List<User> getAllUsers() { return userDAO.getAllUsers(); } public void deleteUser(int userId) { userDAO.deleteUser(userId); } } ``` 4. 创建Controller层 最后,在Controller层中使用Service层的实现类来处理HTTP请求。创建一个名为`UserController`的类,并在其中注入`UserService`。 ```java @Controller @RequestMapping("/users") public class UserController { private UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping public String getAllUsers(Model model) { List<User> users = userService.getAllUsers(); model.addAttribute("users", users); return "users"; } @PostMapping("/{id}/delete") public String deleteUser(@PathVariable("id") int userId) { userService.deleteUser(userId); return "redirect:/users"; } } ``` 在上述示例中,`getAllUsers`方法用于获取所有用户,并将其添加到Model中以供视图渲染。`deleteUser`方法用于删除指定ID的用户,并通过重定向返回到用户列表页面。 这样,您就可以使用SpringMVCJdbcTemplate进行查询和删除操作了。当然,您还可以根据具体需求进行扩展和优化。希望对您有所帮助!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值