java框架Hibernate入门


针对版本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();
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容