单例模式的SessionsFactory构建和线程安全session,并实现增删改查

 创建Session,那么运行都创建一个session对象,这样我们的代是效率低下的。SessionFactory 接口负责Hibernate的初始化和建立Session对象,它在Hibernate中启到一个缓冲区的作用,它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存,因为hibernate可以将自动生成的SQL 语句、映射数据以及某些可重复利用的数据放在这个缓冲区中。

       SessionFactory具有这样下特点:它是线程安全的,它的同一实例能够供多个线程共享,它是重量级的,不能随意的创建和销毁它的实例。由于SessionFactory的这些特点,一般情况下,一个项目只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此,在实际项目使用中,通常会抽取一个HibernateUtils的工具类,用来提供SessionFactory对象。

静态代码块生成唯一的SessionFactory,通过一个方法返回一个SessionFactory

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

public class HibernateUtil {

    private static Configuration cfg;

    private static SessionFactory sessionFactory;

    static {

        try {

            cfg = new Configuration().configure();

            sessionFactory = cfg.buildSessionFactory();

        }catch (Exception e) {

            e.printStackTrace();

        }

    }

      public static SessionFactory getSessionFactory() {

        return sessionFactory;

    }

}

线程安全的session

一、获取session

在学习中已经知道有两种方法可以获取session

1.openSession()

2.getCurrentSession()

在这里,这两种方法的区别:

采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。

采用getCurrentSession()创建的Sessioncommitrollback后会自动关闭,采用OpenSession()必须手动关闭。

 

 

二、这里使用线程安全的Session

Configuration configuration = new Configuration.configure();

SessionFactory sessionFactory = configuration.buildSessionFactory();

Session session = sessionFactory.getCurrentSession()

 

 

三、演示实例

1.User类及配置

package com.domain;

public class User {

    private Integer id;

    private String username;

    private String password;

    private Integer age;

    public Integer getId() {

        return id;

    }

    public void setId(Integer id) {

        this.id = id;

    }

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

    public Integer getAge() {

        return age;

    }

    public void setAge(Integer age) {

        this.age = age;

    }

    @Override

    public String toString() {

        return "User [id=" + id + ", username=" + username + ", password=" + password + ", age=" + age + "]";

    }

    

}   

 

 

<?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>

    <!-- name: 完整类名    table:数据库表名 -->

    <class name="com.domain.User" table="user">

        <!-- id配置表的主键  name代表表中属性 -->

        <id name="id" column="id">

            <!-- 主键生成策略 -->

            <generator class="native"></generator>

        </id>

        <property name="username" column="username" type="string"></property>

        <property name="password" column="password" type="string"></property>

        <property name="age" column="age" type="integer"></property>

    </class></hibernate-mapping>

2.hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

             <!-- 数据库驱动 -->

            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

             <!-- 数据库url -->

            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate02_1514010311</property>

             <!-- 数据库连接用户名 -->

            <property name="hibernate.connection.username">root</property>

             <!-- 数据库连接密码 -->

            <property name="hibernate.connection.password">0x3137</property>

            <!-- hibernate生成的sql语句打印到控制台 -->

            <property name="hibernate.show_sql">true</property>

            <!-- hibernate生成的sql语句格式化(语法缩进) -->

            <property name="hibernate.format_sql">true</property>

            <!-- 配置getCurrentSession -->

            <property name="hibernate.current_session_context_class">thread</property>

            <mapping resource="com/domain/User.hbm.xml" />

        </session-factory>

        

        

    </hibernate-configuration>

3.HibernateUtil.java

package com.util;

 

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

 

public class HibernateUtil {

    private static Configuration cfg;

    private static SessionFactory sessionFactory;

    static {

        try {

            cfg = new Configuration().configure();

            sessionFactory = cfg.buildSessionFactory();

        }catch (Exception e) {

            e.printStackTrace();

        }

    }

    

    

    public static SessionFactory getSessionFactory() {

        return sessionFactory;

    }

}

4.测试

package com.test;

 

 

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.junit.Test;

 

import com.domain.User;

import com.util.HibernateUtil;

 

public class TestUser {

    @Test

    public void saveUser() {

        SessionFactory sessionFactory = null;

        Session session = null;

        Transaction transaction = null;

        User user = new User();

        user.setUsername("");

        user.setPassword("1514010731");

        user.setAge(21);

        try {

            sessionFactory = HibernateUtil.getSessionFactory();

            session = sessionFactory.getCurrentSession();

            transaction = session.beginTransaction();

            session.save(user);

            transaction.commit();

        } catch (Exception e) {

            if (transaction!=null) {

                transaction.rollback();

            }

            e.printStackTrace();

        }

    }

    

    @Test

