<--Student.hbm.xml --></--Student.hbm.xml--hibernate文档>

<?xml version="1.0" encoding="UTF-8"?>
<!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">
<class name="Student" table="student">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name" ></property>
<property name="pwd" column="pwd" ></property>
<property name="phone" column="phone" ></property>
<property name="grade" column="grade" ></property>
<property name="photo" column="photo" ></property>
<property name="sex" column="sex" ></property>

</class>
</hibernate-mapping>

<--HibernateUtil.java --></--HibernateUtil.java---类文件>

package comon;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {

private static SessionFactory sessionFactory;

private static SessionFactory buildSessionFactory() {
try {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();

SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);

return sessionFactory;
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
if (sessionFactory == null)
sessionFactory = buildSessionFactory();
return sessionFactory;
}

public static Session openSession() {
return getSessionFactory().openSession();
}
}

<-- hibernate.cfg.xml--></hibernate.cfg.xml--文档>

<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!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 >
<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">123456</property>

<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>

<property name="hbm2ddl.auto">update</property>
<mapping class="model.Student"/>

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

<-- Test.java--></--Test.java--Junit测试类>

package test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import model.Student;

public class Test {


public static void main(String[] args) {

Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student s= new Student();
s.setName("你好");
s.setPwd("1314520");
s.setPhone("13512365478");
s.setGrade("Grade One");
session.save(s);
transaction.commit();
}
}

<-- StudentDAO.java--></--StudentDAO.java--dao类><--dao 用的方法跟测试类一样--></--dao> 

import model.Student;

public class StudentDAO {

Session session;
public void Add(Student s)
{


Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(s);
transaction.commit();
}
}

<--student.xml--></--student.xml--学生文档>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<constant name="struts.devMode" value="true" />
<package name="student" namespace="/student" extends="all">
<action name="*" class="action.StudentAction" method="{1}">

</action>
</package>
</struts>

<--struts.xml--></--struts.xml--文档>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<constant name="struts.devMode" value="true" />
<include file="student.xml"></include>
<package name="all" namespace="/" extends="struts-default">
<global-results >
<result name="main">/main.jsp</result>
</global-results>
</package>
</struts>

 

<--web.xml--></--web.xml-- web文档>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp_9" version="2.4">
<display-name>Struts Blank</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

<--实体类--></--><--Student.java--></--Student.java-->
 

package model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Student {


private int id;
private String name;
private String pwd;
private String phone;
private String grade;
private String photo;
private String sex;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}

}

1,
    搭建struts2和hibernate开发环境:
    1.添加hibernate的jar包     lib/required
    2.添加struts2的jar包     apps/解压一个项目blank/lib
    3.添加mysql数据库连接驱动
    4.添加struts2的配置文件struts.xml
    5.添加hibernate的配置文件hibernate.cfg.xml
    <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">12345678</property>  
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>         
    <property name="show_sql">true</property>
    
    hbm2ddl.auto 是否自动创建数据库

    6.编写初始化SessionFactory和获取Session的代码。

SessionFactory:连接池
Session:连接 public class HibernateUtil {
private static SessionFactory sessionFactory;
private static SessionFactory buildSessionFactory() {
try {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build(); SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry); return sessionFactory;
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
} public static SessionFactory getSessionFactory() {
if (sessionFactory == null)
sessionFactory = buildSessionFactory();
return sessionFactory;
} public static Session openSession() {
return getSessionFactory().openSession();
}
}

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

    1.创建javabean
    getter和setter的快捷键
    alt+shift+s r

    2.建立映射文件
    建立对象与表的对应关系,对象属性与表中字段的对应关系。
    完全限定名

    3.测试程序
    Junit单元测试

    事务 Transaction
    把多个命令绑定成一个事务,要么全部成功,要么全部失败。

    4.用注解方式配置映射关系(一般多用注解配置)
 

@Entity
public class Student { private int id;
private String name;
private String pwd;
private String phone;
private String grade;
private String photo;
private String sex;
private Contact contact;
private Set<Course> courses =new HashSet<Course>();

@Id
@GeneratedValue
public int getId() {
return id;
}

3,
    重复密码不提交,在表单变量中,就不能指定其name属性。
4,
    hibernate中Session用法。
5,
    标签做条件必须用OGNL表达式,其他用EL表达式
    
6,
    上传文件的表单设置
    enctype="multipart/from-data" method="post"
    
    <img id="image" name="image" src="" />
    <input type="file" name="file" οnchange="setImage(this)"/>
    </body>
    <script language="javascript">
    function setImage(obj){
    image.src = obj.value;
    }
    </script>
7,
    创建年的目录:Calendar cal = Calendar.getInstance();
    文件上传:enctype="multipart/form-data"
    
8,
    2.没有联系人的时候,性别处于未选择状态,将其默认值设置为“男”。
    百度 jquery checked
  .attr("checked",true);

    .attr("checked","checked");

    if($("[name='contact.sex']:checked").length==0)
    {
        $("[name='contact.sex']:eq(1)").attr("checked",true);
    }

    3.解决上传图片预览在浏览器中不显示的问题
    使用一个图片上传预览插件

9,  
    hibernate开发步骤:
    
    1. 新建room.jsp页面

    3.编写实体类 Room

    4.编写Action

    5.配置action

10,
    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/jquery-easyui-
1.5.3/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/jquery-easyui-1.5.3/themes/icon.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/jquery-easyui-1.5.3/demo.css">
    用easyui需要引进这些
    
11,
    hibernate的分页
    1.编写一个类来存放分页信息

    //当前页
    private int pageNo;
    //总页数
    private int pageCount;
    //每页的记录条数
    private int pageSize=3;
    //分页按钮个数
    private int btnCount=4;
    
