栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

day36、37 java Spring 模拟登录

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

day36、37 java Spring 模拟登录

文章目录
  • 一、单机版
  • 二、引入分层
    • 1、优化:连接池
    • 2、优化:加入缓冲
  • 总结


I know, i know
地球另一端有你陪我




一、单机版
package com.fgh.spring.test;

import com.fgh.spring.util.JDBCUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

@RestController
public class UserController {

    @RequestMapping("/test")
    public String test() {
        return "start2";
    }

    @RequestMapping("/login")
    public String login(String name, String pass) {
        if (!"root".equals(name) || !"123456".equals(pass)) {
            return "失败";
        }
        return "成功";
    }

    @RequestMapping("/userlogin")
    public String userlogin(String name, String pass) {

        try {

            JDBCUtil.getConn();
            String sql = "select * from user where username=?";
            PreparedStatement ps = JDBCUtil.getPs(sql);
            ps.setString(1,name);
            ResultSet rs = JDBCUtil.getRs();

            if (!rs.next()) {
                return "用户名不存在";
            }

            User user = new User(rs.getString("id"),
                    rs.getString("username"),
                    rs.getString("password"));

            if (!user.getPassword().equals(pass)) {
                return "密码错误";
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "登录成功";
    }

}

二、引入分层

bean :存放资源文件
controller :表现层 / 前端界面
service :业务逻辑层 / 逻辑验证
dao :持久层 / 连接SQL
bean
存储对象类的基本信息
需要导包
lombok.jar

package com.fgh.spring.mvc.bean;

import lombok.*;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    private String id;
    private String username;
    private String password;
}

dao

package com.fgh.spring.mvc.dao;

import com.fgh.spring.mvc.bean.User;
import com.fgh.spring.util.JDBCUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {

    //连接数据库
    //按照输入的name从数据库中获得对应的数据
    //存储到 user 对象之中,并返回
    public User getuser(String username){
    User user=null;
    try {
        Connection conn = JDBCUtil.getConn();
        String sql = "select * from user where username=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,username);
        ResultSet rs = ps.executeQuery();
        if(rs.next()){
        	user = new User();
            user.setId(rs.getString("id"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
            rs.close();
            ps.close();
            //此处连接的关闭,是将连接放回连接池
            conn.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return user;
    }
}

service

package com.fgh.spring.mvc.service;

import com.fgh.spring.mvc.bean.User;
import com.fgh.spring.mvc.dao.UserDao;
//业务逻辑层 验证
public class UserService {
    public String checkUser(String username, String password) {
        if (username == null) {
            return "请填写用户名";
        }

        UserDao ud = new UserDao();
        User user = ud.getuser(username);

        if (user == null) {
            return "用户名不存在";
        }

        if (!user.getPassword().equals(password)) {
            return "用户名或密码错误";
        }
        return "登陆成功";
    }
}

controller

package com.fgh.spring.mvc.controller;

import com.fgh.spring.mvc.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(String username,String password){
        UserService us = new UserService();
        String message = us.checkUser(username, password);
        return message;
    }
}
1、优化:连接池

需要导包
dbcp2.jar
一个池子里塞多个连接

JDBCUtil JDBC工具

package com.fgh.spring.util;



import org.apache.commons.dbcp2.BasicDataSource;

import java.sql.Connection;
import java.sql.SQLException;

public class JDBCUtil {

    private static BasicDataSource bds;

    //创建连接池
    static{
        //创建连接池对象
        bds = new BasicDataSource();
        //配置连接池大小
        bds.setInitialSize(5);

        //配置连接信息
        bds.setUrl("jdbc:mysql://master:3306/fghdata?useUnicode=true&characterEncoding=utf-8");
        bds.setDriverClassName("com.mysql.jdbc.Driver");
        bds.setUsername("root");
        bds.setPassword("123456");
    }

    public static Connection getConn(){
        try {
            return bds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}
2、优化:加入缓冲

缓冲是应对被高频访问的对象
将对象提前提前取出并储存,跳过搜索数据库步骤
可以大幅度提高效率
考虑到其特性,此处使用 HashMap 实现

service

    //创建 HashMap 作为缓冲区
    private static HashMap map = new HashMap();
    public String selectUser(String id) {
        
        // 先查缓存 有:直接返回数据
        if (map.containsKey(id)) {
            System.out.println("存在");
            return map.get(id).toString();
        }
        //1.2没有:去数据库中查,并把结果保存到缓存
        UserDao userDao = new UserDao();
        User students = userDao.select(id);
        if (students == null) {
            return "用户不存在";
        }
        map.put(students.getId(), students);
        System.out.println("存储到缓存" + map.get(id).getId());
        return students.toString();
    }

总结

1、executeQuery()返回的是一个以 map 为元素的 set 集合
      该 map 内部是一对一,或一对多的键值对

2、@RequestMapping 不允许重名

3、地址中,使用?username=xxx&password=xxx,进行传参

4、executequarry 返回的并不是一个集合,可以理解为是一个 sql 表格
      可以通过列名获得一整列元素

5、连接池中的 close,是将连接放回连接池中

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号