二、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语句,所以我们稍后讲。

原文地址:https://www.cnblogs.com/myz666/p/8423428.html