多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
无论是测试,还是增加数据,或是查询数据,都需要用到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进行了代码了重新编译。