ssh学习笔记--简易选课系统的实现思路

目录

 

 

环境:eclipse+spring+struts2+hibernate

 

hibernate学习

第一部分环境配置:

 

1.添加hibernate的jar包     lib/required2.添加struts2的jar包     apps/解压一个项目blank/lib3.添加mysql数据库连接驱动4.添加struts2的配置文件struts.xml5.添加hibernate的配置文件hibernate.cfg.xml1. hibernate.cfg.xml

2. model包中,新建一个javabean Student,并且在此包中新建一个xml文件,名字叫  Student.hbn.xml

3. junit测试,add jar junit新建一个test包,包中新建一个class  myapp来测试

4.run as junit即可实现将该student信息插入到表student中

5,数据库表curricula 数据库=========================================学生Student(id,name,pwd,phone,grade,photo)

1.创建javabean

2.建立映射文件(这样配置映射关系比较麻烦)

3.测试程序

4.用注解方式配置映射关系(方便,推荐)

几个概念

多表关联查询:select 图书名称,名称 ,价格 from 图书表,图书类别表 where 图书表.类别=图书类别表.id

学生选课系统项目需求:

双向关系和单向关系

sql与hqlsql:查找数据库记录hql:hibernate query language 查找对象 

4.$.ajax({});//默认是异步的,需要设置属性 async:"false",此时同步

用户图片上传到服务器:    思路:    1\表单 input type="file" name="image"    2\action 三个成员:    File image;(含图片的全路径)    String fileContentType    string imageFileName(   xxx.jpg)    3\生成唯一图片名称    uploadfiles\年\月\日\hour+second+millisecond    图片更新:    检测前台是否传来新图片    旧图片删除(判断旧图片是否存在,若存在就删除)

犯下的错:注解应该放到get前面,不要放到set前面,会报错的

分页:

防止表单重复提交:

学生与课程间的多对多关系


 

环境:eclipse+spring+struts2+hibernate

 

hibernate学习

第一部分环境配置:

 

 

  • 1.添加hibernate的jar包     lib/required

  • 2.添加struts2的jar包     apps/解压一个项目blank/lib

  • 3.添加mysql数据库连接驱动

  • 4.添加struts2的配置文件struts.xml

  • 5.添加hibernate的配置文件hibernate.cfg.xml

1. hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 

<hibernate-configuration>
    <session-factory >
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/curricula</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="show_sql">true</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect 指定与数据库打交道的语句类型-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

      
        
    </session-factory>
</hibernate-configuration>

2. model包中,新建一个javabean Student,并且在此包中新建一个xml文件,名字叫  Student.hbn.xml

该文件配置如下(配置的是一个数据表student):
 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="model">
<!-- table 可省略,默认是类名 -->
<class name="Student" table="student">
    <id name="id" column="id">
                <generator class="native"/><!-- native相当于自增长 -->
    </id>
         <property name="name" column="name" type="string" length="20"></property>
         <property name="pwd"  column="pwd" type="string" length="50"></property>
         <property name="phone"  column="phone" type="string" length="50"></property>
         <property name="grade"  column="grade" type="string" length="50"></property>
         <property name="photo" type="string" length="150"></property>
    </class>
</hibernate-mapping>


3. junit测试,add jar junit
新建一个test包,包中新建一个class  myapp来测试

myapp 类代码如下:

public class MyApp {
    @Test
public void testSave()
{

    Session session=HibernateUtil.openSession();
    Student student=new Student();
    student.setName("张三");
    student.setPwd("123456778");
    student.setGrade("greade1");
    student.setPhone("17863110675");
    Transaction tx=session.beginTransaction();
    session.save(student);
    tx.commit();
    
}
}


4.run as junit即可实现将该student信息插入到表student中

5,数据库表
curricula 数据库
=========================================
学生
Student(id,name,pwd,phone,grade,photo)

1.创建javabean

 getter和setter的快捷键

 alt+shift+s r

2.建立映射文件(这样配置映射关系比较麻烦)

 建立对象与表的对应关系,      
 对象属性与表中字段的对应关系。 类名.hbm.xml

 完全限定名                

3.测试程序

 Junit单元测试

 事务 Transaction
 把多个命令绑定成一个事务,要么全部成功,要么全部失败(体现原子性,事物其他特性还有一致性,隔离性,持久性,统称ACID)

4.用注解方式配置映射关系(方便,推荐)

 content assist//解决@后无提示的问题
 

@Entity//将student类做成数据库的表,表名可以改,需要设置属性
public class Student {
private int id;
private String name;
private String pwd;
private String phone;
private String grade;
private String photo;
@Id
@GeneratedValue
public int getId() {
    return id;
}
 


 a.将hibernate.cfg.xml中的
 sessionfactory中的
 <!-- <mapping resource="model/Student.hbm.xml"></mapping>  采用映射文件建立对象与数据库表的关系 -->
  
