JavaWeb项目【源码】——图书项目3.0:Tomcat版本 & Mybatis + vue + axios + js + mysql + log4j 技术栈实现


项目简介

本项目是一个简单的图书管理系统,本博客在tomcat中采用servlet 和vue和mybatis技术实现如下功能:

  • 用户登陆,输入用户名,密码,登陆成功后保存到session中,跳转到首页;
  • 用户注册,输入相关信息,以及验证码,注册成功到登陆页面;
  • 用户信息修改,昵称修改,密码修改;
  • 图书信息页面:展示所有信息,到数据分页显示,到分页展示+模糊查询+只看自己的书;
  • 新增图书信息,新增一条图书信息,类型下拉框选择,书名,简介输入,session中获取用户名和id,数据插入数据库中,再回到图书信息页面;
  • 删除图书信息:只能删除自己的书,删除成功再回到图书信息页面;
  • 修改图书信息:原有的信息进行回显,修改成功后再回到图书信息页面;
  • 图书类型分类统计:按照图书类型进行统计,数量为0显示0

在这里插入图片描述
版本的迭代和更新:

思考 & 改进

1.Jsp都是同步请求---->改成异步Ajax【完成】

2.前端用Jsp技术落后----->用Vue框架【完成】

3.架构问题:配置数据和Java代码耦合【完成】

3.SQL语句和Java代码耦合【完成】

在这里插入图片描述

4.架构问题:servlet只能处理一个请求

在这里插入图片描述

5.响应方式为响应一个Json,但是servlet写法很繁琐

resp.getWriter().write(JSON.toJSONString(new ResData(

        // 4.new PageInfo对象,共享页数等,以及查询到的数据
        List<Company> list = companyService.queryByLikeNameLimit(pageNum, pageSize,name);
        PageInfo<Company> pageInfo = new PageInfo<>(pageNum, pageSize, total, pages, list);

        resp.getWriter().write(JSON.toJSONString(
                new ResData(200, "ok", pageInfo)
        ));

6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换

        String name = req.getParameter("name");
        String typeId = req.getParameter("typeId");
        String birthday = req.getParameter("birthday");

当用的时候,如果想要的类型其实不是String,还需要自己转换格式

        // 日期类型转换
        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            comUser.setBirthday(sdf.parse(birthday));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        
        // int类型转换
        opus.setTypeId(Integer.parseInt(typeId));

用mybatis框架解耦SQL和Java

在这里插入图片描述

  • mybatis 是一个优秀的基于 java 的持久层框架,主要应用于关系型数据库(sql),它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement ,封装数据等繁杂的过程。

  • mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

  • 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

ORM思想是什么?

ORM(Object Relation Mapping)对象关系映射,是一种思想,主要包含三种对应关系:

关系映射对应关系
类和表对应一个pojo类 ←→ 一张数据库表
字段和列名对应pojo类中的一个字段 ←→ 数据库表中的一列
类实例化对象和数据对应pojo类的一个对象 ←→ 数据库表中的一行数据

ORM思想是所有持久层框架的基本思想,也是目前所有数据传输的思想。就是把数据和对象一一对应起来。从本质上来说SpringMVC也是做的这样的事情,数据在页面时,传到后台就成了对象。

在这里插入图片描述

1.导包pom.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
<!--    引入其他properties文件,顺序必须是这样,放在开始-->
<!--    <properties resource="jdbc.properties"></properties>-->
    <properties resource="jdbc.properties"/>

<!-- 数据库和实体类 驼峰的问题 :开启驼峰命名-->
    <settings>
<!--        处理驼峰命名-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
<!--        日志生效-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

<!--    别名 给所有的实体类都起一个别名com.tianju.entity,所有别名都是类名的首字母小写-->
    <typeAliases>
        <package name="com.tianju.entity"/>

    </typeAliases>

<!--    分页需要加个拦截器-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>

<!--    连接数据库相关-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                此时,就可以用${jdbc.driverClass}获取properties文件中的值-->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.connectionURL}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>

<!--                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!--                <property name="url" value="jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/>-->
<!--                <property name="username" value="root"/>-->
<!--                <property name="password" value="123"/>-->
            </dataSource>
        </environment>
    </environments>
<!--    告诉配置文件,sql的xml文件在哪,java找用.  普通文件用 /-->
    <mappers>
<!--        简化方式,不然得写很多mapper-->
<!--        <mapper resource="com/tianju/dao/UserMapper.xml"/>-->
        <package name="com.tianju.dao"/>
    </mappers>

</configuration>

2.jdbc.properties文件【注意】易错点& 和 &amp;

jdbc.driverClass = com.mysql.cj.jdbc.Driver
jdbc.connectionURL = jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
#jdbc.connectionURL = "jdbc:mysql://"+ip+"?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"
jdbc.username = root
jdbc.password = 123

【注意】易错点& 和 &amp;

注意在xml文件中,要用

&amp;

而在其他文件中,要用&

3.log4j.properties日志配置文件

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
#log4j.rootCategory=debug, CONSOLE, LOGFILE
# ??LOGFILE?????????
log4j.rootCategory=debug, CONSOLE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

思考 & 改进

4.架构问题:servlet只能处理一个请求

在这里插入图片描述

5.响应方式为响应一个Json,但是servlet写法很繁琐

resp.getWriter().write(JSON.toJSONString(new ResData(

        // 4.new PageInfo对象,共享页数等,以及查询到的数据
        List<Company> list = companyService.queryByLikeNameLimit(pageNum, pageSize,name);
        PageInfo<Company> pageInfo = new PageInfo<>(pageNum, pageSize, total, pages, list);

        resp.getWriter().write(JSON.toJSONString(
                new ResData(200, "ok", pageInfo)
        ));

6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换

        String name = req.getParameter("name");
        String typeId = req.getParameter("typeId");
        String birthday = req.getParameter("birthday");

当用的时候,如果想要的类型其实不是String,还需要自己转换格式

        // 日期类型转换
        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            comUser.setBirthday(sdf.parse(birthday));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        
        // int类型转换
        opus.setTypeId(Integer.parseInt(typeId));

7.全局配置文件繁琐,xml和java必须一一对应

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Arya's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值