目录
环境:eclipse+spring+struts2+hibernate
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)
多表关联查询:select 图书名称,名称 ,价格 from 图书表,图书类别表 where 图书表.类别=图书类别表.id
sql与hqlsql:查找数据库记录hql:hibernate query language 查找对象
4.$.ajax({});//默认是异步的,需要设置属性 async:"false",此时同步
犯下的错:注解应该放到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的方式