- 一、单机版
- 二、引入分层
- 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,是将连接放回连接池中



