项目简介
本项目是一个简单的图书管理系统,本博客在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&serverTimezone=Asia/Shanghai&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文件【注意】易错点& 和 &;
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
【注意】易错点& 和 &;
注意在xml文件中,要用
&
而在其他文件中,要用&
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必须一一对应
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/165112.html