多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
![](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; } } ```