![](https://box.kancloud.cn/179358155c83feaf4fc7a53d00ac7cec_812x464.png)
# 写注释
```
package teacher;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import db.MysqlJavaee;
import entity.Teacher;
public class Index {
// 教师列表 类型为List,每项均为Teacher。
private List<Teacher> teachers;
// V层在展示数据teachers的时候,将自动调用该方法
public List<Teacher> getTeachers() {
return teachers;
}
// 该execute方法将被自动调用, 方法的返回类型必须为String
public String execute() {
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = MysqlJavaee.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
Transaction transaction = session.beginTransaction();
// 在这里,必须使用try catch finally语句。来确定会话正常关闭.
// 否则,当操作数据库产生错误时,你可能需要重启mysql服务
try {
// 查询Teacher表,注意:是Teacher ,而不是 teacher
// list()预查询,只有在事务提交时,才进行查询操作
// 提交事务
transaction.commit();
// 捕获异常
} catch (HibernateException e) {
// 如果事务执行异常,则回滚事务
if (null != transaction) {
transaction.rollback();
}
// 打印异常
e.printStackTrace();
} finally {
// 如果session处于开启状态,则关闭session
if (session.isOpen()) {
// 关闭会话
session.close();
}
}
return "success";
}
}
```
# 添加代码
```
package teacher;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import db.MysqlJavaee;
import entity.Teacher;
public class Index {
// 教师列表 类型为List,每项均为Teacher。
private List<Teacher> teachers;
// V层在展示数据teachers的时候,将自动调用该方法
public List<Teacher> getTeachers() {
return teachers;
}
// 该execute方法将被自动调用, 方法的返回类型必须为String
public String execute() {
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = MysqlJavaee.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
Transaction transaction = session.beginTransaction();
// 在这里,必须使用try catch finally语句。来确定会话正常关闭.
// 否则,当操作数据库产生错误时,你可能需要重启mysql服务
try {
// 查询Teacher表,注意:是Teacher ,而不是 teacher
Query query = session.createQuery("from Teacher");
// 预查询,只有在事务提交时,才进行查询操作
teachers = query.list();
// 提交事务
transaction.commit();
// 捕获异常
} catch (HibernateException e) {
// 如果事务执行异常,则回滚事务
if (null != transaction) {
transaction.rollback();
}
// 打印异常
e.printStackTrace();
} finally {
// 如果session处于开启状态,则关闭session
if (session.isOpen()) {
// 关闭会话
session.close();
}
}
return "success";
}
}
```
# 测试
* 刷新列表页, 如果没有记录,则执行下面两步
* 查看Teacher表,如果没有数据,使用navicat向数据表中,添加1条测试数据。
* 再刷新列表页
# 重构代码
我们在前面讲过,C层应该是个指挥者,并不负责具体的数据与逻辑运算。
现在,让我们将代码转移至 M层.
```
package teacher;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import db.MysqlJavaee;
import entity.Teacher;
public class Index {
// 教师列表 类型为List,每项均为Teacher。
private List<Teacher> teachers;
// V层在展示数据teachers的时候,将自动调用该方法
public List<Teacher> getTeachers() {
return teachers;
}
// 该execute方法将被自动调用, 方法的返回类型必须为String
public String execute() {
// 获取教师列表
teachers = Teacher.all();
return "success";
}
}
```
**没错,正如你看到的一样,C层只需要做这样工作:从实体中,获取数据列表**
不过Teacher实体可就没有这么幸运了。不错,这就是我们想看到的。
```
package entity;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Index;
import db.MysqlJavaee;
// 声明主体
@Entity
public class Teacher {
// 声明主键
// 声明一个名为idGenerator的native类型构造器
// 使用这个构造器设置ID为自增属性
@Id
@GenericGenerator(name = "idGenerator", strategy = "native")
@GeneratedValue(generator = "idGenerator")
private int id; // 主键
private String name; // 姓名
// 声明长度(用户名不超过20位长度,定长能够提升效率)
@Column(columnDefinition = "char(20)")
// 声明为索引(该字段将来用于查询 ,增加索引将大幅提升查询效率)
@Index(name = "username")
private String username; // 用户名
private String email; // 邮箱
private Boolean sex = false; // 性别 0:男;1:女
// 密码采用sha1 md5加密,长度固定。
@Column(columnDefinition = "char(40)")
private String password; // 密码
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 getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Teacher() {
}
public Teacher(int id, String name, String username, String email,
Boolean sex, String password) {
// super();
this.id = id;
this.name = name;
this.username = username;
this.email = email;
this.sex = sex;
this.password = password;
}
public String toString() {
return "Teacher [id=" + id + ", name=" + name + ", username="
+ username + ", email=" + email + ", sex=" + sex
+ ", password=" + password + "]";
}
static public List<Teacher> all() {
// 实例化列表 teachers
List<Teacher> teachers = new ArrayList<Teacher>();
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = MysqlJavaee.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
Transaction transaction = session.beginTransaction();
// 在这里,必须使用try catch finally语句。来确定会话正常关闭.
// 否则,当操作数据库产生错误时,你可能需要重启mysql服务
try {
// 查询Teacher表,注意:是Teacher ,而不是 teacher
Query query = session.createQuery("from Teacher");
// 预查询,只有在事务提交时,才进行查询操作
teachers = query.list();
// 提交事务
transaction.commit();
// 捕获异常
} catch (HibernateException e) {
// 如果事务执行异常,则回滚事务
if (null != transaction) {
transaction.rollback();
}
// 打印异常
e.printStackTrace();
} finally {
// 如果session处于开启状态,则关闭session
if (session.isOpen()) {
// 关闭会话
session.close();
}
}
return teachers;
}
}
```
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层