基础案例-->用第一种开发方式
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语句,所以我们稍后讲。