Maison > Java > javaDidacticiel > le corps du texte

hibernate01 : Introduction, construction, détails du fichier de configuration, détails de l'API et exercices CRM : sauver les clients

巴扎黑
Libérer: 2017-06-23 16:34:50
original
1563 Les gens l'ont consulté

Apprentissage d'aujourd'hui : Qu'est-ce que la mise en veille prolongée

1. Qu'est-ce que la mise en veille prolongée

Qu'est-ce que la mise en veille prolongée? framework :

1. Le framework est utilisé pour améliorer l'efficacité du développement

2 Il encapsule certaines fonctions Lorsque nous avons besoin d'utiliser ces fonctions, nous pouvons simplement les appeler. à la mise en œuvre manuelle.

3. Le framework peut donc être compris comme un projet semi-fini tant que vous savez contrôler ces fonctions.

Qu'est-ce que le framework hibernate. :

Avantages de la mise en veille prolongée :

Lors de l'exploitation de la base de données, cela peut être fait de manière orientée objet. Pas besoin d'écrire des instructions SQL

hibernate est un framework ORM :

orm : mappage relationnel d'objet

ORM est divisé en 4 niveaux :

hibernate appartient au niveau 4 : base de données d'opérations entièrement orientée objet

mybatis appartient au niveau 2

dbutils appartient au niveau 1

2 Construction du framework hibernate

1.

Package de pilotes

2. Créer une base de données, préparer des tables, des entités

3. Écrire les métadonnées ORM (fichier de configuration de mappage d'objets et de tables)

4. (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><!-- 
        #hibernate.dialect org.hibernate.dialect.MySQLDialect
        #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
        #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
        #hibernate.connection.driver_class com.mysql.jdbc.Driver
        #hibernate.connection.url jdbc:mysql:///test
        #hibernate.connection.username gavin
        #hibernate.connection.password         --> <!-- 数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库url --><property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property> <!-- 数据库连接用户名 --><property name="hibernate.connection.username">root</property> <!-- 数据库连接密码 --><property name="hibernate.connection.password">1234</property><!-- 数据库方言
            不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
            sql99标准: DDL 定义语言  库表的增删改查
                      DCL 控制语言  事务 权限
                      DML 操纵语言  增删改查
            注意: MYSQL在选择方言时,请选择最短的方言.         --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- #hibernate.show_sql true 
             #hibernate.format_sql true--><!-- 将hibernate生成的sql语句打印到控制台 --><property name="hibernate.show_sql">true</property><!-- 将hibernate生成的sql语句格式化(语法缩进) --><property name="hibernate.format_sql">true</property><!-- 
        ## auto schema export  自动导出表结构. 自动建表
        #hibernate.hbm2ddl.auto create        自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
        #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
        #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
        #hibernate.hbm2ddl.auto validate    校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.         --><property name="hibernate.hbm2ddl.auto">update</property><!-- 引入orm元数据
            路径书写: 填写src下的路径         --><mapping resource="cn/itheima/domain/Customer.hbm.xml" /></session-factory></hibernate-configuration>
Copier après la connexion
5. Écrire des tests de code

//测试Hibernate框架public class Demo {
    

    @Test//保存客户public void fun1(){
        Configuration conf = new Configuration().configure();
        
        SessionFactory sessionFactory = conf.buildSessionFactory();
        
        Session session = sessionFactory.openSession();
    
        Transaction tx = session.beginTransaction();//----------------------------------------------Customer c = new Customer();
        c.setCust_name("google公司");
        
        session.save(c);//执行保存        //----------------------------------------------        tx.commit();
        session.close();
        sessionFactory.close();
    }
}
Copier après la connexion

3. Explication détaillée des fichiers de configuration

métadonnées orm

<?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">
   <!-- 配置表与实体对象的关系 -->
   <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. --><hibernate-mapping package="cn.itheima.domain" ><!-- 
        class元素: 配置实体与表的对应关系的
            name: 完整类名
            table:数据库表名     --><class name="Customer" table="cst_customer" ><!-- id元素:配置主键映射的属性
                name: 填写主键对应属性名
                column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
                type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                        每个类型有三种填法: java类型|hibernate类型|数据库类型
                not-null(可选):配置该属性(列)是否不能为空. 默认值:false
                length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度         --><id name="cust_id"  ><!-- generator:主键生成策略(明天讲) --><generator class="native"></generator></id><!-- property元素:除id之外的普通属性映射
                name: 填写属性名
                column(可选): 填写列名
                type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                        每个类型有三种填法: java类型|hibernate类型|数据库类型
                not-null(可选):配置该属性(列)是否不能为空. 默认值:false
                length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度         --><property name="cust_name" column="cust_name" ><!--  <column name="cust_name" sql-type="varchar" ></column> --></property><property name="cust_source" column="cust_source" ></property><property name="cust_industry" column="cust_industry" ></property><property name="cust_level" column="cust_level" ></property><property name="cust_linkman" column="cust_linkman" ></property><property name="cust_phone" column="cust_phone" ></property><property name="cust_mobile" column="cust_mobile" ></property></class></hibernate-mapping>
Copier après la connexion
Configuration principale d'hibernation :

Configuration des attributs requis (5)

 <!-- 数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库url --><property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property> <!-- 数据库连接用户名 --><property name="hibernate.connection.username">root</property> <!-- 数据库连接密码 --><property name="hibernate.connection.password">1234</property><!-- 数据库方言
            不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
            sql99标准: DDL 定义语言  库表的增删改查
                      DCL 控制语言  事务 权限
                      DML 操纵语言  增删改查
            注意: MYSQL在选择方言时,请选择最短的方言.         --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
Copier après la connexion
Configuration des attributs optionnels (3)

