美文网首页
java框架Hibernate入门

java框架Hibernate入门

作者: _琳哥 | 来源:发表于2017-11-20 11:43 被阅读10次

    针对版本hibernate-distribution-3.6.0.Final的学习

    搭建环境及开发步骤
    1. 引入jar包

      • hibernate3.jar核心
      • required 必须引入的(6个)
        • antlr-2.7.6.jar
        • commons-collections-3.1.jar
        • dom4j-1.6.1.jar
        • javassist-3.12.0.GA.jar
        • jta-1.1.jar
        • slf4j-api-1.6.1.jar
      • jpa 目录
        • hibernate-jpa-2.0-api-1.0.0.Final.jar
      • 数据库驱动包
        • mysql-connector-java-5.1.7-bin.jar
    2. 写对象以及对象的映射

      • Employee.java 对象
      • Employee.hbm.xml 对象的映射 (映射文件)
    public class Employee {
    
        private int empId;
        private String empName;
        private Date workDate;
    
        public int getEmpId(){
            return empId;
        }
    
        public void setEmpId(int empId){
            this.empId = empId;
        }
    
        public String getEmpName(){
            return empName;
        }
    
        public void setEmpName(String empName){
            this.empName = empName;
        }
    
        public Date getWorkDate(){
            return workDate;
        }
    
        public void setWorkDate(Date workDate){
            this.workDate = workDate;
        }
    
        @Override
        public String toString(){
            return "Employee{" +
                    "empId=" + empId +
                    ", empName='" + empName + '\'' +
                    ", workDate=" + workDate +
                    '}';
        }
    }
    

    Employee.hbm.xml文件 : 先确保数据库和表都已存在

    create table employee (id int not null primary key auto_increment,empName varchar(10),workDate datetime);
    
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
    <hibernate-mapping package="com.flynn">
        <class name="Employee" table="employee" >
            <!--主键-->
            <id name="empId" column="id" type="java.lang.Integer">
                <generator class="native"/>
            </id>
            <property name="empName" column="empName"></property>
            <property name="workDate" column="workDate"></property>
        </class>
    </hibernate-mapping>
    
    1. src/hibernate.cfg.xml 主配置文件
      • 数据库连接配置
      • 加载所用的映射(*.hbm.xml)
    <!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.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://192.168.5.129:3306/partner</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">mysql</property>
            <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
    
            <property name="hibernate.show_sql">true</property>
    
            <mapping resource="com/flynn/Employee.hbm.xml"></mapping>
        </session-factory>
    </hibernate-configuration>
    

    4.App.java测试 : 一次简单的测试

    public class App {
    
        @Test
        public void testSave() throws Exception{
            Employee emp = new Employee();
            emp.setEmpName("zhang");
            emp.setWorkDate(new Date());
            // 获取加载配置文件的管理类对象
            Configuration config = new Configuration();
            // 加载配置文件
            config.configure();
            SessionFactory sessionFactory = config.buildSessionFactory();
            // 创建session
            Session session = sessionFactory.openSession();
            // 提交事务
            Transaction tx = session.beginTransaction();
            // --执行操作--
            session.save(emp);
            // 提交事务
            tx.commit();
            // 关闭session
            session.close();
        }
    }
    

    测试通过 :


    testSave.png
    Hibernate的Api
    • Configuration 配置管理类对象

      • config.configure(); 加载主配置文件的方法(hibernate.cfg.xml) 默认加载src/hibernate.cfg.xml
      • config.configure(“cn/config/hibernate.cfg.xml”); 加载指定路径下指定名称的主配置文件
      • config.buildSessionFactory(); 创建session的工厂对象
    • SessionFactory session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)

      • sf.openSession(); 创建一个sesison对象
      • sf.getCurrentSession(); 创建session或取出session对象
    • Session session对象维护了一个连接(Connection), 代表了与数据库连接的会话。

      • Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象
      • session.beginTransaction(); 开启一个事务;
        hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!
    • 更新:

      • session.save(obj); 保存一个对象
      • session.update(emp); 更新一个对象
      • session.saveOrUpdate(emp); 保存或者更新的方法:
        • 没有设置主键,执行保存;
        • 有设置主键,执行更新操作;
        • 如果设置主键不存在报错!
    • 主键查询:

      • session.get(Employee.class, 1); 主键查询
      • session.load(Employee.class, 1); 主键查询 (支持懒加载)
    • HQL查询

      • HQL查询与SQL查询区别
        • SQL:(结构化查询语句) 查询的是表以及字段 ; 不区分大小写
        • HQL: hibernate query language 即hibernate提供的面向对象的查询语言
          • 查询的是对象以及对象的属性
          • 区分大小写
        /**
         * HQL查询
         * @throws Exception e
         */
        @Test
        public void testQuery() throws Exception{
    
            Session session = sessionFactory.openSession(); 
            Transaction transaction = session.beginTransaction();
    
            Query q = session.createQuery("from Employee");
    //        Query q = session.createQuery("from Employee where empId=1 or empId=2");   带条件的查询
            List<Employee> list = q.list();
    
            System.out.println(list);
            transaction.commit();
            session.close();
        }
    
    • Criteria查询
      • 完全面向对象的查询。
        /**
         * QBC查询  query by criteria 完全面向对象查询
         * @throws Exception e
         */
        @Test
        public void testQBC() throws Exception{
    
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
    
            Criteria criteria = session.createCriteria(Employee.class);
    //        criteria.add(Restrictions.eq("empId",1)); 条件查询
            List<Employee> list = criteria.list();
    
            System.out.println(list);
            transaction.commit();
            session.close();
        }
    
    • 本地SQL查询
      复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持!
      (缺点: 不能跨数据库平台!)
        /**
         * sql查询
         * @throws Exception 异常
         */
        @Test
        public void testSql() throws Exception{
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
    
    //        SQLQuery sqlQuery = session.createSQLQuery("select * from employee");
            SQLQuery sqlQuery = session.createSQLQuery("select * from employee").addEntity(Employee.class);
            System.out.println(sqlQuery.list());
    
            transaction.commit();
        }
    
    CRUD案例

    //仅随手测试代码 请忽略不够优化,也不要找我茬

    public class HibernateUtils {
    
        private static SessionFactory sf;
    
        static {
            // 加载主配置文件, 并创建Session的工厂
            sf = new Configuration().configure().buildSessionFactory();
        }
    
        public static Session getSession(){
            return sf.openSession();
        }
    }
    
    public interface IEmployeeDao {
    
        void save(Employee employee);
    
        void update(Employee employee);
    
        void delete(Serializable id);
    
        Employee findById(Serializable id);
    
        List<Employee> getAll();
    
        List<Employee> getAll(String employeeName);
    
        List<Employee> getAll(int pageNo, int pageSize);
    }
    
    public class EmployeeDaoImpl implements IEmployeeDao {
        @Override
        public void save(Employee employee){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtils.getSession();
                tx = session.beginTransaction();
                session.save(employee);
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                if(tx != null){
                    tx.commit();
                }
                if(session != null){
                    session.close();
                }
            }
        }
    
        @Override
        public void update(Employee employee){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtils.getSession();
                tx = session.beginTransaction();
                session.update(employee);
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                if(tx != null){
                    tx.commit();
                }
                if(session != null){
                    session.close();
                }
            }
        }
    
        @Override
        public void delete(Serializable id){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtils.getSession();
                tx = session.beginTransaction();
                Object obj = session.get(Employee.class, id);
                if(obj != null){
                    session.delete(obj);
                }
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                if(tx != null){
                    tx.commit();
                }
                if(session != null){
                    session.close();
                }
            }
        }
    
        @Override
        public Employee findById(Serializable id){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtils.getSession();
                tx = session.beginTransaction();
                return (Employee) session.get(Employee.class, id);
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                if(tx != null){
                    tx.commit();
                }
                if(session != null){
                    session.close();
                }
            }
        }
    
        @Override
        public List<Employee> getAll(){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtils.getSession();
                tx = session.beginTransaction();
                Query q = session.createQuery("from Employee");
                return q.list();
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                if(tx != null){
                    tx.commit();
                }
                if(session != null){
                    session.close();
                }
            }
        }
    
        @Override
        public List<Employee> getAll(String employeeName){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtils.getSession();
                tx = session.beginTransaction();
                Query q = session.createQuery("from Employee where empName = ?");
                // 注意: 参数索引从0开始
                q.setParameter(0, employeeName);
                return q.list();
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                if(tx != null){
                    tx.commit();
                }
                if(session != null){
                    session.close();
                }
            }
        }
    
        @Override
        public List<Employee> getAll(int pageNo, int pageSize){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtils.getSession();
                tx = session.beginTransaction();
                Query query = session.createQuery("from Employee");
                // 设置分页参数
                query.setFirstResult(pageNo);
                query.setMaxResults(pageSize);
                List<Employee> list = query.list();
                return list;
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                if(tx != null){
                    tx.commit();
                }
                if(session != null){
                    session.close();
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:java框架Hibernate入门

          本文链接:https://www.haomeiwen.com/subject/wbljvxtx.html