• 二、hibernate入门案例


    基础案例-->用第一种开发方式

    1.创建表:

    create table employee(
    
    id int PRIMARY KEY,
    
    name VARCHAR(50) not null,
    
    email VARCHAR(50) not null,
    
    hiredate date not null
    
    );

    创建domain对象(javabean对象/pojo对象),建议domain对象名称就是表名首字母大写,注意属性类型要与数据库层对应。

    private Integer id;
    
    private String name;
    
    private String email;
    
    private Date hireDate;//java.util.Date
    
    public Integer getId() {
    
    return id;
    
    }
    
    public void setId(Integer id) {
    
    this.id = id;
    
    }
    
    public String getName() {
    
    return name;
    
    }
    
    public void setName(String name) {
    
    this.name = name;
    
    }
    
    public String getEmail() {
    
    return email;
    
    }
    
    public void setEmail(String email) {
    
    this.email = email;
    
    }
    
    public Date getHireDate() {
    
    return hireDate;
    
    }
    
    public void setHireDate(Date hireDate) {
    
    this.hireDate = hireDate;
    
    }
    
     

     

     

    2.编写Employee.hbm.xml(DTD从网上下的hibernate开发包里搜User.hbm.xml):

    <?xml version="1.0" encoding="utf-8" ?>
    
    <!DOCTYPE hibernate-mapping PUBLIC
    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
     
    
    <!-- package表示需映射的pojo类所在路径 -->
    
    <hibernate-mapping package="com.myz.domain">
    
    <!-- name表示pojo类名,table表示数据库中的表名,不设置则默认为pojo类名小写 -->
    
    <class name="Employee" table="employee">
    
    <!-- <id>表示这是主键的映射,name表示pojo类中的属性名,column表示数据库表中的属性名 -->
    
    <id name="id" column="id" type="java.lang.Integer">
    
    <!-- generator表示这是主键的增长策略,increment表示自增-->
    
    <generator class="increment"></generator>
    
     
    
    </id>
    
     
    
    <!-- 其他属性的配置,type是可选配置,可以配置java数据类型,也可以配置hibernate数据类型,如果没有配置,hibernate会给一个合适的类型给它,not-null=true表示不能为空,默认也是不能为空的 -->
    
    <property name="name" type="java.lang.String">
    
    <column name="name" not-null="true"></column>
    
    </property>
    
    <property name="email" type="java.lang.String">
    
    <column name="email" not-null="true"></column>
    
    </property>
    
    <property name="hireDate" type="java.util.Date">
    
    <column name="hiredate" not-null="true"></column>
    
    </property>
    
     
    
    </class>
    
    
    </hibernate-mapping>

     

     

    3.编写hibernate.cfg.xml:

    <?xml version='1.0' encoding='utf-8'?>
    
    <!DOCTYPE hibernate-configuration PUBLIC
    
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
     
    
    <hibernate-configuration>
    
    <session-factory>
    
    <!-- 配置数据库信息,模板可以从hibernate-3.2etchibernate.properties下找,针对不同的数据库有不同的模板 -->
    
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    
    <property name="connection.username">root</property>
    
    <property name="connection.password">123456</property>
    
    <property name="connection.url">jdbc:mysql:///user</property>
    
     
    
    <!-- 配置dialect,明确告诉hibernate我们是连接的哪种数据库 ,模板也是从hibernate.properties下找-->
    
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    
     
    
    <!-- 配置对象关系映射文件路径,让hibernate.cfg.xml管理 -->
    
    <mapping resource="com/myz/domain/Employee.hbm.xml"/>
    
     
    
     
    
    </session-factory>
    
    </hibernate-configuration>

     

    4.测试处理业务逻辑

    我们仍然需要将数据库的jar包导入

    导入之后TestMain.java中编写以下代码:

    public static void main(String[] args) {
    
    // TODO Auto-generated method stub
    
    //使用hibernate完成crud操作(这里我们只见对象不见表)
    
     
    
    Configuration configuration=new Configuration().configure();
    
    //1.寻找配置文件,默认寻找hibernate.cfg.xml,并完成初始化
    
    //Configuration configuration=new Configuration().configure("hibernate.cfg.xml");
    
     
    
    //2.创建SessionFactory(会话工厂)
    
    SessionFactory sessionFactory=configuration.buildSessionFactory();
    
     
    
    //3.创建Session,相当于jdbc Connection
    
    Session session=sessionFactory.openSession();
    
     
    
    //对hibernate而言,要求程序员在进行增删改的时候使用事物提交
    
    //4.创建事务
    
    Transaction transaction=session.beginTransaction();
    
     
    
    //5.添加一个雇员
    
     
    
    Employee employee=new Employee();
    
    employee.setId(2);
    
    employee.setName("小红");
    
    employee.setEmail("xiaohong@qq.com");
    
    employee.setHireDate(new Date());
    
     
    
    //6.保存
    
    session.save(employee);
    
     
    
    //7.提交事务
    
    transaction.commit();
    
     
    
    //8.关闭资源
    
    session.close();
    
    }

    5.此时数据库中已经多了一行数据。

    6.其实hibernate.cfg.xml中还有一个属性配置,当我们对数据库操作时候能够显示出对应的sql语句

    <!-- 显示出SQL语句 -->
    
    <property name="show_sql">true</property>

    再重新创建一个雇员提交,此时我们能够在控制台看见SQL语句:

    Hibernate: insert into employee (name, email, hiredate, id) values (?, ?, ?, ?)

    如果希望打出更漂亮的sql语句

    <!-- 显示出更漂亮的sql语句 -->
    
    <property name="format_sql">true</property>

    7.此时我们能够发现hibernate的好处了,当我们需要更换数据库时,我们仅需要更换hibernate.cfg.xml中的配置即可,而至于为什么说hibernate是持久化框架,是hibernate把对象的信息保存到数据库中了,把对象持久化了

    8.我们把main中增加Employee的方法抽取为addEmployee方法,再写一个修改Employee。但是我们发现,好像不必要每次都读取配置文件,每次都创建会话工厂,会话工厂是很占内存空间的,所以我们把它封装到一个类中,保证它是单态的。

    final public class MySessionFactory {
    
    private static SessionFactory sessionFactory=null;
    
     
    
    private MySessionFactory(){
    
     
    
    }
    
    static{
    
    sessionFactory=new Configuration().configure().buildSessionFactory();
    
    }
    
    public static SessionFactory getSessionFactory(){
    
    return sessionFactory;
    
    }
    
     
    
    }

    9.这样我们的修改用户信息就可以这样写

    //1.获取一个对话
    
    Session session=MySessionFactory.getSessionFactory().openSession();
    
    //2.创建事务
    
    Transaction ts=session.beginTransaction();
    
    //3.获取要修改的用户,load方法是通过主键属性获取该对象实例
    
    Employee emp=(Employee) session.load(Employee.class, 1);
    
    //4.修改信息
    
    emp.setName("小小名");
    
    //5提交事务.
    
    ts.commit();
    
    //6.关闭会话
    
    session.close();

    //产生了以下的SQL语句:

    Hibernate: select employee0_.id as id0_0_, employee0_.name as name0_0_, employee0_.email as email0_0_, employee0_.hiredate as hiredate0_0_ from employee employee0_ where employee0_.id=?
    
    Hibernate: update employee set name=?, email=?, hiredate=? where id=?

    //此时数据库端已经被修改

    10.删除数据

    //1.获取一个session
    
    Session session=MySessionFactory.getSessionFactory().openSession();
    
    //2.创建事务
    
    Transaction ts=session.beginTransaction();
    
    //3.获取对象
    
    Employee emp=(Employee) session.load(Employee.class, 2);
    
    //4.删除对象
    
    session.delete(emp);
    
    //5.提交事务
    
    ts.commit();
    
    //6.关闭session
    
    session.close();

    产生SQL语句:

    Hibernate: select employee0_.id as id0_0_, employee0_.name as name0_0_, employee0_.email as email0_0_, employee0_.hiredate as hiredate0_0_ from employee employee0_ where employee0_.id=?
    
    Hibernate: delete from employee where id=?

                                                                                                                                               

    11.查询

    由于我们查询不可能只根据主键来查询,涉及到hql语句,所以我们稍后讲。

  • 相关阅读:
    用带缓冲区的文件流FileStream来实现大文件的拷贝
    委托与事件、匿名方法与Lambda表达式
    C#基础点记录
    C#基础知识06
    用while语句实现用户登陆程序
    TSQL检索电话呼叫员的工作流水信息
    委托
    类型转换、异常、String知识总结
    内网入库单管理系统
    用C#打印出正等腰三角形
  • 原文地址:https://www.cnblogs.com/myz666/p/8423428.html
Copyright © 2020-2023  润新知