JavaWeb利用Mybatis实现登陆功能(分层思想入门)
分层思想介绍
分层思想(解耦:高内聚低耦合)
controller层
接收请求(负责调用service层,返回响应结果给前端)【所有servlet都写在这个文件夹下】
service层
业务逻辑处理(由controller层的servlet类调用,需要的参数由controller层提供,将处理后的结果返回给contriller层)【一般包含msg,code,object】
mapper(Dao)层
一个接口类 (负责返回经过数据库操作后得到的对象)
一个mapper.xml (负责mybatis与数据库的相关操作,写的数据库语句在这里面写)
entity (po、model)【MessageModel在vo文件夹中】
JavaBean实体(一个对象一个实体类)
util 工具类(通用的方法和类)【获取数据库操作对象以及其它公共方法】
test 测试方法/测试类
登录的业务逻辑
controller层(接受请求,响应结果)
1.接收客户端的请求(接收参数;姓名,密码)
2.调用service层的方法,返回消息模型对象
3.判断消息模的状态码
如果状态码是失败
将消息模型对象设置到request作用域中,请求转发跳转到login.jsp
如果状态码是成功
将消息模型中的用户信息设置到session中,重定向跳转到index.jsp
service层(业务逻辑)
1.参数的非空判断
如果参数为空
将状态码、提示信息、回显数据色号知道消息模型对象中,返回消息模型对象
2.调用Dao(mapper)层的查询方法,通过用户名查询用户对象
3.判断用户对象是否为空
将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
4.判断数据库中查询到的用户密码与前台传递过来的密码作比较
如果不相等,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
5.将成功状态、提示信息、用户对象设置到消息模型对象,并return
mapper(Dao层)
定义对应的接口
UserServlet【controller层】
package com.student.controller;
import com.student.entity.vo.MessageModel;
import com.student.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login")
public class UserServlet extends HttpServlet {
//实例化UserService对象
private UserService userService = new UserService();
/**
* 用户登录
* 1.接收客户端的请求(接收参数;姓名,密码)
* 2.调用service层的方法,返回消息模型对象
* 3.判断消息模的状态码
* 如果状态码是失败
* 将消息模型对象设置到request作用域中,请求转发跳转到login.jsp
* 如果状态码是成功
* 将消息模型中的用户信息设置到session中,重定向跳转到index.jsp
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.接收客户端的请求(接收参数;姓名,密码)
String username = new String(req.getParameter("userName").getBytes("ISO-8859-1"),"utf-8");
String password = req.getParameter("userPassword");
// 2.调用service层的方法,返回消息模型对象
MessageModel messageModel = userService.userLogin(username, password);
// 3.判断消息模的状态码
if (messageModel.getCode() == 1) {//成功
System.out.println("登录成功");
req.getSession().setAttribute("user", messageModel.getObject());
resp.sendRedirect("index.jsp");
} else { //失败
// System.out.println("登录失败");
//将消息模型对象设置到request作用域中,请求转发跳转到login.jsp
req.setAttribute("messageModel", messageModel);
// resp.sendRedirect("index.jsp");
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
}
entity【消息模型与用户模型】
消息模型【MessageModel】
package com.student.entity.vo;
/**
* 消息模型对象(数据响应)
* 状态码
* 1=成功 0=失败
* 提示信息
* 字符串
* 回显数据
* object对象
*/
public class MessageModel {
private Integer code = 1; // 状态码
private String msg = "成功"; // 提示信息
private Object object; // 回显对象(基本数据类型,字符串类型、List、Map)
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
用户模型【User】
package com.student.entity;
/**
* User实体类
*/
public class User {
private Integer userId; // 用户编号
private String userName; // 用户姓名
private String userPassword; // 用户密码
private Integer userAge; // 用户年龄
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
}
mapper(Dao)层
UserMaper
package com.student.mapper;
import com.student.entity.User;
/**
* 用户接口类
*/
public interface UserMapper {
public User queryUserByName(String userName);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 首先来解析 namespace:命名空间,此属性通常用来映射Dao(Mapper)层接口 -->
<mapper namespace="com.student.mapper.UserMapper">
<!-- id:对应Dao(Mapper)层接口方法名 parameterType:指定输入参数类型 resultType:对应返回参数类型 username:传递的参数-->
<!-- useGeneratedKeys="true" 把新增加的主键赋值到自己定义的keyProperty(id) 中 -->
<select id="queryUserByName" parameterType="String" resultType="com.student.entity.User">
SELECT *
FROM user
WHERE userName = #{userName}
</select>
</mapper>
service层
package com.student.service;
import com.student.entity.User;
import com.student.entity.vo.MessageModel;
import com.student.mapper.UserMapper;
import com.student.util.GetSqlSession;
import com.student.util.StringUtil;
import org.apache.ibatis.session.SqlSession;
/**
* 用户业务逻辑
* 1.参数的非空判断
* 如果参数为空
* 将状态码、提示信息、回显数据色号知道消息模型对象中,返回消息模型对象
* 2.调用Dao(mapper)层的查询方法,通过用户名查询用户对象
* 3.判断用户对象是否为空
* 将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
* 4.判断数据库中查询到的用户密码与前台传递过来的密码作比较
* 如果不相等,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
* 5.将成功状态、提示信息、用户对象设置到消息模型对象,并return
*/
public class UserService {
public MessageModel userLogin(String username, String password) {
MessageModel messageModel = new MessageModel();
User user = new User();
user.setUserName(username);
user.setUserPassword(password);
messageModel.setObject(user);
//1.参数的非空判断
if (StringUtil.isEmpty(username) || StringUtil.isEmpty(password)) {
//将状态码、提示信息、回显数据色号知道消息模型对象中,返回消息模型对象
messageModel.setCode(0);
messageModel.setMsg("用户姓名和密码不能为空");
//回显数据
return messageModel;
}
//2.调用Dao(mapper)层的查询方法,通过用户名查询用户对象
SqlSession session = GetSqlSession.createSqlSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User u = userMapper.queryUserByName(username);
//3.判断用户对象是否为空
if (u == null) {
//将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
messageModel.setCode(0);
messageModel.setMsg("用户不存在");
return messageModel;
}
//4.判断数据库中查询到的用户密码与前台传递过来的密码作比较,如果不相等,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
if (!password.equals(u.getUserPassword())) {
//密码不正确
messageModel.setCode(0);
messageModel.setMsg("用户密码不正确");
return messageModel;
}
//5.将成功状态、提示信息、用户对象设置到消息模型对象,并return
messageModel.setObject(user);
return messageModel;
}
}
util层
GetSqlSession
package com.student.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class GetSqlSession {
public static SqlSession createSqlSession() {
SqlSessionFactory sqlSessionFactory = null;
InputStream input = null;
SqlSession session = null;
try {
// 1 获取mybatis的环境配置文件
String resource = "mybatis-config.xml";
// 2 以流的方式获取resource(mybatis的配置文件)
input = Resources.getResourceAsStream(resource);
// 3 创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
// 4 通过工厂得到SqlSession
session = sqlSessionFactory.openSession();
return session;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
System.out.println(createSqlSession());
}
}
StringUtil
package com.student.util;
/**
* 字符串工具类
*/
public class StringUtil {
/**
* 判断str是否为空
* @param str
* @return 如果为空返回true,否则返回false
*/
public static boolean isEmpty(String str){
if(str==null||"".equals(str.trim())){
return true;
}else{
return false;
}
}
}
resources引用文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- properties 标签中的配置可以提供整个配置文件使用,在任何位置都可以引入其中配置的值 -->
<!-- properties 标签可以通过子标签 property 标签来配置一些子元素信息,也可以配置外部的动态文件 -->
<properties resource="mysql.properties"/> <!-- 也可以配置url,但是url和resource只能存在一个 -->
<!-- 类型别名
<typeAliases>
在UserMapper.xml中的 resultType="com.student.entity.User" 可以直接替换为User
<typeAlias type="User" type="com.student.entity.User"></typeAlias>
</typeAliases>-->
<!--
对事务的管理和连接配置
development : 开发模式
work : 工作模式
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<!-- value属性值引用db.properties配置文件中配置的值 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper映射器 -->
<mappers>
<!-- 映射文件方式1:一个一个配置
<mapper resource="com/student/mapper/UserMapper.xml"></mapper>
<mapper class="com.student.mapper.UserMapper"></mapper>-->
<!-- 映射文件方式2:自动扫描包内的Mapper接口与配置文件 -->
<package name="com.student.mapper"/>
</mappers>
</configuration>
mysql.properties
# mysql 8.0 以上需要加cj com.mysql.cj.jdbc.Driver
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/student?serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8
#url=jdbc:mysql://localhost:3306/student?characterEncoding=UTF-8
name=root
password=root
结语
如果你发现文章有什么问题,欢迎留言指正。
如果你觉得这篇文章还可以,别忘记点个赞加个关注再走哦。
如果你不嫌弃,还可以关注微信公众号———梦码城(持续更新中)。
梦码在这里感激不尽!!