三层模拟登录原理如下图:
1、准备数据
-- 创建库
create database db1;
-- 创建数据表 user
create table user(
id int primary key auto_increment,
username varchar(20) unique not null,
password varchar(20) not null,
email varchar(40) not null
);
-- 插入一些数据记录
insert into user values(null,'zhangsan','333','zhangsan@baidu.com');
insert into user values(null,'lisi','222','lisi@baidu.com');
insert into user values(null,'wangwu','111','wangwu@baidu.com');
2、新建User实体类(com.javaEE.user)
package com.javaEE.user;
public class User {
private int id;
private String username;
private int password;
private String email;
public User(int id, String username, int password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
3、创建Web层、UserWeb类(com.javaEE.web)
package com.javaEE.web;
import com.javaEE.service.UserService;
import com.javaEE.user.User;
import java.util.Scanner;
public class UserWeb {
public static void main(String[] args) {
// 1. 模拟数据 : (键盘录入)
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
int pass = Integer.parseInt(sc.nextLine());
sc.close();
// 2. 将数据封装为对象
User user = new User();
user.setUsername(name);
user.setPassword(pass);
//将对象数据传给sevice层
UserService userService = new UserService();
User login = userService.login(user);
// 4. 判断返回的 `loginUser 对象`
if (login == null){
System.out.println("登录失败");
}else {
System.out.println("登录成功、用户名:"+login.getEmail());
}
}
}
运行结果:
4、创建service层、UserService类(com.javaEE.service)
package com.javaEE.service;
import com.javaEE.dao.UserDao;
import com.javaEE.user.User;
import java.util.List;
public class UserService {
public User login(User user) {
// 1. 创建一个 DAO 层对象
UserDao userDao = new UserDao();
// 2. 根据用户名和密码查询数据库中是否存在该用户
List<User> list = userDao.findNamePass(user);
// 3. 判断返回的 list 集合
if (list == null || list.size() == 0){
return null;
}else {
// 返回第 0 个下标的 User 对象.
return list.get(0);
}
}
}
5、创建Dao层、UserDao类(com.javaEE.dao)
package com.javaEE.dao;
import com.javaEE.Tools.JDBCUtils;
import com.javaEE.user.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Objects;
public class UserDao {
public List<User> findNamePass(User user) {
// 1. 创建一个 JDBCTemplate 核心类对象, 并同时将数据库连接池对象作为参数传入
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
//准备sql
String sql = "select * from user where username = ? and password = ?";
//准备参数
Object[] parms = {user.getUsername(),user.getPassword()};
// 2. 调用 jdbcTemplate 对象的 query 方法
List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class),parms);
// 3. 直接返回查询的数据
return query;
}
}
6、JDBCUtils工具类
package com.javaEE.Tools;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//JDBC c3p0
public class JDBCUtils {
//加载驱动
// 创建c3p0连接池对象、会自动加载src下c3p0-config.xml文件
private static DataSource dataSource = new ComboPooledDataSource();
// 提供方法得到内部私有的连接池对象
public static DataSource getDataSource() {
return dataSource;
}
//建立连接
public static Connection getconnect() throws SQLException {
return dataSource.getConnection();
}
//释放资源
public static void release(Connection conn, Statement stat, ResultSet rs){
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(conn,stat);
}
public static void release(Connection conn,Statement stat){
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
if (stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
7、c3p0-config.xml配置文件、在src目录下
<?xml version="1.0" encoding="UTF-8"?>
<!-- & 转换为 & -->
<c3p0-config>
<!-- 默认配置,c3p0框架默认加载这段默认配置 -->
<default-config>
<!-- 配置JDBC 四个基本属性 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&characterEncoding=utf-8</property>
<property name="user">root</property>
<property name="password">sswqzx</property>
</default-config>
<!-- 可以自定义配置,为这段配置起一个名字,c3p0指定名称加载配置 -->
<named-config name="ssw">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property>
<property name="user">root</property>
<property name="password">sswqzx</property>
</named-config>
</c3p0-config>