zoukankan      html  css  js  c++  java
  • hibernate的配置

    hibernate 是一种ORM框架,是ORM框架中一个典范 ORM叫做对象关系映射
    是面向对象语言和关系型数据库之间的映射关系
    所以只有在面向对象语言或者关系型数据库没用的时候ORM才会消失

    ORM为我们做什么

      减少乏味的代码
      更加面向对象的设计
      更好的性能
      更好的移植性

    使用Hibernate  http://hibernate.org/ 

    1. 加入Hibernate的jar包

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

    2. 创建持久化类(pojo)

      就是以前的实体类

    3. 创建映射文件(xxx.hbm.xml)

    pojo->xxx.hbm.xml->table表示一个实体类于一张表的映射关系文件
    在pojo包里新建User.hbm.xml文件,和类名相同

    <?xml version="1.0" encoding="UTF-8"?>
        <!-- 展开jar包有个hibernate-mapping-3.0.dtd,拷贝这几行dtd -->
        <!DOCTYPE hibernate-mapping PUBLIC 
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
            <!-- 根节点叫做hibernate-mapping,package表示User所在的包名
                子节点的class,name属性写类名,package和name组成一个完全限定名
                所以不写package的时候name属性要写完全限定名,table写表名---->
        <hibernate-mapping package="com.kaishengit.pojo">
            
            <class name="User" table="user">
            <!-- pojo中的属性要对应表里面的列 -->
                <!-- id这个节点是主键列,name写属性的名字,column
                    是表中列的名字,作为主键还要有生成策略
                        generator class="native"native表示自动增长-->
                <id name="id" column="id">
                    <generator class="native"/>
                </id>
                <!-- 剩下普通列和属性的对应,当name和column相同的时候可以只
                写name-->
                <property name="username"/>
                <property name="password" column="password"/>
                
            </class>
        </hibernate-mapping>

    4. 创建Hibernate配置文件(hibernate.cfg.xml)总配置文件
    建在根目录下

        <?xml version="1.0" encoding="UTF-8"?>
        <!-- 打开jar包中的hibernate-configuration-3.0.dtd,复制这几行dtd -->
        <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
        <hibernate-configuration>
            <!-- 这个session和http中的session没有关系  -->
            <!--hibernate-release-4.1.1.Finalhibernate-release-4.1.1.Finalprojectetc的hibernate.properties -->
            <session-factory>
                <!-- 以hibernate.开头的可以省略hibernate. -->
                <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
                <property name="connection.url">jdbc:mysql:///hibernate</property>
                <property name="connection.username">root</property>
                <property name="connection.password">root</property>
                
                <!-- 方言(较好的移植性) -->
                <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
                
                <!-- c3p0数据源(以前用的dbcp) 
                    需要pom中导入这两个jar包
                    <dependency>
                        <groupId>c3p0</groupId>
                        <artifactId>c3p0</artifactId>
                        <version>0.9.1</version>
                    </dependency>
                    <dependency>
                        <groupId>org.hibernate</groupId>
                        <artifactId>hibernate-c3p0</artifactId>
                        <version>4.2.0.Final</version>
                    </dependency>-->
                <property name="c3p0.max_size">10</property>
                <property name="c3p0.min_size">2</property>
                <property name="c3p0.timeout">5000</property>
                <property name="c3p0.max_statements">100</property>
                <property name="c3p0.idle_test_period">3000</property>
                <property name="c3p0.acquire_increment">2</property>
                <property name="c3p0.validate">false</property>
                
                <!-- 执行的时候能看到sql语言 -->
                <property name="show_sql">true</property>
                <!-- 把session放到当前线程里 比如放在main方法中就是放在主线程里,使用的
                时候就可以获得session.-->
                <property name="current_session_context_class">thread</property>
                <!-- 表明映射文件的位置 -->
                <mapping resource="com/kaishengit/pojo/User.hbm.xml"/>
                
                    
            </session-factory>
                
        </hibernate-configuration>

    5. 运行

    Hibernate对pojo的要求:
    1属性要有对应的get和set方法
    2要有无参数的默认构造方法
    3 不要使用final进行修饰

        //configure()才会去读取hibernate,cfg.xml  
        Configuration cfg = new Configuration().configure();
        ServiceRegistry serviceRegistry= new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
        /* 最终是为了创建sessionfactory,这是4.0  3.0的hibernate只需要
            Configuration cfg = new Configuration().configure();
        SessionFactory sessionFactory = cfg.buildSessionFactory();*/
        Session session = sessionFactory.getCurrentSession();
        
        
        /* 增删改查都在事务中完成 session.beginTransaction();
        session.getTransaction().commit();或者
        session.getTransaction().rollback();*/
        session.beginTransaction();
        
        User user = new User();
        user.setUsername("jack");
        user.setPassword("123");
        
        session.save(user);
        
        session.getTransaction().commit();
    /*或者Transaction tran = session.beginTransaction();
        tran.commit();*/
        
        

    应该只有一个sessionfactory而且读取配置文件
    Configuration cfg = new Configuration().configure();应该也只读一次
    所以写成单例模式

    public class HibernateUtil {
        // 静态只读一次 
        private static SessionFactory factory = buildSessionFactory();
    
        private static SessionFactory buildSessionFactory() {
            Configuration cfg = new Configuration().configure();
            ServiceRegistry serviceRegistry= new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
            return cfg.buildSessionFactory(serviceRegistry);
        }
        //提供获取sessionfactory方法
        public static SessionFactory getSessionFactory() {
            return factory;
        }
        // 提供获取session的方法 
        public static Session getSession() {
            return getSessionFactory().getCurrentSession();
        }
        
        
    }

    test中

    public class Test {
    
        public static void main(String[] args) {
    //添加 
            User user = new User();
            user.setUsername("tom");
            user.setPassword("000000");
            
            Session session = HibernateUtil.getSession();
            session.beginTransaction();
            // 保存要放在事务中 
            session.save(user);
            session.getTransaction().commit();
            
            
            
            
    // 查询 
            Session session = HibernateUtil.getSession();
            session.beginTransaction();
            // 要放在事务中 ,根据主键查询
            User user = (User) session.get(User.class, 1);
            System.out.println(user.getUsername());
            session.getTransaction().commit();
            
    // 删除
    
            Session session = HibernateUtil.getSession();
            session.beginTransaction();
            // 要放在事务中 ,查出来才能删,会输出两条sql语句
            User user = (User) session.get(User.class, 2);
            session.delete(user);
            session.getTransaction().commit();
    
    
    
    //修改 
    
            Session session = HibernateUtil.getSession();
            session.beginTransaction();
            // 要放在事务中 查出来才能修改
            User user = (User) session.get(User.class, 1);
            //只有当set的值跟以前不一样才回去执行update修改
            user.setUsername("jack");
            session.getTransaction().commit();
    
    
    // 查询所有 
            Session session = HibernateUtil.getSession();
            String hql = "from User";// User是类名,不是表名,要切记 
            Query query = session.createQuery(hql);
            List<User> userList = query.list();
            for(User user : userList) {
                System.out.println(user.getUsername() + " : " + user.getPassword());
            }
            
            
            
            
            
            
        }
    }
  • 相关阅读:
    1.7 Matrix Zero
    1.6 Image Rotation
    Snake Sequence
    安装 Docker
    开源蓝牙协议栈 BTstack学习笔记
    无法从 repo.msys2.org : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds 获取文件
    KEIL生成预编译文件
    Duff's device
    Pyinstaller : unable to find Qt5Core.dll on PATH
    HCI 获取蓝牙厂商信息
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4462568.html
Copyright © 2011-2022 走看看