  <!-- 用注解的方式配置映射关系 -->   
    <mapping class="model.Student"></mapping>
 
b.Student.hbm.xml文件就没有用了

主键:Primary Key 即唯一,简称pk
外键 :Foreign Key 外键,引用(参照)其他表的主键字段 简称fk
图书表(a)

id     图书名称           类别     价格
1      Java编程思想       1        50
2      Hibernate入门      1        60
3      成功有方法         2        30

几个概念

1,主键与外键

id是主键,类别字段是外键,
主表(在关联关系中,包含主键字段的表叫主表),从表(在关联关系中,包含外键字段的表叫从表)

2,主表与从表

图书表是从表(因为它包含类别的外键)
图书类别表是主表(因为它包含了类别的主键)

图书类别表(b)(实际开发中一般不会使用单独的表来存放类别,而是使用字典表)

id  名称
1   计算机
2   励志
3   地理
4   历史

表设计不合理,可能会产生的问题
1.重复问题,2.删除问题 3.修改的问题

满足三范式(不一定全满足,减少数据冗余)

多表关联查询:
select 图书名称,名称 ,价格 from 图书表,图书类别表 where 图书表.类别=图书类别表.id

select a.图书名称,b.名称 as 图书类别,a.价格 from 图书表 a,图书类别表 b where a.类别=b.id
//当两表的字段有雷同时,需要加上表名限制(或者取别名区分)

学生选课系统项目需求:

select 图书名称,名称,价格 from 图书表,图书类别表 where 图书表.类别=图书类别表.id

select a.图书名称,b.名称 as 图书类别,a.价格 from 图书表 a,图书类别表 b where a.类别=b.id

curricula 数据库
=========================================
为了降低复杂性,不考虑上课时间问题
   1.学生在同一时间不能同时上两门课程
   2.教师在同一时间不能讲授两门课程
   3.同一个教室在同一时间不可能开两门课程

不考虑学生班级的问题,认为一个年级只有一个班级。
任何一个学生,可以选任何一个老师的课。

========================================
实体(entity)= 模型(model) = 对象(object)

学生
Student(id,name,sex,pwd,phone,grade,photo)

紧急联系人
Contact(id,name,sex,relation,phone)

教室
room(id,name,address)

课程
class(id,name,type,hours)

教师
teacher(id,name,sex,phone)

双向关系和单向关系

1.学生-紧急联系人(一对一)

  站在学生角度:getContact(),站在联系人角度:getStudent()

2.学生-课程(多对多):

一个学生可以选择多个课程,一个课程,可以被多个学生选择。
  站在学生角度:getClasses(),站在课程角度:getStudents()
 
  =======================================================================
3.老师-课程(一对多):

一个老师,可以上多门课程,一门课程只能一个老师上。
  站在老师角度:getClasses() 站在课程角度:getTeacher()  
 
4.教室-课程(一对多):

一个教室,可以上多门课程,一门课程只能在一个教室上。
  站在教室角度:getClasses(),站在课程角度:getRoom()

 学生和老师不直接产生关系
 学生和教室不直接产生关系
 教室和教师不直接产生关系

sql与hql
sql:查找数据库记录
hql:hibernate query language 查找对象 


4.$.ajax({});//默认是异步的,需要设置属性 async:"false",此时同步


用户图片上传到服务器:
    思路:
    1\表单 input type="file" name="image"
    2\action 三个成员:
    File image;(含图片的全路径)
    String fileContentType
    string imageFileName(   xxx.jpg)
    3\生成唯一图片名称
    uploadfiles\年\月\日\hour+second+millisecond
    图片更新:
    检测前台是否传来新图片
    旧图片删除(判断旧图片是否存在,若存在就删除)

紧急联系人:
如何联系两张表,可以在其中一张表添加外键
在student 表中添加外键 cid 字段,指向contact表
如何用hibernate实现这个功能?

犯下的错:注解应该放到get前面,不要放到set前面,会报错的

ACTION 中的带有setter和getter的成员变量可以直接在网页上访问??????

(el表达式访问,可以使用debug标签查看valuestack)
UI=user interface=用户界面
各种ui框架:Jquery UI ,Jquery easy ui,bootstrap,
easyui

分页:

类:当前页码,当前页size,按钮数,

分页:
处理删除数据,修改数据,留在当前页
添加数据:跳到最后一页


根据教室管理生成教师,课程管理模块
Teacher  :id,name,sex,phone
Course: id,name,type,hours
1,一对一关系复习(学生与紧急联系人)

Contact 
   private Student student
   @OneToOne(mappedBy="contact")//contact是被拥有方,表中不建立字段
   getStudent
Student 
   private Contact contact
   @OneToOne
   @JoinColumn(name="cid")//表中建字段cid
    getContact


2,一对多关系:
教师-课程:一个教师,多门课程,一门课程只能一个教师上
    站在教师角度:getClasses() 
    站在课程角度上:getTeacher()
课程:course(id,name,type,hours,<tid>)
教师:teacher(id,name,sex,phone)
    cids:1,2,3,4,5,  不符合设计规范,三个范式
    数据库设计时:    一对多关系:外键字段设置在多方
    
    junit测试,出现
    org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: model.Room
           被参照的对象(作为外键的对象)应该先保存


防止表单重复提交:


1,           将标签放到form内  <s:token></s>
2,在action中配置拦截器
token和tolenSession
重复提交后的跳转的result
invalid.token
拦截器栈
excludesMethods  不拦截哪些方法
遇到的问题:
 Error setting expression 'token' with value
 http://blog.csdn.net/su20145104009/article/details/69942517
 
 token防止重复提交的原理:加上token标签后,会在jsp页面生成一个标识与服务器一致,则为第一次提交,第一次提交后,
    服务器上的标识改变,客户端不改,两者不一致,则是重复提交
    问题:这里只是拦截所有的update方法,但是在修改数据的时候也被拦截,无法修改
    解决:action新增方法modify,用来修改数据

学生与课程间的多对多关系

一个学生多门课,一门课多个学生
中间表
student-course 中间表(sid,cid)

站在学生的角度:getCourses
站在课程角度:getStudents
选择一方来维护关联关系,叫做主表
通过学生来添加课程
student.setCourses()

或者

通过课程来添加学生
course.setStudents()


选择学生来作为维护关联关系的一方

    问题:
    mantomany单元测试报错,注解出错,当时是@ManyToMany少写了一处
    java.lang.ExceptionInInitializerError
        at common.HibernateUtil.buildSessionFactory(HibernateUtil.java:25)

选课:
前端页面:

action中获取session的方式

猜你喜欢

转载自blog.csdn.net/qq_36922927/article/details/81276922