    public void updateUser() {

        

        SessionFactory sessionFactory = null;

        Session session = null;

        Transaction transaction = null;

        try {

            sessionFactory = HibernateUtil.getSessionFactory();

            session = sessionFactory.getCurrentSession();

            transaction = session.beginTransaction();

            User user = session.get(User.class, 1);

            user.setUsername("三哥无邪啊");

            user.setPassword("1514010311");

            user.setAge(21);

            session.update(user);

            transaction.commit();

        } catch (Exception e) {

            if (transaction!=null) {

                transaction.rollback();

            }

            e.printStackTrace();

        }

    }

    

    @Test

    public void queryUser() {

        

        SessionFactory sessionFactory = null;

        Session session = null;

        Transaction transaction = null;

        try {

            sessionFactory = HibernateUtil.getSessionFactory();

            session = sessionFactory.getCurrentSession();

            transaction = session.beginTransaction();

            User user = session.get(User.class, 2);

            System.out.println("ID:"+user.getId()+" 用户名:"+user.getUsername()+" 密码:"+user.getPassword());

            transaction.commit();

        } catch (Exception e) {

            if (transaction!=null) {

                transaction.rollback();

            }

            e.printStackTrace();

        }

    }

    @Test

    public void deleteUser() {

        

        SessionFactory sessionFactory = null;

        Session session = null;

        Transaction transaction = null;

        try {

            sessionFactory = HibernateUtil.getSessionFactory();

            session = sessionFactory.getCurrentSession();

            transaction = session.beginTransaction();

            User user = session.get(User.class, 1);

            session.delete(user);

            transaction.commit();

        } catch (Exception e) {

            if (transaction!=null) {

                transaction.rollback();

            }

            e.printStackTrace();

        }

    }

}

测试saveUser方法


实现增删改查操作:

1)增

 package cn.test;     

 import org.hibernate.Session;    

 import org.hibernate.SessionFactory;    

 import org.hibernate.Transaction;    

 import org.hibernate.cfg.Configuration;    

 import cn.Unit.HibernateUtils;  

 import cn.domain.Student;    

    

 public class Add {    

     public static void main(String[] args) {        

          Session session = HibernateUtils.getSession();  

          Transaction tx = null;    

          try{    

         tx = session.beginTransaction();        

         Student stu = new Student();    

         stu.setName("lisi");    

         stu.setAge(21);    

         session.save(stu);    

         tx.commit();         

           }catch(Exception e){    

         if (null!=tx){tx.rollback();}    

         e.printStackTrace();          

           }   

     }    

 

2)修改

 package cn.test;      

 import org.hibernate.Session;    

 import org.hibernate.SessionFactory;    

 import org.hibernate.Transaction;    

 import org.hibernate.cfg.Configuration;    

 import cn.Unit.HibernateUtils;  

 import cn.domain.Student;    

     

 public class Edit {    

     public static void main(String[] args) {    

          Session session = HibernateUtils.getSession();  

          Transaction tx = null;    

          try{    

         tx = session.beginTransaction();  

         //把id为2的  姓名  zhangsan改为wangwu  年龄  20改为30  

         Student stu = (Student)session.get(Student.class,new Integer(1));  

         stu.setName("wangwu");    

         stu.setAge(30);    

         session.update(stu);    

         tx.commit();   

           

           }catch(Exception e){    

         if (null!=tx){tx.rollback();}    

         e.printStackTrace();          

           }   

     }    

 }    

 

3)查询

 package cn.test;    

 import org.hibernate.Session;    

 import org.hibernate.SessionFactory;    

 import org.hibernate.Transaction;    

 import org.hibernate.cfg.Configuration;    

   

 import cn.Unit.HibernateUtils;  

 import cn.domain.Student;    

     

 public class FindById {    

     public static void main(String[] args) {    

          Session session = HibernateUtils.getSession();  

          Transaction tx = null;    

          try{    

         tx = session.beginTransaction();  

         //查找id为2的学生信息,并输出在控制台  

         Student stu = (Student)session.get(Student.class,new Integer(2));  

         System.out.println("姓名:"+stu.getName());  

         System.out.println("年龄:"+stu.getAge());  

         tx.commit();   

           }catch(Exception e){    

         if (null!=tx){tx.rollback();}    

         e.printStackTrace();          

           }    

     }    

 }    


4)删除

 package cn.test;      

 import org.hibernate.Session;    

 import org.hibernate.SessionFactory;    

 import org.hibernate.Transaction;    

 import org.hibernate.cfg.Configuration;    

 import cn.Unit.HibernateUtils;  

 import cn.domain.Student;    

    

 public class Delete {    

     public static void main(String[] args) {    

         Session session = HibernateUtils.getSession();  

         Transaction tx = null;    

         tx = session.beginTransaction();    

         //删除id为2的学生  

         Student stu = (Student)session.get(Student.class,new Integer(2));  

         session.delete(stu);  

        tx.commit();   

            

     }    

 }    

猜你喜欢

转载自blog.csdn.net/aiwqsunny/article/details/80501396