• Java web开发(9)Hibernate使用_a


    建立一个Hibernate工程。

    普通工程

    复制如下jar包,粘贴到工程的一个文件夹下,比如叫lib,然后选中所有jar包,右键,build path-->add to build path

    或者建立一个Maven工程,在依赖中添加

    <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.2.17.Final</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>

    2关键配置

    在src下建立hibernate.cfg.xml文件,里面内容包含连接,可选sql配置,实体类的映射文件

    <?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.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql:///数据库名</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">123</property>
            
            <!-- 第二部分: 配置hibernate信息  可选的-->
            <!-- 输出底层sql语句 -->
            <property name="hibernate.show_sql">true</property>
            <!-- 输出底层sql语句格式 -->
            <property name="hibernate.format_sql">true</property>
            <!-- hibernate帮创建表,需要配置之后 
                update: 如果已经有表,更新,如果没有,创建
            -->
            <property name="hibernate.hbm2ddl.auto">update</property>
            <!-- 配置数据库方言
                在mysql里面实现分页 关键字 limit,只能使用mysql里面
                在oracle数据库,实现分页rownum
                让hibernate框架识别不同数据库的自己特有的语句
             -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            
            <!-- 在hibernate核心配置文件中配置 -->
            <property name="hibernate.current_session_context_class">thread</property>
            
            <!-- 第三部分: 把映射文件放到核心配置文件中 必须的-->
            <mapping resource="com/entity/User.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

     实体类的配置

    比如一个实体类,包名com.entity

    package com.entity;
    public class User {
    
        private int uid;
        private String username;
        private String password;
        private String address;
    ......
    //getter and setter
    }

    在该包下同时有User.hbm.xml文件

    该配置文件制定了类和表,成员变量和数据表列的对应关系。

    如何指定主键生成策略。

    对于uid类型为String的,使用

    <generator class="uuid"></generator>
    <?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>
        <class name="com.entity.User" table="t_user">
        <id name="uid" column="uid">
        <generator class="native"></generator>
        </id>
        <property name="username" column="username"></property>
        <property name="password" column="password"></property>
        <property name="address" column="address"></property>
        </class>
    </hibernate-mapping>

    简单示例

    一个插入操作的所有代码

    @Test
    public void test()    {
    第一步 加载hibernate核心配置文件
            // 到src下面找到名称是hibernate.cfg.xml
            //在hibernate里面封装对象
            Configuration cfg = new Configuration();
            cfg.configure();
            
    //        第二步 创建SessionFactory对象
            //读取hibernate核心配置文件内容,创建sessionFactory
            //在过程中,根据映射关系,在配置数据库里面把表创建
            SessionFactory sessionFactory = cfg.buildSessionFactory();
            
    //        第三步 使用SessionFactory创建session对象
            // 类似于连接
            Session session = sessionFactory.openSession();
            
    //        第四步 开启事务
            Transaction tx = session.beginTransaction();
    
    //        第五步 写具体逻辑 crud操作
            //添加功能
            User user = new User();
            user.setUsername("Jack");
            user.setPassword("123456");
            user.setAddress("myaddress");
            //调用session的方法实现添加
            session.save(user);
            
    //        第六步 提交事务
            tx.commit();
    
    //        第七步 关闭资源
            session.close();
            sessionFactory.close();
    }

    封装和框架

    对于SessionFactory,一个项目适宜只有一个对象。Session对象只可以本线程使用。可以如下封装

    此时配置中需要设置

    <property name="hibernate.current_session_context_class">thread</property>
    public class HibernateUtils {
    
        static Configuration cfg = null;
        static SessionFactory sessionFactory = null;
        //静态代码块实现
        static {
            //加载核心配置文件
            cfg = new Configuration();
            cfg.configure();
            sessionFactory = cfg.buildSessionFactory();
        }
        
        //提供返回与本地线程绑定的session的方法
        public static Session getSessionobject() {
            return sessionFactory.getCurrentSession();
        }
        
        //提供方法返回sessionFactory
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    }

    对于事务的操作框架,代码如下

    try {
      开启事务
      提交事务
    }catch() {
      回滚事务
    }finally {
      关闭
    }
    SessionFactory sf=HibernateUtils.getSessionFactory();
            Session session=sf.openSession();
            Transaction tx=session.beginTransaction();
            try {
                //具体操作
                tx.commit();
            }catch(Exception ex) {
                tx.rollback();
            }finally {
                session.close();
            }

    基于实体类对象的增删改查

    有错误都会抛出异常

    //获取session对象,事务对象
    
    //增加(插入)
    User u=new User();
    u.setUsername("jack");
    u.setPassword("123");
    ..
    session.save(u);
    
    //查询
    //使用session的get方法,第一参数是实体类的class,第二个是id
    User u=session.get(User.class,3);
    
    //修改,关键先查询再修改
    User u=session.get(User.class,3);
    u.setName("Tom");
    session.update(u);
    
    
    //删除,先查询,再删除
    User u=session.get(User.class,3);
    session.delete(u);

    Hibernate相关API操作入门

    目标:查询表中所有数据

    1.HQL语句

    Query query =session.createQuery("from User");
    List<User> list=query.list();

    2.Criteria对象

    Criteria c=session.createCriteria(User.class);
    List<User> list=c.list();

    3.SQLQuery对象

    SQLQuery q=session.createSQLQuery("select * from t_user");
    q.addEntity(User.class);
    List<User> list=q.list();
  • 相关阅读:
    如何更改Web Service部署生成的App_Code.dll的名称
    Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器
    驗證類javascript
    多线程下WinForm开发应该注意哪些问题?
    把表从Access2007导出到Sql Server
    面向对象模型的四种核心技术
    ASP常用代碼二
    熊猫烧香代码
    简繁体互转代码
    上班人员必读:“五险一金”详解!
  • 原文地址:https://www.cnblogs.com/legion/p/9461251.html
Copyright © 2020-2023  润新知