    2.RoomAction main
    (1)只显示当页数据
        要确定页数
    当前是第一页,每页显示10条数据
    
    第一页显示0 - 9      (page-1)*pageSize
    第二页显示10 - 19    (page-1)*pageSize

    当前是第page页,每页显示pager.PageSize条数据
    (page-1)*pager.PageSize

    (2)显示导航按钮

    设置起始位置
    query.query.setFirstResult
    设置最大返回记录数
    query.setMaxResults

    页面传入当前页page

    保存完停留在最后一页
    修改完停留在当前页

    返回
    1.所有数据
    2.总页数

12,
    一对多,外键设在多方
    
13,
    代码重构Alt+shift+M
    
14,
    设置课程的教师信息

  点击单元格,弹出新窗口
  
  新窗口中必须要有course.id,teacher.id,teacher.name

  div 块级元素
  span 行级元神

  设置教师信息的弹出窗口的内容

  a.3个隐藏变量:course.id,teacher.id,teacher.name
  b.显示课程名称
  c.展现教师列表供选择
  d.保存选择的按钮
  
15,
    功能:把课程和老师对应起来
    两个变量
    course.id,teacher.id

    三个变量的问题course.id,teacher.id,teacher.name

    其实只需要两个变量:course.id,teacher.id
    也可以用四个变量,加上course.name,teacher.name

    三个事件

    1.弹出窗口的事件
    2.选择一个老师的事件
    3.保存并关闭窗口的事件

    让ajax以同步方式执行
    $.ajaxSettings.async=false

    全局变量 
    一个cell
    
16,
    1.表单中添加token标签
    <s:token></s:token>

    2.action中配置拦截器
    token和tokenSession

    重复提交后的跳转的result
    invalid.token

    拦截器栈
    excludesMethods 不拦截哪些方法

    3.配置默认全局默认拦截器
    <interceptors>   
          <interceptor-stack name="myStack">     
          <interceptor-ref name="tokenSession">
               <param name="includeMethods">update</param> 
          </interceptor-ref>    
          <interceptor-ref name="defaultStack"/>          
          </interceptor-stack>    
      </interceptors> 
        <default-interceptor-ref name="myStack"/>
        
17,
   复习一对多的关系 ,(不讲多对一的关系)

    老师 课程 

    一个老师可以上多个课程,一个课程,只能由一个老师来上

    对象设计:

    站在老师的角度
    Set courses - getCourses()

    站在课程的角度

    teacher getTeacher()

    数据库的设计:

    在多方增加一个外键

    课程id  课程名称  ...  教师id
    1       c语言           1
    2       java            2

    错误的设计

    教师id 教师名称  ....  课程id
    1      张老师          1,2         (不符合数据库设计规范)

    另外,有mappedBy的对象方,其实体表中不会生成外键

=========================================================

    多对多关系

    学生 和 课程

    一个学生可以选择多门课程,一门课程,也可以被多个学生选择

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

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

    数据库的设计:

    中间表
    student-course(sid,cid)

    数据库表关系
    sid        cid
    1    1
    1    2
    2    1
    2    2

    对象关系:

    一个学生可以选择多门课程,一门课程可以被多个学生选择
 
    1.站在学生的角度,有一个属性叫做courses
        可以通过getCourses(),得到自己选择的所有课程

    2.站在课程的角度,有一个属性叫做students
        可以通过getStudents,得到选择这门课程的所有学生

    选择一方来维护关联关系,叫做主表

        维护关联关系的一方

    通过学生来添加课程
    student.setCourses(....)

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

    @ManyToMany
    @JoinTable(
            name="student_course", 
            joinColumns={@JoinColumn(name="sid")}, 
            inverseJoinColumns={@JoinColumn(name="cid")} 
    ) 
    多对多关系
    
    @JoinTable(
            name="student_course", 
            joinColumns=@JoinColumn(name="sid"),
            inverseJoinColumns=@JoinColumn(name="cid")        
    ) 
    
18,
    @Entity
    public class Student {
    private int id;
    private String name;
    private String pwd;
    private String phone;
    private String grade;
    private String photo;
    private String sex;
    private Contact contact;
    private Set<Course> courses =new HashSet<Course>(); 
    //必须初始化(Junit测试)才能使用(student.getCourses().add(course1);
        student.getCourses().add(course2);)
19,
    1.修改功能被 禁止重复提交的拦截器拦截
    解决办法,修改时,调用另外的action方法。
    2.修改init.jsp为choose.jsp
    3.将功能链接到菜单中。
    
 20,
    2, $.post("${pageContext.request.contextPath}/course/checkesSelect"
        ,{"course.id":e.lang},function(data){
            eval("e.checked=" +data);
        });
    //(eval是把字符串变成命令)

21,
    StudentDAO中update方法修改:session.merge(student);//修改之前是 saveOrUpdate(arg0);

22,
    CourseAction.java中先关联数据库中的Student
    public String checkit()
    {
        //Student没有与数据库中的Student关联,要去关联
        Student student= (Student) ActionContext.getContext().getSession().get("STUDENT");
        StudentDAO sdao =new StudentDAO();
        student= sdao.get(student);//
        course=dao.get(course)

数据库设计时,一对多关系中,外键字段要设在多方,代码相对来说要简单一些
在多的一方加外键

为什么呢?因为我们在数据库中,可以指定某个课程的教室是哪一个? 但是不能指定每个教室上哪些课程。

1.修改功能被 禁止重复提交的拦截器拦截
 解决办法,修改时,调用另外的action方法。
 
 2, $.post("${pageContext.request.contextPath}/course/checkesSelect"
        ,{"course.id":e.lang},function(data){
            eval("e.checked=" +data);
        });
//(eval是把字符串变成命令)