<!-- #hibernate.show_sql true 
             #hibernate.format_sql true--><!-- 将hibernate生成的sql语句打印到控制台 --><property name="hibernate.show_sql">true</property><!-- 将hibernate生成的sql语句格式化(语法缩进) --><property name="hibernate.format_sql">true</property><!-- 
        ## auto schema export  自动导出表结构. 自动建表
        #hibernate.hbm2ddl.auto create        自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
        #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
        #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
        #hibernate.hbm2ddl.auto validate    校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.         --><property name="hibernate.hbm2ddl.auto">update</property>
Copier après la connexion

Configuration de l'importation des métadonnées

        <!-- 引入orm元数据
            路径书写: 填写src下的路径         --><mapping resource="cn/itheima/domain/Customer.hbm.xml" />
Copier après la connexion
4 .Explication détaillée de hibernateAPI

Objet Learn Configuration

//学习Configuration对象// Configuration功能: 配置加载类.用于加载主配置,orm元数据加载public class Demo {

    @Testpublic void fun1(){//1 创建,调用空参构造Configuration conf = new Configuration();//2 读取指定主配置文件 => 空参加载方法,加载src下的hibernate.cfg.xml文件        conf.configure();//3 读取指定orm元数据(扩展),如果主配置中已经引入映射配置.不需要手动加载//conf.addResource(resourceName);//conf.addClass(persistentClass);        //4 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();
        
    }
}
Copier après la connexion
Objet Learn SessionFactory

//学习SessionFactory对象// SessionFactory功能: 用于创建操作数据库核心对象session对象的工厂.//                     简单说功能就一个---创建session对象//注意:1.sessionfactory 负责保存和使用所有配置信息.消耗内存资源非常大.//      2.sessionFactory属于线程安全的对象设计.//结论: 保证在web项目中,只创建一个sessionFactory.public class Demo2 {

    @Testpublic void fun1(){//1 创建,调用空参构造Configuration conf = new Configuration();//2 读取指定主配置文件 => 空参加载方法,加载src下的hibernate.cfg.xml文件        conf.configure();//3 读取指定orm元数据(扩展),如果主配置中已经引入映射配置.不需要手动加载//conf.addResource(resourceName);//conf.addClass(persistentClass);        //4 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//--------------------------------------------------//5 获得session//打开一个新的session对象        sf.openSession();//获得一个与线程绑定的session对象(明天讲解)        sf.getCurrentSession();
    }
}
Copier après la connexion
. Objet Session d'apprentissage : ajouter, supprimer, vérifier et modifier

//学习Session对象//session对象功能: 表达hibernate框架与数据库之间的连接(会话).session类似于//                JDBC年代的connection对象. 还可以完成对数据库中数据的增删改查操作.//                session是hibernate操作数据库的核心对象public class Demo3 {

    @Test//事务操作public void fun1(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------        
        //----------------------------------------------tx2.commit();//提交事务tx2.rollback();//回滚事务session.close();//释放资源sf.close();//释放资源    }
    
    @Test//session的新增public void fun2(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------Customer c = new Customer();
        c.setCust_name("传智播客");
        
        session.save(c);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源    }
    @Test//session的查询//查询id为1的customer对象public void fun3(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------        
        Customer customer = session.get(Customer.class, 1l);
        
        System.out.println(customer);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源    }
    @Test//session的修改//修改id为1的customer对象的name属性为黑马程序员public void fun4(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------//1 获得要修改的对象Customer c = session.get(Customer.class, 1l);//2 修改c.setCust_name("黑马程序员");//3 执行update        session.update(c);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源    }
    @Test//session的删除//删除id为1的customer对象public void fun5(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象Transaction tx = session.getTransaction();
        tx.begin();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------//1 获得要修改的对象Customer c = session.get(Customer.class, 1l);//2 调用delete删除对象        session.delete(c);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源    }
}
Copier après la connexion

5. Exercice : Sauvegarder les clients

Référez-vous aux notes précédentes pour les étapes précédentes.

5. Analyse des idées

Avant de terminer les devoirs, vous pouvez écrire une classe d'outils facile à utiliser pour éviter le code répété :

public class HibernateUtils {private static SessionFactory sf;    static{//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象 sf = conf.buildSessionFactory();
    }    //获得session => 获得全新sessionpublic static Session openSession(){//3 获得sessionSession session = sf.openSession();                return session;
        
    }//获得session => 获得与线程绑定的sessionpublic static Session getCurrentSession(){//3 获得sessionSession session = sf.getCurrentSession();        return session;
    }public static void main(String[] args) {
        System.out.println(HibernateUtils.openSession());
    }
    
}
Copier après la connexion
Code de fonctionnement de base :

couche Web :

/**
 * Servlet implementation class AddCustomerServlet */public class AddCustomerServlet extends HttpServlet {private static final long serialVersionUID = 1L;    private CustomerService customerService  = new CustomerServiceImpl();protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 获得参数并封装到Customer对象Customer c = new Customer();try {
            BeanUtils.populate(c, request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }//2 调用Service保存客户        customerService.save(c);//3 重定向到客户列表response.sendRedirect(request.getContextPath()+"/ListCustomerServlet");
    }protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
Copier après la connexion
couche de service :

public class CustomerServiceImpl implements CustomerService {private CustomerDao customerDao = new CustomerDaoImpl();public void save(Customer c) {//调用Dao保存客户        customerDao .save(c);
    }

}
Copier après la connexion
couche dao :

public class CustomerDaoImpl implements CustomerDao {public void save(Customer c) {//1 获得sessionSession session = HibernateUtils.openSession();//2 打开事务Transaction tx = session.beginTransaction();//3 执行保存        session.save(c);//4 提交事务        tx.commit();//5 关闭资源        session.close();
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal