无论是测试,还是增加数据,或是查询数据,都需要用到sessionFactory产生的session.本着『不写重复代码的原则』,我们新建db.MysqlJavaee来供其它类调用。
# db.MysqlJavaee
```
package db;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
/**
* Mysql类型的Javaee数据库
* @author panjie
*
*/
public class MysqlJavaee {
static private SessionFactory sessionFactory;
static public Session getCurrentSession() {
// 每个数据库只需要一个sessionFactory,在这里进行单一实例处理。
if (null == sessionFactory) {
// 实例化并加载数据库配置文件
Configuration configuration = new Configuration().configure();
// 构造服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(configuration.getProperties()).
buildServiceRegistry();
// 创建会话工厂(session factory))
sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
}
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
return sessionFactory.getCurrentSession();
}
}
```
# 测试
```
package teacher;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import db.MysqlJavaee;
import entity.Teacher;
public class IndexTest {
@Test
public void getLists() {
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = MysqlJavaee.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
Transaction transaction = session.beginTransaction();
// 在这里,必须使用try catch finally语句。来确定会话正常关闭.
// 否则,当操作数据库产生错误时,你可能需要重启mysql服务
try {
// 新插入两条记录
Teacher teacher1 = new Teacher();
teacher1.setName("zhangsan");
Teacher teacher2 = new Teacher();
teacher2.setName("lisi");
session.save(teacher1);
session.save(teacher2);
// 查询Teacher表,注意:是Teacher ,而不是 teacher
Query query = session.createQuery("from Teacher");
// 预查询,只有在事务提交时,才进行查询操作
List<Teacher> teachers = query.list();
for (Teacher teacher : teachers) {
System.out.println(teacher.toString());
}
// 提交事务
transaction.commit();
// 捕获异常
} catch (HibernateException e) {
throw e;
} finally {
// 如果session处于开启状态,则关闭session
if (session.isOpen()) {
// 关闭会话
session.close();
}
}
}
}
```
# TIPS
重构代码,在运行一些测试语句时,即使我们在hibernate.cfg.xml中,将hbm2ddl.auto配置为create,也不会像以前一样,每次运行一次程序都会清空一次数据表。这是由于,我们对SessionFactory进行了单例处理。所以单例,是指,不管我们访问多少次,我们得到的都是同一样的一个实例。
此时,如果我们想更改表结构,一是可以用以前的方法,每次运行都创建一个新的SessionFactory。二是可以重新启动Tomcat。Tomcat的停止时,将释放SessionFactory。再重启的时候,又会创建一个新的SessionFactory,在创建这个新的SessionFacotry时,则会重新创建新的数据表了。
# 作业
还等什么,快试试吧。
1. 多次运行getLists,看是否每次运行都会增加2条新的记录。
2. 停止tomcat后,再运行getLists,看是否数据表又回到了初始两条记录的状态.
3. 对代码更改后,eclipse进行了代码了重新编译。
- 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
- 第十四章:重构服务层