数据库课设,然后想了一会就写了,写的比较简单,用的是SpringMVC+Mybatis,前端不是很厉害的我使用Jquery+Bootstarp+JSP来做视图层(在全栈的路上越行越远),下面是从报告里摘录中的一些东西:
系统功能模块图:
E-R图
使用的数据库是mysql,数据库名称为finance,使用UTF-8编码。
数据表信息:
(1)login
id:主键,登录账号。
pwd:登录密码。
(2)tab
id:与login表中的id连接的外键。
tab_no:主键自增,表的编号。
tab_name:表名。
(3)Info
tab_no:信息所属表的编号,与tab表中的tab_no连接的外键,级联修改,删除。
Info_no:信息的编号,主键自增。
id:与login表中的id连接的外键。
tab_name:与tab中相对应的表名。
amount:交易金额。
dat:交易日期。
detail:交易明细备注,选填。
表1 账号信息表login
属性名 |
含义 |
类型 |
说明 |
id |
登录账号 |
varchar |
主键,最长长度为20 |
pwd |
登录密码 |
varchar |
非空,最长长度为20 |
表2报表信息表tab
属性名 |
含义 |
类型 |
说明 |
tab_no |
表单编号 |
int |
主键,自增 |
id |
登录账号 |
varchar |
外键,最长长度为20 |
tab_name |
报表名称 |
varchar |
非空,最长长度为20 |
表3表内信息表info
属性名 |
含义 |
类型 |
说明 |
tab_no |
表单编号 |
int |
外键 |
id |
登录账号 |
varchar |
外键,最长长度为20 |
tab_name |
报表名称 |
varchar |
非空,最长长度为20 |
Info_no |
信息编号 |
int |
主键,自增 |
amount |
交易金额 |
double |
10位,小数点后2位 |
dat |
交易日期 |
date |
格式yyyy-mm-dd |
detail |
交易备注 |
varchar |
最长长度为100 |
创建数据库脚本:
CREATE DATABASE IF NOT EXISTS finance DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
use finance
create table login
(
id varchar(20) not null primary key,
pwd varchar(20) not null
)engine innodb default charset=utf8;
create table tab
(
id varchar(20)not null,
tab_no int primary key auto_increment,
tab_name varchar(20),
foreign key(id) references login(id)
)engine innodb default charset=utf8;
create table info
(
tab_no int,
info_no int primary key auto_increment,
id varchar(20),
tab_name varchar(20) not null,
amount double(10,2) default 0,
dat date,
detail varchar(100),
foreign key(id) references login(id),
foreign key(tab_no) references tab(tab_no) on delete cascade on update cascade
)engine innodb default charset=utf8;
项目文件基本框架:
概述:
controller包存放MVC框架中的控制器类,处理请求拦截,调用服务,页面跳转的作用。
dao包存放与数据库操作相关的类。
entity包存放实体类,也是POJO类,只有其对应的属性和get,set方法。
service包存放所进行的服务类。
resources中存放项目相关的Mybatis配置文件。
webapp中css,js,img为jsp中要用到的静态资源,jsp中存放着jsp页面,spring-servlet.xml为springMVC 的配置文件
核心代码:
(1)service包中Finance类:存放与主页效果的业务代码.
@Service
public class Finance {
public static Reaction adjPWd(String id,String bpwd,String npwd)//修改密码
{
Reaction reaction=new Reaction();
if(bpwd.equals(LoginDao.checkLogin(id)))
{
Login login=new Login();
login.setId(id);
login.setPwd(npwd);
LoginDao.updatePwd(login);
reaction.setTag(0);
reaction.setWords("密码修改成功!");
}
else
{
reaction.setTag(1);
reaction.setWords("密码修改失败,原密码不正确");
}
return reaction;
}
public static void deleteTable(Integer table_no)//删除报表
{
TabDao.deleteTab(table_no);
}
public static List<Info> findAllInfoByNo(Integer tab_no)//通过表名来查找属于id的表信息
{
Info info=new Info();
List<Info>l=InfoDao.findAllInfo(tab_no);
Collections.sort(l);
return l;
}
public static List<Info> findInfoByMessage(String id,String year,String month,String table_name)//通过年月和表名查找该年月的交易信息
{
Message message=new Message();
message.setName(table_name);
message.setId(id);
message.setYear(year);
message.setMonth(month);
List<Info>l=InfoDao.findInfoByMessage(message);
Collections.sort(l);
return l;
}
public static void adjTable(Integer table_no,String table_name)//修改报表信息
{
Tab tab=new Tab();
tab.setTab_no(table_no);
tab.setTab_name(table_name);
TabDao.updateTab(tab);
InfoDao.updateInfoName(tab);//对info进行级联修改
}
public static void insertTable(String id,String table_name)//添加一张表格
{
Tab tab=new Tab();
tab.setTab_name(table_name);
tab.setId(id);
TabDao.insertTab(tab);
}
}
(2)resources中的Tab.xml配置文件,配置着Mybatis中与info表相关的数据库操作信息。
<mapper namespace="domain2">
<resultMap type="entity.Tab" id="tab">
<result column="id" property="id" javaType="string"/>
<result column="tab_no" property="tab_no" javaType="int"/>
<result column="tab_name" property="tab_name" javaType="string"/>
</resultMap>
<!--查询一个用户拥有的报表-->
<select id="findTabById" parameterType="java.lang.String" resultMap="tab">
select * from tab where id = '${value}'
</select>
<!--根据报表名称和id查询no-->
<select id="findTabByName" parameterType="entity.Tab" resultType="Integer">
select tab_no from tab where id = #{id} and tab_name = #{tab_name}
</select>
<!--插入一份报表-->
<insert id="insertTab" parameterType="entity.Tab">
insert into tab values(#{id},default,#{tab_name})
</insert>
<!--删除一份报表-->
<delete id="deleteTab" parameterType="java.lang.Integer">
delete from tab where tab_no ='${value}'
</delete>
<!--更新报表信息-->
<update id="updateTab" parameterType="entity.Tab">
update tab set tab_name = #{tab_name} where tab_no = #{tab_no}
</update>
</mapper>
(3)resources中的Info.xml配置文件,配置着Mybatis中与info表相关的数据库操作信息。
<mapper namespace="domain3">
<resultMap type="entity.Info" id="info">
<result column="tab_no" property="tab_no" javaType="int"/>
<result column="info_no" property="info_no" javaType="int"/>
<result column="id" property="id" javaType="string"/>
<result column="tab_name" property="tab_name" javaType="string"/>
<result column="dat" property="dat" jdbcType="DATE" javaType="string"/>
<result column="amount" property="amount" javaType="double"/>
<result column="detail" property="detail" javaType="string"/>
</resultMap>
<!--查询一个用户报表中所有的交易记录 -->
<select id="findAllInfo" parameterType="java.lang.Integer" resultMap="info">
select * from info where tab_no ='${value}'
</select>
<!--通过年份和月份查询一份表的交易记录-->
<select id="findInfoByMessage" parameterType="entity.Message" resultMap="info">
select * from info where id = #{id} and tab_name = #{name} and year(dat) = #{year} and month(dat) = #{month}
</select>
<!--插入交易信息-->
<insert id="insertInfo" parameterType="entity.Info">
insert into info values(#{tab_no},default,#{id},#{tab_name},#{amount},str_to_date(#{dat},'%Y-%m-%d'),#{detail})
</insert>
<!--删除交易信息-->
<delete id="deleteOneInfo" parameterType="java.lang.Integer">
delete from info where info_no = '${value}'
</delete>
<!--更新报表信息-->
<update id="updateInfo" parameterType="entity.Info">
update info set detail = #{detail},dat = #{dat} ,amount = #{amount},tab_name=#{tab_name } where info_no = #{info_no}
</update>
<!--级联更新表名-->
<update id="updateInfoName" parameterType="entity.Tab">
update info set tab_name = #{tab_name} where tab_no = #{tab_no}
</update>
</mapper>
效果图:
(1)登录界面
(2)个人主页
(3)报表管理
(4)报表查询
(5)报表修改
(6)导出报表
本次课设学习的地方:
1.SpringMVC访问静态资源方法
在web.xml中添加
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>/assets/*"</url-pattern>
<url-pattern>/img/*</url-pattern>
</servlet-mapping>
大体就是这些结尾的文件跳过拦截转发使用原来路径进行访问,注意要添加在DispatcherServlet之前,要不然会失效
还有就是静态资源不能放在WEB-INF下,因为原路径无法访问其中资源
2.SpringMVC处理中文乱码问题
把这段代码加入到
web.xml中
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.外键声明级联修改方法
foreign key(tab_no) references tab(tab_no) on delete cascade on update cascade
4.Mybatis对日期类的处理
<?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">
<mapper namespace="domain3">
<resultMap type="entity.Info" id="info">
<result column="tab_no" property="tab_no" javaType="int"/>
<result column="info_no" property="info_no" javaType="int"/>
<result column="id" property="id" javaType="string"/>
<result column="tab_name" property="tab_name" javaType="string"/>
<result column="dat" property="dat" jdbcType="DATE" javaType="string"/>
<result column="amount" property="amount" javaType="double"/>
<result column="detail" property="detail" javaType="string"/>
</resultMap>
<!--查询一个用户报表中所有的交易记录 -->
<select id="findAllInfo" parameterType="java.lang.Integer" resultMap="info">
select * from info where tab_no ='${value}'
</select>
<!--通过年份和月份查询一份表的交易记录-->
<select id="findInfoByMessage" parameterType="entity.Message" resultMap="info">
select * from info where id = #{id} and tab_name = #{name} and year(dat) = #{year} and month(dat) = #{month}
</select>
<!--插入交易信息-->
<insert id="insertInfo" parameterType="entity.Info">
insert into info values(#{tab_no},default,#{id},#{tab_name},#{amount},str_to_date(#{dat},'%Y-%m-%d'),#{detail})
</insert>
<!--删除交易信息-->
<delete id="deleteOneInfo" parameterType="java.lang.Integer">
delete from info where info_no = '${value}'
</delete>
<!--更新报表信息-->
<update id="updateInfo" parameterType="entity.Info">
update info set detail = #{detail},dat = #{dat} ,amount = #{amount},tab_name=#{tab_name } where info_no = #{info_no}
</update>
<!--级联更新表名-->
<update id="updateInfoName" parameterType="entity.Tab">
update info set tab_name = #{tab_name} where tab_no = #{tab_no}
</update>
</mapper>
其中日期类我在pojo中使用的是string来储存,在mysql中却用的是date类,要特殊处理下:
<insert id="insertInfo" parameterType="entity.Info">
insert into info values(#{tab_no},default,#{id},#{tab_name},#{amount},str_to_date(#{dat},'%Y-%m-%d'),#{detail})
</insert>
使用str_to_date方法对字符串进行转化存储。
然后此处我写的不够好,可以使用jqueryUI中的日历插件可以简化而且更美观进行日期的输入
5.使用Collections.sort排序
想要按照指定要求对一个类的List进行排序,则要重写类的CompareTo函数:
此处我根据两字符串的字典序大小进行了排序:
public int compareTo(Info info) {
String s1=dat;
String s2=info.getDat();
if(s1.compareTo(s2)<0)
{
return -1;
}
return 0;
}