JavaWeb利用Mybatis实现登陆功能(分层思想入门)

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

结语

如果你发现文章有什么问题,欢迎留言指正。
如果你觉得这篇文章还可以,别忘记点个赞加个关注再走哦。
如果你不嫌弃,还可以关注微信公众号———梦码城(持续更新中)。
梦码在这里感激不尽!!

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,下面是一个简单的 JavaWeb 分层实现注册功能的案例: 首先,我们需要创建一个 User 实体类,保存用户信息: ```java public class User { private int id; private String username; private String password; private String email; // 省略 getter 和 setter 方法 } ``` 接着,我们创建一个 UserDao 接口,定义增删改查等操作: ```java public interface UserDao { // 添加用户 void addUser(User user) throws SQLException; // 根据用户名查找用户 User findUserByUsername(String username) throws SQLException; // 根据邮箱查找用户 User findUserByEmail(String email) throws SQLException; } ``` 然后,我们创建一个 UserDaoImpl 类,实现 UserDao 接口,实现具体的操作: ```java public class UserDaoImpl implements UserDao { // 获取数据库连接 private Connection getConnection() throws SQLException { // ... } @Override public void addUser(User user) throws SQLException { String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getPassword()); pstmt.setString(3, user.getEmail()); pstmt.executeUpdate(); } } @Override public User findUserByUsername(String username) throws SQLException { String sql = "SELECT * FROM users WHERE username = ?"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setEmail(rs.getString("email")); return user; } else { return null; } } } } @Override public User findUserByEmail(String email) throws SQLException { // 和 findUserByUsername 类似 } } ``` 最后,我们创建一个 UserService 类,调用 UserDao 的方法完成注册功能: ```java public class UserService { private UserDao userDao = new UserDaoImpl(); public void register(User user) throws SQLException { // 判断用户名是否已存在 User u = userDao.findUserByUsername(user.getUsername()); if (u != null) { throw new IllegalArgumentException("用户名已存在"); } // 判断邮箱是否已存在 u = userDao.findUserByEmail(user.getEmail()); if (u != null) { throw new IllegalArgumentException("邮箱已被注册"); } // 添加用户 userDao.addUser(user); } } ``` 这样,我们就完成了一个简单的 JavaWeb 分层实现注册功能的案例。需要注意的是,这里的数据库连接等细节并没有完全实现,需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦码城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值